diff options
340 files changed, 46710 insertions, 2047 deletions
diff --git a/MAINTAINERS b/MAINTAINERS index c8c154f557..2a0cd1e6e4 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -243,6 +243,10 @@ Mail: shanevolpe@gmail.com Machines: logicpd-pxa270, at91-l9260 Recipes: directfb, php +Person: Steffen Sledz +Mail: sledz@dresearch.de +Machines: oxnas + Person: Stelios Koroneos Mail: skoroneos@digital-opsis.com Website: http://www.digital-opsis.com diff --git a/classes/icecc.bbclass b/classes/icecc.bbclass index 7222f6b349..dce29fbbeb 100644 --- a/classes/icecc.bbclass +++ b/classes/icecc.bbclass @@ -83,13 +83,15 @@ def create_cross_env(bb,d): #check if user has specified a specific icecc-create-env script #if not use the OE provided one - cr_env_script = bb.data.getVar('ICECC_ENV_EXEC', d) or bb.data.expand('${STAGING_DIR}', d)+"/ice/icecc-create-env" + cr_env_script = bb.data.expand('${ICECC_ENV_EXEC}', d) + if cr_env_script == "${ICECC_ENV_EXEC}": + cr_env_script = bb.data.expand('${STAGING_DIR}', d)+"/ice/icecc-create-env" #call the modified create-env script result=os.popen("%s %s %s %s %s %s" %(cr_env_script, "--silent", - os.path.join(ice_dir,target_sys,'bin','gcc'), - os.path.join(ice_dir,target_sys,'bin','g++'), - os.path.join(ice_dir,target_sys,'bin','as'), + os.path.join(ice_dir, 'bin', "%s-gcc" % target_sys), + os.path.join(ice_dir, 'bin', "%s-g++" % target_sys), + os.path.join(ice_dir, 'bin', "%s-as" % target_sys), os.path.join(ice_dir,"ice",cross_name) ) ) return tar_file @@ -121,7 +123,9 @@ def create_native_env(bb,d): #check if user has specified a specific icecc-create-env script #if not use the OE provided one - cr_env_script = bb.data.getVar('ICECC_ENV_EXEC', d) or bb.data.expand('${STAGING_DIR}', d)+"/ice/icecc-create-env" + cr_env_script = bb.data.expand('${ICECC_ENV_EXEC}', d) + if cr_env_script == "${ICECC_ENV_EXEC}": + cr_env_script = bb.data.expand('${STAGING_DIR}', d)+"/ice/icecc-create-env" result=os.popen("%s %s %s %s %s %s" %(cr_env_script, "--silent", os.popen("%s gcc" % "which").read()[:-1], @@ -290,9 +294,9 @@ def check_for_kernel(bb,d): set_icecc_env() { - ICECC_PATH=${@icc_path(bb,d)} - if test x${ICECC_PATH} != x; then - export PATH=${ICECC_PATH}$PATH + ICE_PATH=${@icc_path(bb,d)} + if test x${ICE_PATH} != x; then + export PATH=${ICE_PATH}$PATH export CCACHE_PATH=$PATH #check if we are building a kernel and select gcc-cross-kernel if [ "${@check_for_kernel(bb,d)}" = "yes" ]; then diff --git a/classes/module-base.bbclass b/classes/module-base.bbclass index c98baceeab..185803ebba 100644 --- a/classes/module-base.bbclass +++ b/classes/module-base.bbclass @@ -7,7 +7,7 @@ export CROSS_COMPILE = "${TARGET_PREFIX}" export KERNEL_VERSION = "${@base_read_file('${STAGING_KERNEL_DIR}/kernel-abiversion')}" export KERNEL_SOURCE = "${@base_read_file('${STAGING_KERNEL_DIR}/kernel-source')}" -KERNEL_OBJECT_SUFFIX = "${@[".o", ".ko"][base_read_file('${STAGING_KERNEL_DIR}/kernel-abiversion') > "2.6.0"]}" +KERNEL_OBJECT_SUFFIX = "${@[".o", ".ko"][base_read_file('${STAGING_KERNEL_DIR}/kernel-abiversion') < "2.6.0"]}" KERNEL_CCSUFFIX = "${@base_read_file('${STAGING_KERNEL_DIR}/kernel-ccsuffix')}" KERNEL_LDSUFFIX = "${@base_read_file('${STAGING_KERNEL_DIR}/kernel-ldsuffix')}" KERNEL_ARSUFFIX = "${@base_read_file('${STAGING_KERNEL_DIR}/kernel-arsuffix')}" diff --git a/classes/module_strip.bbclass b/classes/module_strip.bbclass index 63e6569799..3316e20c80 100644 --- a/classes/module_strip.bbclass +++ b/classes/module_strip.bbclass @@ -3,7 +3,11 @@ do_strip_modules () { for p in ${PACKAGES}; do if test -e ${WORKDIR}/install/$p/lib/modules; then - modules="`find ${WORKDIR}/install/$p/lib/modules -name \*${KERNEL_OBJECT_SUFFIX}`" + if [ "${KERNEL_MAJOR_VERSION}" == "2.6" ]; then + modules="`find ${WORKDIR}/install/$p/lib/modules -name \*.ko`" + else + modules="`find ${WORKDIR}/install/$p/lib/modules -name \*.o`" + fi if [ -n "$modules" ]; then for module in $modules ; do if ! [ -d "$module" ] ; then diff --git a/classes/package.bbclass b/classes/package.bbclass index a7cdb5f2d5..55595928c6 100644 --- a/classes/package.bbclass +++ b/classes/package.bbclass @@ -293,16 +293,6 @@ python package_do_split_locales() { bb.data.setVar('DESCRIPTION_' + pkg, '%s translation for %s' % (l, pn), d) bb.data.setVar('PACKAGES', ' '.join(packages), d) - - # Disabled by RP 18/06/07 - # Wildcards aren't supported in debian - # They break with ipkg since glibc-locale* will mean that - # glibc-localedata-translit* won't install as a dependency - # for some other package which breaks meta-toolchain - # Probably breaks since virtual-locale- isn't provided anywhere - #rdep = (bb.data.getVar('RDEPENDS_%s' % mainpkg, d, 1) or bb.data.getVar('RDEPENDS', d, 1) or "").split() - #rdep.append('%s-locale*' % pn) - #bb.data.setVar('RDEPENDS_%s' % mainpkg, ' '.join(rdep), d) } python populate_packages () { diff --git a/classes/package_ipk.bbclass b/classes/package_ipk.bbclass index 3a977291ff..89d5071c09 100644 --- a/classes/package_ipk.bbclass +++ b/classes/package_ipk.bbclass @@ -244,6 +244,10 @@ python do_package_ipk () { rprovides = (bb.data.getVar("RPROVIDES", localdata, 1) or "").split() rreplaces = (bb.data.getVar("RREPLACES", localdata, 1) or "").split() rconflicts = (bb.data.getVar("RCONFLICTS", localdata, 1) or "").split() + + if not '-locale-' and not '-dbg' and not '-dev' in pkgname: + rdepends.append('%s-locale*' % pkgname) + if rdepends: ctrlfile.write("Depends: %s\n" % ", ".join(rdepends)) if rsuggests: diff --git a/classes/sanity.bbclass b/classes/sanity.bbclass index da3e630445..29624c3f78 100644 --- a/classes/sanity.bbclass +++ b/classes/sanity.bbclass @@ -112,8 +112,11 @@ def check_sanity(e): missing = missing.rstrip(',') messages = messages + "Please install following missing utilities: %s\n" % missing - if os.path.basename(os.readlink('/bin/sh')) == 'dash': - messages = messages + "Using dash as /bin/sh causes various subtle build problems, please use bash instead.\n" + try: + if os.path.basename(os.readlink('/bin/sh')) == 'dash': + messages = messages + "Using dash as /bin/sh causes various subtle build problems, please use bash instead.\n" + except: + pass omask = os.umask(022) if omask & 0755: diff --git a/conf/bitbake.conf b/conf/bitbake.conf index 81d4c93dc0..9aefb63172 100644 --- a/conf/bitbake.conf +++ b/conf/bitbake.conf @@ -314,6 +314,8 @@ IMAGE_NAME = "${IMAGE_BASENAME}-${MACHINE}-${DATETIME}" IMAGE_LINK_NAME = "${IMAGE_BASENAME}-${MACHINE}" IMAGE_EXTRA_SPACE = 10240 +UBI_VOLNAME ?= "${MACHINE}-rootfs" + IMAGE_CMD = "" IMAGE_CMD_jffs2 = "mkfs.jffs2 -x lzo --root=${IMAGE_ROOTFS} --faketime --output=${DEPLOY_DIR_IMAGE}/${IMAGE_NAME}.rootfs.jffs2 ${EXTRA_IMAGECMD}" IMAGE_CMD_yaffs2 = "mkyaffs2image ${EXTRA_IMAGECMD} ${IMAGE_ROOTFS} ${DEPLOY_DIR_IMAGE}/${IMAGE_NAME}.rootfs.yaffs2" @@ -329,7 +331,8 @@ IMAGE_CMD_tar.gz = "cd ${IMAGE_ROOTFS} && tar -zcvf ${DEPLOY_DIR_IMAGE}/${IMAGE_ IMAGE_CMD_tar.bz2 = "cd ${IMAGE_ROOTFS} && tar -jcvf ${DEPLOY_DIR_IMAGE}/${IMAGE_NAME}.rootfs.tar.bz2 ." IMAGE_CMD_cpio = "cd ${IMAGE_ROOTFS} && (find . | cpio -o -H newc >${DEPLOY_DIR_IMAGE}/${IMAGE_NAME}.rootfs.cpio) ${EXTRA_IMAGECMD}" IMAGE_CMD_cpio.gz = "cd ${IMAGE_ROOTFS} && (find . | cpio -o -H newc | gzip -c -9 >${DEPLOY_DIR_IMAGE}/${IMAGE_NAME}.rootfs.cpio.gz) ${EXTRA_IMAGECMD}" -IMAGE_CMD_ubifs = "mkfs.ubifs -r ${IMAGE_ROOTFS} -o ${DEPLOY_DIR_IMAGE}/${IMAGE_NAME}.ubifs.img" +IMAGE_CMD_ubi = "echo \[ubifs\] > ubinize.cfg ; echo mode=ubi >> ubinize.cfg ; echo image=${DEPLOY_DIR_IMAGE}/${IMAGE_NAME}.rootfs.ubifs >> ubinize.cfg ; echo vol_id=0 >> ubinize.cfg ; echo vol_type=dynamic >> ubinize.cfg ; echo vol_name=${UBI_VOLNAME} >> ubinize.cfg ; echo vol_flags=autoresize >> ubinize.cfg;mkfs.ubifs -r ${IMAGE_ROOTFS} -o ${DEPLOY_DIR_IMAGE}/${IMAGE_NAME}.rootfs.ubifs ${MKUBIFS_ARGS} && ubinize -o ${DEPLOY_DIR_IMAGE}/${IMAGE_NAME}.rootfs.ubi ${UBINIZE_ARGS} ubinize.cfg" +IMAGE_CMD_ubifs = "mkfs.ubifs -r ${IMAGE_ROOTFS} -o ${DEPLOY_DIR_IMAGE}/${IMAGE_NAME}.ubifs.img ${MKUBIFS_ARGS}" EXTRA_IMAGECMD = "" EXTRA_IMAGECMD_jffs2 = "" @@ -338,6 +341,7 @@ EXTRA_IMAGECMD_squashfs = "" EXTRA_IMAGECMD_squashfs-lzma = "" EXTRA_IMAGECMD_cpio = "" EXTRA_IMAGECMD_cpio.gz = "" +EXTRA_IMAGECMD_ubi = "" EXTRA_IMAGECMD_ubifs = "" IMAGE_DEPENDS = "" @@ -350,6 +354,7 @@ IMAGE_DEPENDS_ext3 = "genext2fs-native e2fsprogs-native" IMAGE_DEPENDS_ext3.gz = "genext2fs-native e2fsprogs-native" IMAGE_DEPENDS_squashfs = "squashfs-tools-native" IMAGE_DEPENDS_squashfs-lzma = "squashfs-lzma-tools-native" +IMAGE_DEPENDS_ubi = "mtd-utils-native" IMAGE_DEPENDS_ubifs = "mtd-utils-native" EXTRA_IMAGEDEPENDS = "" @@ -494,6 +499,7 @@ FREESMARTPHONE_GIT = "git://git.freesmartphone.org" GENTOO_MIRROR = "http://distro.ibiblio.org/pub/linux/distributions/gentoo/distfiles" APACHE_MIRROR = "http://www.apache.org/dist" KERNELORG_MIRROR = "http://kernel.org" +ADOBE_MIRROR = "http://fpdownload.macromedia.com/get/flashplayer/current/" # You can use the mirror of your country to get faster downloads by putting # export DEBIAN_MIRROR = "ftp://ftp.de.debian.org/debian/pool" @@ -571,6 +577,8 @@ export PKG_CONFIG_PATH = "${PKG_CONFIG_DIR}:${STAGING_DATADIR}/pkgconfig" export PKG_CONFIG_SYSROOT_DIR = "${STAGING_DIR}/${BASE_PACKAGE_ARCH}${TARGET_VENDOR}-${TARGET_OS}" export PKG_CONFIG_DISABLE_UNINSTALLED = "yes" +export XDG_DATA_DIRS = "${STAGING_DATADIR}" + export QMAKE_MKSPEC_PATH = "${STAGING_DATADIR_NATIVE}/qmake" export STAGING_SIPDIR = "${STAGING_DATADIR_NATIVE}/sip" export STAGING_IDLDIR = "${STAGING_DATADIR}/idl" diff --git a/conf/checksums.ini b/conf/checksums.ini index 3d71cae95f..b306034305 100644 --- a/conf/checksums.ini +++ b/conf/checksums.ini @@ -150,10 +150,22 @@ sha256=dde5d254cd00e4182680b1241e9a5feebbc9b4887f5d0bac2ba2935f213c97e7 md5=dac0f6c217437819f620da18a97d505f sha256=ec9ba2f4ac57fea244639d3ddcdcb0307a4130b250a2b7f3b3ef416aaa5cdb53 +[http://search.cpan.org/CPAN/authors/id/C/CA/CAPTTOFU/DBD-mysql-4.010.tar.gz] +md5=a63c9f73afef70b6c80d899424b003e9 +sha256=7068295a5e35ed7dcf20446bee6d80a8de8ba7af5eb5fa35c0b60135c3445c2f + +[http://search.cpan.org/CPAN/authors/id/T/TI/TIMB/DBI-1.607.tar.gz] +md5=bd5785b39675213948a61dea1b400012 +sha256=7090a1e6a0d13be2f7e27a724351c61e44ffa5d165a7720bfe505aa2c4d47e14 + [http://search.cpan.org/CPAN/authors/id/R/RJ/RJBS/Data-OptList-0.101.tar.gz] md5=6e9bb994a8716112a78c1306261f4164 sha256=a96fb122261fb5f069341d7e69dcf07a2988da7cfd8df65d50843b8b102fb55c +[http://search.cpan.org/CPAN/authors/id/S/SB/SBECK/Date-Manip-5.54.tar.gz] +md5=16c343329bad644b17f4f8ec5fb243cf +sha256=b61f4f0e3e580723ca7f5c0e1952922c101875535bff04afd772fbd3f193e22a + [http://search.cpan.org/CPAN/authors/id/D/DR/DROLSKY/Devel-StackTrace-1.13.tar.gz] md5=35d85c3f2c91c1de389b13436659551a sha256=fe044ec9817a31f2b76f701b2cfd980809676943a901ba3d49200162807fa1f9 @@ -214,6 +226,10 @@ sha256=4c780b9e2906944ce02a9325b15f480d2bd4c0b12137f752aa4800c0f8563acf md5=3bf4d8d285591a5b7f31170f9b87aba0 sha256=c196988f55fc6633d9f9f6d9ddc2ae9b4dfa1f300edf4cbbad865c06a8656df7 +[http://search.cpan.org/CPAN/authors/id/R/RJ/RJBS/Email-Date-Format-1.002.tar.gz] +md5=7ae25275da6ab272aa8b40141eac9f82 +sha256=0c7f3636dffa5ff151f6906baa17582c2efeb29109750f40f820fe5d2dc38e84 + [http://divmod.org/trac/attachment/wiki/SoftwareReleases/Epsilon-0.5.11.tar.gz?format=raw] md5=39710dfdeb42e51c953b17b6cded163e sha256=a5907a3b7584d63be30b3f79b0422b2b0778e73c053be9ac5a11004f1c9097dc @@ -294,6 +310,14 @@ sha256=5673927f18790511f2a01004a51110e167f7950e7accf9e1bc6832a4bfed4feb md5=c09f77e2af500b51d22e0238c0534994 sha256=01c75ebc523b77b88d5754fa93a283eeff77bcf799536db8697b61daf42f36bd +[http://search.cpan.org/CPAN/authors/id/G/GA/GAAS/HTML-Parser-3.60.tar.gz] +md5=fb97ea7e5bd832b079d8660732f9d8d9 +sha256=0f1365a546e8c54faf5e17c5d011d0b9db8784568fb6b03522ab558ad39d9a63 + +[http://search.cpan.org/CPAN/authors/id/P/PE/PETDANCE/HTML-Tagset-3.20.tar.gz] +md5=d2bfa18fe1904df7f683e96611e87437 +sha256=adb17dac9e36cd011f5243881c9739417fd102fce760f8de4e9be4c7131108e2 + [http://gallium.prg.dtu.dk/HVSC/random/HVSC_45-all-of-them.rar] md5=5394dac412dbe34d2dfe63cb91bdce8d sha256=6068499eeb3aad19d2f860390c65496cf38c5f5e5b54422db6ec2f67abbb8d10 @@ -406,6 +430,10 @@ sha256=ab8fdcfdbb6c74ecef4cfaf9e83f955aa422e43f8cd8683c1f2648c70070b88c md5=a7bda690ec0ad0bed457fa525e28034a sha256=ffac9cd4a6fbc59618bf4e79c389a927491a81b448528278e010a190e2483544 +[http://search.cpan.org/CPAN/authors/id/R/RJ/RJBS/MIME-Lite-3.024.tar.gz] +md5=ca71d1d844f5c4f693e5079a2b4fa9a5 +sha256=886b57c7d8d9903b54dad07b68f58e398745d6d92522e89e2ce714472c09f903 + [http://www1.mplayerhq.hu/MPlayer/releases/MPlayer-1.0rc1.tar.bz2] md5=18c05d88e22c3b815a43ca8d7152ccdc sha256=8dd9dd61a0fe56904f5b76ddedb99bd359abaaf486e0b83b45e3357fecc81063 @@ -498,6 +526,10 @@ sha256=a9cc62ab760afeebcb1319a193508734a2d470cab8effab2776a2d3c65bd9cd2 md5=598bb59b86c2c4842eeffb03392fab5b sha256=8fd609d1e6b460b5c95ad5612cb823aa863d51360ed55caea987909a9bab50f5 +[http://search.cpan.org/CPAN/authors/id/K/KA/KANE/Module-Load-0.16.tar.gz] +md5=851a225e31621a66621f28a25ec53d9a +sha256=f05c3300c988dc5f5f02d55f8ee241c05fbf4565c512f804f47c6e72e5f69e33 + [http://downloads.sourceforge.net/mysql-python/MySQL-python-1.2.1_p2.tar.gz] md5=e6b9ea21fd91cb4a5663304da727bb70 sha256=59f44cd53cfa1189dcaa5bf2c48662d5765f347b03827feb807f4cd0ef18943e @@ -570,6 +602,10 @@ sha256=987eeb9460185950e066e5db3b5fa531e53e213742b545288405552a5a7bb704 md5=87f56e79ae0c20397f4207d61d154303 sha256=987eeb9460185950e066e5db3b5fa531e53e213742b545288405552a5a7bb704 +[http://search.cpan.org/CPAN/authors/id/B/BO/BOBTFISH/PHP-Serialization-0.30.tar.gz] +md5=210b764fca7c791f4387717185f589b5 +sha256=09917ebe3b088649f0767723a7e25ae08fb8db921a85183e2e8c3d2e79ae6d10 + [http://www.packagekit.org/releases/PackageKit-0.2.4.tar.gz] md5=87bf41fd021077c93549d47de6d5fe07 sha256=3b1a6f451928ca7e36d25e6e5a2e3dec2adae11c20770406f8bdc484f38b1600 @@ -902,6 +938,10 @@ sha256=6fd69febfd804437a9d5b610502c6d3c2caabef7a4832a3bcac2357515adaa71 md5=6d53a2a9901549d52fecfafb0012134b sha256=6fd69febfd804437a9d5b610502c6d3c2caabef7a4832a3bcac2357515adaa71 +[http://search.cpan.org/CPAN/authors/id/S/SW/SWALTERS/Sys-Mmap-0.13.tar.gz] +md5=e65a007157e3e26807db52299497109d +sha256=e064a939bf7e37774b89a39515ecf96c4d19c81e050bcf0dae28d1eab4d86196 + [http://sdgsystems.com/pub/ipaq/hx4700/src/TIInit_3.2.26.bts] md5=8741490a25b98230973446400971bba9 sha256=c1f29cfd31c335a409bdc530c2e68661d20a1e3c2e5d64454470b6700a40681e @@ -978,6 +1018,10 @@ sha256=3d92318dadef22b1d1b062925ef66bac2ad48a0fd4fc83b88dcabba38c182b7b md5=61eed8ed819688663e399b5e79ed006f sha256=6a19418a074a7dec6fd67f00df74f3335e85eb38d2d2a17bd0e91cf8010537e3 +[http://search.cpan.org/CPAN/authors/id/R/RO/ROBF/X10-0.03.tar.gz] +md5=056b3d98fab545865148b948de6784c7 +sha256=2b34d7c2112e8b79856c63f43403bff1a7ed5005d9b98db5f94c6f4cc7ba5623 + [ftp://ftp.xfree86.org/pub/XFree86/4.3.0/source/X430src-1.tgz] md5=4f241a4f867363f40efa2b00dca292af sha256=5276b045e154948fce7abba7d686406c65862d90b43b50f2546b33e38378f0d7 @@ -1042,6 +1086,10 @@ sha256=f274a4bc969ae192994a856b7f786c6fce96bae77f96c1c2b71dd97599e06e43 md5=4be042a043ec520074b0ab6f7ca0bded sha256=fa668e8f01fe43fdddb33f0c5e294698818f37519000b9f782f504ece071c740 +[http://www2.zoneminder.com/downloads/ZoneMinder-1.23.3.tar.gz] +md5=ee803f0f71d6e67adf602c3557fb6bc9 +sha256=76cba999bf602b1d561921cfcbbf7a9eab64370f349a0b389efff75f4b0c3af2 + [http://zope.org/Products/Zope/2.7.1/Zope-2.7.1.tgz] md5=ae9d4bb3f7220dfffb6e91b42503b16c sha256=341f56aa4ece9001a118be8ff9675bfad6410dc1df86dd86aeb726adc732341b @@ -1882,6 +1930,10 @@ sha256=9dc6f870b6ce050059054a26bfc15d6e7a836fa299edd1b89c63c1089bfedd52 md5=aab1a304851d8145ea5f6a85c10af9e9 sha256=dedf5325105f071e5d9f898fdb7337a7fe88a3a8a1f832a6056ba00477b8cc3d +[http://avahi.org/download/avahi-0.6.24.tar.gz] +md5=068c1d220b07037e64caf87d4a7a0504 +sha256=260070d46188ed58f5dc1174ce632c096679f6391a2b729366e7aba349d4b950 + [http://www.apache.org/dist/excalibur/avalon-framework/source/avalon-framework-api-4.3-src.tar.gz] md5=d4cffb4ba1d07bdc517ac6e322636495 sha256=a4d56a053609ddfc77f6a42c3f15a11708d5e0eb29ffc60a40b87e4cc7331d47 @@ -2318,6 +2370,10 @@ sha256=52f78aa4761a74ceb7fdf770f3554dd84308c3b93c4255e3a5c17558ecda293e md5=1e80b2a4e0d17aba3e377b3ee140ab5e sha256=a226f7b37694669aa6efe6c30462e2d44f5881ca70604dac15c23fce66992872 +[http://download.berlios.de/bitbake/bitbake-1.8.12.tar.gz] +md5=01f6404d96cfa1d165d07921d754271e +sha256=ee81df164f8476dfe44c1841a27b3a0db49dea382c38d5ffb7e19a4747ca17af + [http://download.berlios.de/bitbake/bitbake-1.8.6.tar.gz] md5=0e0dacaae704aed08a940389250e61e9 sha256=fd8a9e9e916314f9385f497d1f9b81d0885487f7741ad7be790972f44fc68b25 @@ -4018,6 +4074,10 @@ sha256=46c0991b71d1991aa2f90d6816d9efb737fc9f9b99713174fcdf8d323727a11c md5=7fdd5f8395162d8728d4b79e97b9819e sha256=d62e98fee5b1a758d83b62eed8d8bdec473677ff782fed89fc4ae3ba3f381401 +[ftp://ftp.pl.debian.org/pub/debian/pool/main/d/debianutils/debianutils_2.30.tar.gz] +md5=7fdd5f8395162d8728d4b79e97b9819e +sha256=d62e98fee5b1a758d83b62eed8d8bdec473677ff782fed89fc4ae3ba3f381401 + [ftp://ftp.gnu.org/gnu/dejagnu/dejagnu-1.4.4.tar.gz] md5=053f18fd5d00873de365413cab17a666 sha256=d0fbedef20fb0843318d60551023631176b27ceb1e11de7468a971770d0e048d @@ -4314,6 +4374,10 @@ sha256=7b5b456e6ccb3a36cc96b84b79ba148850ab59ac45316b759a090a1121f93e13 md5=79ec740d1a10ee75f13efa4ff36d0250 sha256=9888d96d7d91e518c96a034dc863f8f7d961acd9334a1acde849c6022e540212 +[http://www.thekelleys.org.uk/dnsmasq/dnsmasq-2.47.tar.gz] +md5=4524081e56d0b935717d493e8e8d3e11 +sha256=f2716a43eb05b232c640a4ad647fd0fc21dd0c4f4ad20c9f5303568742399e5d + [http://www.docbook.org/sgml/3.1/docbk31.zip] md5=432749c0c806dbae81c8bcb70da3b5d3 sha256=20261d2771b9a052abfa3d8fab1aa62be05791a010281c566f9073bf0e644538 @@ -4982,6 +5046,10 @@ sha256=34a398c1c27b22652ceacf29b1b3f33feff33f612802ed0c9b57afc1dce9b27e md5=f939fb9a2c7aab5877f7e420827af027 sha256=fedcf1b669873de67d69d3e81ad88a47414ccfede4a6a73ffa15ab82b1378460 +[http://projects.gstaedtner.net/euphony/euphony-0.1.3.tar.gz] +md5=47d5663f0c66177e3529b9062f9b071f +sha256=30f035bc39967f72f3ac8740d78f4d5e611577ea2b90f47f4cd72d6729fd4ce5 + [http://enlightenment.freedesktop.org/files/evas-0.9.9.037.tar.gz] md5=21cb713b01be39992a7c48d0ea23429b sha256=400046d55db03c3ac2de9e3346e38d0a75753501fb85ea953a497cdafc1340a1 @@ -5034,6 +5102,10 @@ sha256=c424e6dd5cc0d998a311f5c49835de9803da4dbcb74ca7fbda29c1b953bf6d6b md5=ad0e463ab1fe596fc52c03403a9b9f1e sha256=d8803313e2a0b3fa3fe20fe613ac3ec85ec6848d5d446dd02e9cc5be8194f65c +[http://beagleboard.googlecode.com/files/evtest.c] +md5=da26fda6df8835a7cb95182e1fabe912 +sha256=ba2bdf6887eb0ef606402d51a2f4e68510d68dec5afd9f4d30d787950dece770 + [http://enlightenment.freedesktop.org/files/ewl-0.0.4.007.tar.gz] md5=29bc8aec80b53480c2ea53aea1796e15 sha256=0a0dba00517013082b8e094b4b7753162cf5fb71a170eb54cbc2eaa35717d5f6 @@ -5198,6 +5270,10 @@ sha256=06c2772ae6e446227f6798ad8994fcdb1fe64385bc83a34f7e29fd8af2e4f5da md5=9441c981bfd4e521abcd5d93385f71d8 sha256=06c2772ae6e446227f6798ad8994fcdb1fe64385bc83a34f7e29fd8af2e4f5da +[http://ftp.pwr.wroc.pl/debian/pool//main/f/fakeroot/fakeroot_1.9.6.tar.gz] +md5=9441c981bfd4e521abcd5d93385f71d8 +sha256=06c2772ae6e446227f6798ad8994fcdb1fe64385bc83a34f7e29fd8af2e4f5da + [ftp://oss.sgi.com/projects/fam/download/stable/fam-2.6.10.tar.gz] md5=1c5a2ea659680bdd1e238d7828a857a7 sha256=885ced3480aef3cee519a459a572e31cd2fd5e24bcd35b1d0c8833361699026e @@ -5450,6 +5526,10 @@ sha256=ce4f7d11b3c04a7368c916ca4abc284dd0c0256f461dfb7f07df1ab445e7a5c0 md5=2bfc127cdda02834d0491ab531a20960 sha256=ce4f7d11b3c04a7368c916ca4abc284dd0c0256f461dfb7f07df1ab445e7a5c0 +[http://fpdownload.macromedia.com/get/flashplayer/current//flash-plugin-10.0.12.36-release.i386.rpm] +md5=8845d4536fcd3a329690c93bce9bbf8e +sha256=c7345faf10b269b3556f2e1373c4afc35f08891f8bbd54e45d49151a8c8e4ac0 + [http://downloads.sourceforge.net/flex/flex-2.5.31.tar.bz2] md5=363dcc4afc917dc51306eb9d3de0152f sha256=701353279a17655d78e3b3678ad78d0375f5bf45877ad8b3507d589c42427f26 @@ -12514,6 +12594,10 @@ sha256=ab01882a3d0556176018c09342cd0731f7cbc8e687795009894c3326942c76ff md5=be845c41170d72c7db524f3411b50256 sha256=ab01882a3d0556176018c09342cd0731f7cbc8e687795009894c3326942c76ff +[ftp://ftp.pl.debian.org/pub/debian/pool/main/libn/libnet/libnet_1.1.2.1.orig.tar.gz] +md5=be845c41170d72c7db524f3411b50256 +sha256=ab01882a3d0556176018c09342cd0731f7cbc8e687795009894c3326942c76ff + [http://www.netfilter.org/projects/libnetfilter_queue/files/libnetfilter_queue-0.0.13.tar.bz2] md5=660cbfd3dc8c10bf9b1803cd2b688256 sha256=1d6b180272befbfb19fedd80b5641354b82d6e719bf3d9ffa2d8287c62046536 @@ -12994,6 +13078,10 @@ sha256=bd55717374674ed69de46c13b52aaba0420d5c68582cac34d863e44f6f1d560e md5=02e78c3cfbdb4be285d97653e563f65a sha256=bd55717374674ed69de46c13b52aaba0420d5c68582cac34d863e44f6f1d560e +[ftp://ftp.ibr.cs.tu-bs.de/pub/local/libsmi/libsmi-0.4.8.tar.gz] +md5=760b6b1070738158708649ed2c63425e +sha256=f048a5270f41bc88b0c3b0a8fe70ca4d716a46b531a0ecaaa87c462f49d74849 + [http://www.mega-nerd.com/libsndfile/libsndfile-1.0.16.tar.gz] md5=773b6639672d39b6342030c7fd1e9719 sha256=79e305112a4d9598b93b614a7747604f9ef10d9a2dee52c5903b554bbeaedd7c @@ -13074,6 +13162,10 @@ sha256=8b4ebd22dcfa7511109c2f6fa9e304c2ef3acaa492d55423cdf9a6f54a2fdb22 md5=ad703c4702646c83ca4fcace92c220d3 sha256=94ca32ac10615a7c0ba19180e67f2e40e2bfa4cc8de6ceb2a3a54d2dd83141cb +[http://www.0xbadc0de.be/libssh/libssh-0.2.tgz] +md5=8a76c03579a3e27046e6bafe88ffd171 +sha256=46c3831fd563c54283ebef56e2cb11c27f47b1be9f6cb44f1465897dd7aea5ff + [http://snowball.tartarus.org/dist/libstemmer_c.tgz] md5=8358a9ddaaffeeca7cb00725770f7cdb sha256=f3e93a41ad76e91f08e3115fa5065df8b69fd3f2dbdd9e982ae890b892ac6477 @@ -13322,6 +13414,10 @@ sha256=69ad5d62946885a60368381a3354b8fd19597bc6fc9ee25b4598977771429b8d md5=a5056dcf337e240e5370984f95d9ad68 sha256=676840669a82763ccc7b46ba033a6a01df815c46486f7b30916951769331b6d6 +[http://people.atrpms.net/~hdegoede/libv4l-0.5.8.tar.gz] +md5=4f8ae9c743b215c8ac0e553eaa01e980 +sha256=9d006377ec51ca149ed415fbea5c3298b0fe7bae4cbd3bc2f54fd25a24ed9eb2 + [http://downloads.sourceforge.net/libvisual/libvisual-0.1.3.tar.gz] md5=e70e91d2e90831c0eb78944b6a9605ef sha256=fc04f2f2bae4b3eef7eb331330e2e3fd336d1894dbf4cae631c8b635622cdd52 @@ -13942,6 +14038,10 @@ sha256=5a729a49ce591a58d241ac39979cb496ab30687556633782557196d2b262921e md5=eddf56af6f248812e3016a9e34b42bbd sha256=5a729a49ce591a58d241ac39979cb496ab30687556633782557196d2b262921e +[http://downloads.sourceforge.net/lmbench/lmbench-2.5.tgz] +md5=d5b05498af26d5c09b372caab82a0337 +sha256=e7431530a4cf4c44b5068e23454f95765dc0b51e7d98bc2bd70451b17d505bd9 + [http://heanet.dl.sourceforge.net/lmbench/lmbench-2.5.tgz] md5=d5b05498af26d5c09b372caab82a0337 sha256=e7431530a4cf4c44b5068e23454f95765dc0b51e7d98bc2bd70451b17d505bd9 @@ -14078,10 +14178,18 @@ sha256=bfc8cf4258574b48d33e9d622627db496e6533a469a6a87fd7ed76098dabb8a6 md5=afd35e0770f28121a9f8d6093d20a62b sha256=bfc8cf4258574b48d33e9d622627db496e6533a469a6a87fd7ed76098dabb8a6 +[http://downloads.sourceforge.net/ltp/ltp-full-20080229.tgz] +md5=5860835de7e8d6f76a856243fd5f299e +sha256=e4c56dbbbf2d1a4d641624234b561e9402c00e47b5b253ae126aa444182310a4 + [http://heanet.dl.sourceforge.net/ltp/ltp-full-20080229.tgz] md5=5860835de7e8d6f76a856243fd5f299e sha256=e4c56dbbbf2d1a4d641624234b561e9402c00e47b5b253ae126aa444182310a4 +[http://downloads.sourceforge.net/ltp/ltp-full-20090131.tgz] +md5=397b376dd659459e4a431474b42263a8 +sha256=5fa4353d826b719cc313e370dd8f4ab0793432e4d797a96cb5bb01e078ff1e10 + [ftp://ftp.debian.org/debian/pool/main/l/ltrace/ltrace_0.4-1.diff.gz] md5=89c0ebdd0a27bc7f68726100f4bb079b sha256=27c0b2051949b88514d4a32300377d531db314d7c93750b0abff049c2b93d739 @@ -14858,14 +14966,26 @@ sha256=4f65183200955540c097b82bfb18f5d21b636ca79f47cd018a4ea8b89cd2998c md5=7d049a8331efcfe34600c0cda6934ac6 sha256=a145a90d0824c65cfc11c3fc843ba484585983e1e8ee14b79f4d09cf1d38b98b +[http://downloads.sourceforge.net/mingw/mingw32-make-3.81-20080326-src.tar.gz] +md5=7c21ed475aa72a0fd3115dcc12eaeaa2 +sha256=f05c64eaa334cf6a59aacdfff3213fc53d0b670e79662fb25f029bfb78148bac + [http://downloads.sourceforge.net/mingw/mingwrt-3.15.1-mingw32-src.tar.gz] md5=0411b98fd5eeac0706e2abb7122526bb sha256=4f4d19f3e15fdf00957932211be609b6bf4e689ad5938ce7bff666a638bde0e7 +[http://downloads.sourceforge.net/mingw/mingwrt-3.15.2-mingw32-src.tar.gz] +md5=7bf0525f158213f3ac990ea68a5ec34d +sha256=64d7c31354d318ec2085e39e724287c78742a66302fd0b27dab7a3f705d5c54d + [http://www.denx.de/twiki/pub/Know/MiniFOHome/mini_fo-0-6-1-pre1.tar.bz2] md5=7e192e01b08023c7f3e63bf1c796bc14 sha256=68c64a38f0b29347f86871248f0399e7e1b12645dc6263af7b2e4940f1392eaa +[http://www.acme.com/software/mini_httpd/mini_httpd-1.19.tar.gz] +md5=7c68293ad265ecfe2edea917912f6f1f +sha256=f7f36533b1338ea16d916ea525ea7006ab38fdd3544ac7df93a4688a8e270241 + [http://gpe.linuxtogo.org/download/source/miniclipboard-0.3.tar.gz] md5=8bea461bf4136aedbe110b6aec184d72 sha256=7f9c937c0f04760d215f7e7d9ca2709f8148e69be2693206d1ae81e2c88a656e @@ -14874,6 +14994,10 @@ sha256=7f9c937c0f04760d215f7e7d9ca2709f8148e69be2693206d1ae81e2c88a656e md5=1c8f3b247c38fb16c3c2170df9fc102a sha256=7f04535b3839fbbb0affa780108c32c330b924caf4e41dacd57dd23aa1fec392 +[http://alioth.debian.org/frs/download.php/2332/minicom-2.3.tar.gz] +md5=0ebe7a91898384ca906787cc4e2c3f25 +sha256=2acbc3d4a07e1134ee285a72fa44bbc27703b02dba02be68db9e6fd8320356fb + [http://gpe.linuxtogo.org/download/source/minilite-0.41.tar.gz] md5=135996a65350d5c40a2c020a2ddaf5ef sha256=2e01c8375e7d876a44b8703e00958aea88967124c1a9631031c4ea8019f5dd32 @@ -14982,6 +15106,10 @@ sha256=f79dff54153dc3beb9eb3f2e4776dbc55ed2a4d3d0adbf9c8a2d9eb230ed3850 md5=75bbd1dc425849e415a60afd9e74d2ff sha256=e83b80b4ccd7863223fac4a2d54974a64a79c635d6bdda0c6e7039f966eae9e2 +[ftp://ftp.mktemp.org/pub/mktemp/mktemp-1.6.tar.gz] +md5=3e66f91f8a39c7dc0a67b158aeb9c2ac +sha256=a1275889c7bb6b3c353d5b9ebb983064e8ef1d29ef8688bd132cec065642d2d9 + [http://www.informatik.hu-berlin.de/~tkunze/zaurus/patches/mmc-spi.patch] md5=329fd64f8ccdb2731c54f6a1b8c6de14 sha256=27934de6da3f5ac94ed60ba4bfdd3acc2d93b01a2f932b576f87fb4508dcde6e @@ -15206,6 +15334,10 @@ sha256=30e454514ef84f65162182b7cbcd0e46fdda4c99111ac500b5b2df7678ca10fd md5=52d10ea80595ec83d8557ba7ac6dc8e6 sha256=9416376952812e5b479745d67a2bf874fbcad10137517314ce7de37abb756df8 +[http://bmrc.berkeley.edu/ftp/pub/multimedia/mpeg/encode/mpeg_encode-1.5b-src.tar.gz] +md5=ff125fb82118efc7c852f0d26d5552c6 +sha256=dd8db42f88393bb0ff0d738defa271729a8aa9b8de24ed13bc6bd27014f2daf5 + [http://www.mpfr.org/mpfr-2.1.1/mpfr-2.1.1.tar.bz2] md5=843422d90349800ee721f6710d051c87 sha256=df551fb075d5e6d0824b74d231962cf0e104c43f646e233675d952ef3c03debc @@ -15378,6 +15510,10 @@ sha256=302bea9f0903fecf13ee0e9c24ed090203f2c77f7164a2a0f68c35fc8e1b9f10 md5=ea7afa7e0bd9cfa0df7c04a9b270df88 sha256=2033168723ffd612336acb8a64b33fcd91f7dedeaf78949d3dfce231cb962ce9 +[http://www.sacredchao.net/~piman/software/mutagen-1.15.tar.gz] +md5=c346e1290711a38c123727c31f3602f8 +sha256=636d816aa4c7e754496b9daec8a00d7e5f62b67d640440c91dea6d694c83c944 + [ftp://ftp.mutt.org/mutt/devel/mutt-1.5.15.tar.gz] md5=b2c1eb45fd958f6589ee52a98f2a3ce1 sha256=03fa1f45d4743cd395b634d19aebbc2c1918cf6b683e0af51076ccc79f643a9a @@ -15766,6 +15902,10 @@ sha256=0bf226bb3a1716e6eb97355e08a7ffcf09aadfb91ba41ccef2ef1ba7a01719a2 md5=873a8de662849d129fc7c475ad3f5447 sha256=b5bbf81230bb21573d69fc471721b0b0c404eaa5040ef28e7dcec38320a1b2e4 +[http://www.ntfs-3g.org/ntfs-3g-2009.1.1.tgz] +md5=56e4aed24d0c2543597de0ba52b3ed64 +sha256=0e02ff891645658c1801ba7d665c0ff3a4231e5570b974a803ffc2974ef68e45 + [http://downloads.sourceforge.net/ntop/ntop-3.0.tgz] md5=1ec6055c75f1acbb5d5600492481ef85 sha256=c50cdf2c6cf7309f88c7ec0a56158eca76c80532502b36f3378eeca433423d83 @@ -15918,6 +16058,10 @@ sha256=3b46936339fe5c2dcb8fb2f9213fa36dcddefaa1e00d1d93b5640d8cc9898ca1 md5=6fbd72e81dd4c135a2cc4f78d596aeb4 sha256=68b8978071f31615ad89119583e629ca7c3069ae0c2fb8f7c390c19807cce0bb +[http://downloads.sourceforge.net/wgois/ois_1.2.0.tar.gz] +md5=6a8cedad04f095127ca1455162fec955 +sha256=175414df5d7b924779fa513ea614081ae55ae708a5e29473e74911297e4be708 + [http://www.olsr.org/releases/0.4/olsrd-0.4.10.tar.bz2] md5=9807d4451e65cb4ec385155eef7bf3cf sha256=af04bdd8abd85bb4715fd6011566054847c75fcbac5e5e9cdee80858ac2957d3 @@ -16186,6 +16330,10 @@ sha256=347c551e7c88affc1f4b7a4b715080253c9298dcc512ed29fe8ca5cd26d015d9 md5=7401faebc6baee9add32608709c54eec sha256=063f00d5b889beee910eb113c8cfbb4fc85cd404693494bcaaf79dd09a98335c +[http://downloads.sourceforge.net/gakusei/openwrt-imagetools-svn-rev7641.tar.bz2] +md5=7f35543286911b827dcbf8d07a7d72be +sha256=bad49b59646dbea380cc88be13a77d17c70488b8e11e85f7dd474930fa9cf36a + [http://heanet.dl.sourceforge.net/gakusei/openwrt-imagetools-svn-rev7641.tar.bz2] md5=7f35543286911b827dcbf8d07a7d72be sha256=bad49b59646dbea380cc88be13a77d17c70488b8e11e85f7dd474930fa9cf36a @@ -16786,6 +16934,10 @@ sha256=31c35db09289c6e0436a258745d7180e0cd8f567949f27b3dab5a57a3664ed2f md5=4550a418f0480b39e839735a7e0e8d82 sha256=fbb5ee21210a4e4e1fe25941c6e16ec0fe8634817e6c96145128f376ba0c640b +[http://kernel.org/pub/linux/kernel/v2.6/patch-2.6.28.4.gz] +md5=464f663266e2c18371e213adab3c0077 +sha256=4862e7bf53553f645d9d730d3657bbec79f7c03482a984259b38e10e25b54382 + [http://www.muru.com/linux/omap/patches/patch-2.6.9-omap1.bz2] md5=d6249654087f0bcafaa860ac573316a4 sha256=91806347cb386002a8bfd20ee66e536e4a7dfb01f207dd751341f2971090d9ac @@ -16822,10 +16974,22 @@ sha256=6e3549b8586d8ac3ae8b2251b6cff9065f12a5d648c9c464543988ddb670545b md5=3aa902cb7a57a4aa09427de603ebf17b sha256=3d087c88f6e2cc8fde8d2ab12ff2f85ca3ecb2c67754d0483d158f2e5802b015 +[http://dev.gentoo.org/~solar/pax/pax-utils-0.1.13.tar.bz2] +md5=5f09df47a16e83462384b44b75310539 +sha256=72f3cdad93b5436070dcc63b67764a06c594f324ccc001e8bfb974a8d1a86f36 + [http://distro.ibiblio.org/pub/linux/distributions/gentoo/distfiles/pax-utils-0.1.13.tar.bz2] md5=5f09df47a16e83462384b44b75310539 sha256=72f3cdad93b5436070dcc63b67764a06c594f324ccc001e8bfb974a8d1a86f36 +[http://gentoo.osuosl.org/distfiles/pax-utils-0.1.13.tar.bz2] +md5=5f09df47a16e83462384b44b75310539 +sha256=72f3cdad93b5436070dcc63b67764a06c594f324ccc001e8bfb974a8d1a86f36 + +[http://gentoo.osuosl.org/distfiles/pax-utils-0.1.19.tar.bz2] +md5=98f6b9fe17a740a8cc577255422c6103 +sha256=3918628e9f2508708a1a28f5ed4cb39d07cbd5711747bbb3ddf63816d056c11e + [http://the.earth.li/pub/e3/pbltool-0.2.c] md5=c8fd507f831d2b017dfecf60bc55e28a sha256=2a1e31d4ae859e530895882273fad0170374a2d5b838bb4558303e59236e9cb6 @@ -17250,6 +17414,10 @@ sha256=175be17571e9af3ad622531b494a0738ae632c60c8c6329273778b2b6fbbad74 md5=5988e7aeb0ae4dac8d83561265984cc9 sha256=4e75cb28793f0d44134f71fae53057d5f250805e6268fbd9c9780654b73b0dc1 +[http://rpm.org/releases/historical/rpm-4.1.x/popt-1.7.tar.gz] +md5=5988e7aeb0ae4dac8d83561265984cc9 +sha256=4e75cb28793f0d44134f71fae53057d5f250805e6268fbd9c9780654b73b0dc1 + [http://downloads.sourceforge.net/poqetp/poqetp_0.0.6_src.tar.gz] md5=b003614237445d23b512cb9571565524 sha256=4347a70fe84bd2ccecc90738fb121d28298cf0bfdb4963ceee088c56d3109899 @@ -17914,6 +18082,10 @@ sha256=1fe008b728923f25d3c8ebd7f28cc538aa0814f3b090df817e25c266fcaecf6a md5=e65d9245d706350b3db811280d897f30 sha256=3eecd66deecc2de5c31bb91a4b4479232087e80da94e3086e2a686879374cde9 +[http://pypi.python.org/packages/source/p/pyflakes/pyflakes-0.3.0.tar.gz] +md5=ec7eee3444214bda18e57b82175e1da7 +sha256=019b6d4b549306d013974678872aaf2453af3f02760175504dbe8a9f89db0a2c + [http://pyftpdlib.googlecode.com/files/pyftpdlib-0.5.1.tar.gz] md5=f64ac67ebec1d8ab47c0766082617384 sha256=6daed9475412eaab232e021ed76568c6520dacd75c58da406454139bef95c393 @@ -18254,6 +18426,10 @@ sha256=4756d0b4a4dc7dd88354bc6b37d381e4462dd328d0feef94803e90c0455835a5 md5=2a8219bcb375fac66cea66394c3c36fa sha256=1e097fdccda0fc914c8229aab7d83964c5944cc95eb053fd69e357dca69461b9 +[http://www.qhull.org/download/qhull-2003.1.tar.gz] +md5=48228e26422bff85ef1f45df5b6e3314 +sha256=68725c96603a426da748d38d0f83e7a9dd6a0bfc483525debe04001846475b0b + [http://www.klografx.net/qiv/download/qiv-1.9-src.tgz] md5=b368e00543b2b1d9a87b37fd5ba60c57 sha256=7ffeb0b90892d71eff4f26227962f5b306d52a55539f1cb2a72993c8252ca518 @@ -18738,6 +18914,10 @@ sha256=357ae73b048a2a6db46c8b28e0b79bc9448dbae96f52e44b07db7e40895ef2cf md5=f7cc9a2a30f480be3ecefedea363575c sha256=357ae73b048a2a6db46c8b28e0b79bc9448dbae96f52e44b07db7e40895ef2cf +[ftp://ftp.pl.debian.org/pub/debian/pool/main/r/resolvconf/resolvconf_1.41.tar.gz] +md5=f7cc9a2a30f480be3ecefedea363575c +sha256=357ae73b048a2a6db46c8b28e0b79bc9448dbae96f52e44b07db7e40895ef2cf + [http://xlibs.freedesktop.org/release/resourceext-1.0.tar.bz2] md5=007713326ca5f1adfd39f3cb587c3b9b sha256=78e0a532bb84d6d85e90244bf3bb0ee9a5246545ebc9b677173e37e231d30cdc @@ -18830,6 +19010,10 @@ sha256=a8168b8884ab40aadebba0ba696b889e25020d32a88e646d4f4bc56f2236b184 md5=63f39118ea5ef7cda84a0638002ed6d2 sha256=27ffe0392ae193eb04786a2159c099a00fe38ccdaebcebd72afc842c528bb6d3 +[http://www.freebsd.org/cgi/cvsweb.cgi/%7Echeckout%7E/ports/archivers/rpm2cpio/files/rpm2cpio?rev=1.2] +md5=07f64fa3dae6eb8b1b578d01473a5c07 +sha256=a98cb1d9903192c4fcf40d82c705e091a5c193f87327703217749a5f4cc6197d + [http://downloads.sourceforge.net/rpyc/rpyc-3.02.tar.gz] md5=4e855372c4a533b9ed605503156e6e04 sha256=3dbd653b27fc855bf86dfe0ac06ed9bf59c8b85c9bcb4b5488528b30c59970f4 @@ -19070,6 +19254,10 @@ sha256=22647c6bdd0f1b311bd0e3a893fb184f07d0f5e1c4b3bccd20a024fe18fd7567 md5=528677f261f3ed4a58f9483ca25ba6b2 sha256=4f2bb8c5785c50ad05d3adc0027c0881211b8a5c51e840651b53b7e455c004a3 +[http://samba.org/samba/ftp/stable/samba-3.2.8.tar.gz] +md5=06efd6e6cc4aac628a1a0b082e4be0f2 +sha256=7e7fb53d6ff05993dcb8b871e3c3016bd4d161d72ded8f8760a4439e9d76aa3b + [http://samba.org/samba/ftp/stable/samba-3.3.0.tar.gz] md5=adb048dc3988055533e1ea5d91d81f99 sha256=b00ca360e9b414744eff33ca4567f3eb1a28d32914e20f00b6672fbc141c9beb @@ -19210,6 +19398,10 @@ sha256=2a19694b9825ec13349adac691933a8f890117ef566a9cd58a9e439030a96a3a md5=659bf15bbbb31817ebad9372c8827618 sha256=2a19694b9825ec13349adac691933a8f890117ef566a9cd58a9e439030a96a3a +[ftp://ftp.pl.debian.org/pub/debian/pool/main/s/screen/screen_4.0.2-4.1sarge1.diff.gz] +md5=659bf15bbbb31817ebad9372c8827618 +sha256=2a19694b9825ec13349adac691933a8f890117ef566a9cd58a9e439030a96a3a + [http://xorg.freedesktop.org/releases/individual/app/scripts-1.0.1.tar.bz2] md5=08c7f078fc351196c21db3a8206d482d sha256=1b154b4359302ca499818c45396325aef9ff364d6ff4ce5c3769e4803994a136 @@ -19938,6 +20130,10 @@ sha256=057626d78e5ade840568ab0e171a1d1ae87348ab51bf9e35d1cdc074fc4e2edb md5=3c575cf89a6d3d8ab6063c2f60bd5b25 sha256=057626d78e5ade840568ab0e171a1d1ae87348ab51bf9e35d1cdc074fc4e2edb +[http://downloads.sourceforge.net/fuse/sshfs-fuse-2.2.tar.gz] +md5=26e9206eb5169e87e6f95f54bc005a4f +sha256=206ebcbc4cb9f5039bfcc7059678a0f61120605a5cdcbffa3ae5716c113e5423 + [ftp://ftp.debian.org/debian/pool/main/s/ssmtp/ssmtp_2.61.orig.tar.gz] md5=957e6fff08625fe34f4fc33d0925bbc9 sha256=2151ad18cb73f9a254f796dde2b48be7318b45410b59fedbb258db5a41044fb5 @@ -20370,6 +20566,10 @@ sha256=199fcaa5bc5b0b56537d43c522a9f0d839e61d7ffc58438da56574f642159519 md5=dcd50ddb2544faeae77f194804559404 sha256=0ff805bb8dbf72a45d347f2310f7e5c86e2e7419a069d546e53cf5f221c196ab +[http://developer.kde.org/~wheeler/files/src/taglib-1.5.tar.gz] +md5=7b557dde7425c6deb7bbedd65b4f2717 +sha256=ba610716ec539d4858133e008d079728953820c583b200ff0936e36fc0550ec2 + [http://tango-project.org/releases/tango-icon-theme-0.7.2.tar.gz] md5=eace48f8340a95d7134632bad6287100 sha256=6b368373f9a01f3f33f77ac25c170cbd052b29d6910f72308e55dc0a39af7722 @@ -20626,6 +20826,10 @@ sha256=9c0f7eaeb5ba6dc6f66433404d264941bf95cded2fa798b1f7a9dd580c21649b md5=ed9d30d9162d16ac8d5065cde6e0f6fa sha256=6c3b8fa619749cbb28ca0f8847e56773d13e0bb92f1ea34287420950373640c2 +[http://www.wias-berlin.de/people/si/tetgen1.4.2.tar.gz] +md5=59c92b223f69cc7e50ae6cd9d1539db1 +sha256=38f24694983f20e5bffa2ebc1d35a7c3abea50479a6df6449cc900bf2732891d + [ftp://ftp.gnu.org/gnu/texinfo/texinfo-4.8a.tar.bz2] md5=0f429f87de9f20d6c0d952e63bf8e3fa sha256=efcda677be7ef093757d965736dff3b5af8c9fd36b3e7d3db09289a4a1d5d013 @@ -20774,6 +20978,10 @@ sha256=794687ae1b34aba9a3cf6f9b118d0ba91b8f83858fe92a9ded0611225db3ca0e md5=2f9ef4509198e96bb184577fdddfce6d sha256=794687ae1b34aba9a3cf6f9b118d0ba91b8f83858fe92a9ded0611225db3ca0e +[http://downloads.sourceforge.net/tnef/tnef-1.4.5.tar.gz] +md5=ec46d47525c6afb928642e3edec21058 +sha256=42067fbc00d1ad4bcbb67440d61869aa43ed2d3d099fc691d3da8ad4296fa6b1 + [http://tofrodos.sourceforge.net/download/tofrodos-1.7.8.tar.gz] md5=aaa044f9817a048e126d9eb7a7535e96 sha256=e1d78226c5b54c0ce8e1c7de8bdd025aec6bf684960d5cee28310cf8dce48bb9 @@ -21854,6 +22062,10 @@ sha256=a4f15c73e2b67c888cbedfaa8093661dff6cb859357c197c60f3026baddb939e md5=05fada181e12bfa94b52f0b10395b28c sha256=a4f15c73e2b67c888cbedfaa8093661dff6cb859357c197c60f3026baddb939e +[http://downloads.sourceforge.net/wireshark/wireshark-1.0.5.tar.bz2] +md5=4c6a93e00123d8bb7af48a009519aca4 +sha256=4f923e24d674ac62ded3da402a4de6d402886d80e3d7cac91cf026921f32fcf7 + [ftp://ftp.elmeg.de/artem/ClientCards/11b/linux/wl_lkm_718_release.tar.gz] md5=049c6c3d410e9f46884627b57485d3e7 sha256=a28c7ea94d57a5354b7de06cf5f6416d80a40596911c129d4b6a4087dc916831 @@ -23078,6 +23290,10 @@ sha256=c6032ec1753a0f5975b5a7488ca3ca0d46f84bc5dd8fcb42eebd807c7faec765 md5=c209e54fa8dcd3cd3342e84d261b02db sha256=d03eb7e5b47e2f1e1a665700f4e22d15651dc949196b0ec880f0d63cafb6814c +[http://xorg.freedesktop.org/releases/individual/driver/xf86-video-geode-2.11.0.tar.bz2] +md5=1dbede8f6393edfe6c1ecab2f754b3b2 +sha256=d70c198cde981c3a53b1c41b717dea4bbf1d397d82957f584c641bb5fd02c82d + [http://xorg.freedesktop.org/releases/individual/driver/xf86-video-geode-2.8.0.tar.bz2] md5=a2b9c70a32b0a6436d837d67fa7aae18 sha256=f0b68171dd4256c927fbee91ecf84fa28c409b5b6b39cbf47eaa48fd73db305f @@ -24970,6 +25186,10 @@ sha256=5beb94529cc7ac79b17e354f9b03aea311f5af17be5d48bc39e6f1db5059f70f md5=43c606bbd27c500b0022471ed704ab78 sha256=014e744f40c773bf225328bce1ca80f5dde4835c1f6671e989a4f8c4ed24555f +[http://downloads.sourceforge.net/yasr/yasr-0.6.9.tar.gz] +md5=daec224676fb2db5a1936b399f559473 +sha256=41f17cfab8e88824a8dc1476602a0944b9030a8f8da2538a7a6549e3534e3bdf + [http://download.devbase.at/voip/yeaphone-0.1.tar.gz] md5=476552b3b88b651ba161d22c1db5314d sha256=2f596ef4c57e29708d6246949289341d9f9756d162bf49e89f0828180329aa51 diff --git a/conf/distro/angstrom-2008.1.conf b/conf/distro/angstrom-2008.1.conf index 5de7ec9bdd..062cba7ac6 100644 --- a/conf/distro/angstrom-2008.1.conf +++ b/conf/distro/angstrom-2008.1.conf @@ -91,16 +91,11 @@ ANGSTROM_GCC_VERSION_xilinx-ml403 ?= "4.1.1" # Blackfin has its on gcc ANGSTROM_GCC_VERSION_bfin = "4.1.2" -#for proper NEON support we need a CSL toolchain -#ANGSTROM_GCC_VERSION_armv7a = "4.2.1+csl-arm-2007q3-53" ANGSTROM_GCC_VERSION_armv7a = "4.3.1" ANGSTROM_GCC_VERSION_486sx = "4.3.2" -#Horrible workaround for armv7a follows: -# gcc 4.3.1 builds a kernel that oopses with a null-pointer in the rcu-update function -# gcc 4.2.1 (the one from *gasp* csl) builds a working kernel, but non-working userspace - +# Uncomment this if want need to build an armv7a kernel with CSL toolchain (<2.6.27 don't boot with mainline gcc) #KERNEL_CCSUFFIX_armv7a= "-4.2.1+csl-arm-2007q3-53" #avr32 only has support for gcc 4.2.2 @@ -192,8 +187,11 @@ require conf/distro/include/angstrom${ARM_ABI}.inc DEBUG_APPS ?= "" DEBUG_APPS += '${@base_conditional("DISTRO_TYPE", "release", "", "strace procps",d)}' -# Angstrom want to ship some extra stuff. This should be moved into task-base eventually -# contains ipkg specific stuff as well :( +# This hooks into task-base, so it won't do anything if your images doesn't include task-base. +# angstrom-version: ship this to have an identifiable rootfs so user can report bugs against a specific version +# ANGSTROM_FEED_CONFIGS: configfiles for the online feeds +# util-linux-ng-mount util-linux-ng-umount: busybox mount is broken +# angstrom-libc-fixup-hack: fixes an obscure bug with libc.so symlink DISTRO_EXTRA_RDEPENDS += "\ angstrom-version \ ${ANGSTROM_FEED_CONFIGS} \ @@ -201,6 +199,15 @@ DISTRO_EXTRA_RDEPENDS += "\ angstrom-libc-fixup-hack \ " +# This also hooks into task-base, but isn't mandatory. +# If you don't want parts of this in your task-base using images you can put this in the image recipe: +# BAD_RECOMMENDATIONS = "avahi-daemon avahi-autoipd" +# Note that BAD_RECOMMENDATIONS is a feature of rootfs_ipk.bbclass, not angstrom +# kernel modules: ship fs modules so you can mount stuff and af-packet so networking works +# avahi: makes finding your device on the network a lot easier +# openssh-sftp-server: provides sftp which combined with avahi makes it real easy to use things like sshfs +# psplash-angstrom: angstrom branded psplash, you can add your own psplash-foo to an image, it uses update-alternatives +# DEBUG_APPS: ship strace and procpc to make simple debugging a lot easier DISTRO_EXTRA_RRECOMMENDS += " \ kernel-module-vfat \ kernel-module-ext2 \ @@ -213,5 +220,3 @@ DISTRO_EXTRA_RRECOMMENDS += " \ ${DEBUG_APPS} \ " -SEPPUKU_NEWREPORT = "http://bugs.openembedded.net/post_bug.cgi?bug_file_loc=http%3A%2F%2F&version=Angstrom%202008.x&priority=P2&bug_severity=normal&op_sys=Linux&rep_platform=Other&" - diff --git a/conf/distro/include/angstrom-uclibc.inc b/conf/distro/include/angstrom-uclibc.inc index 1f0b41f05e..86a9afd465 100644 --- a/conf/distro/include/angstrom-uclibc.inc +++ b/conf/distro/include/angstrom-uclibc.inc @@ -34,7 +34,7 @@ BUILD_OPTIMIZATION = "-Os" #Note that this testing was done without the gcc-pr32889.patch. FULL_OPTIMIZATION_avr32 = "-Os -fomit-frame-pointer" -TARGET_LINK_HASH_STYLE = "${@['-Wl,--hash-style=gnu',''][bb.data.getVar('TARGET_ARCH',d,1) in ['mips', 'mipsel']]}" +TARGET_LINK_HASH_STYLE = "${@['-Wl,--hash-style=gnu',''][bb.data.getVar('TARGET_ARCH',d,1) in ['mips', 'mipsel', 'avr32']]}" CXXFLAGS += "-fvisibility-inlines-hidden" diff --git a/conf/distro/include/fso-autorev.inc b/conf/distro/include/fso-autorev.inc index a84faf1234..f4c64b17e6 100644 --- a/conf/distro/include/fso-autorev.inc +++ b/conf/distro/include/fso-autorev.inc @@ -3,6 +3,7 @@ SRCREV_pn-dbus-hlid = "${AUTOREV}" SRCREV_pn-frameworkd = "${AUTOREV}" SRCREV_pn-frameworkd-devel = "${AUTOREV}" SRCREV_pn-fsod = "${AUTOREV}" +SRCREV_pn-fso-abyss = "${AUTOREV}" SRCREV_pn-fso-apm = "${AUTOREV}" SRCREV_pn-fso-gsm0710muxd = "${AUTOREV}" SRCREV_pn-fso-gpsd = "${AUTOREV}" @@ -11,7 +12,9 @@ SRCREV_pn-fso-sounds = "${AUTOREV}" SRCREV_pn-gsmd2 = "${AUTOREV}" SRCREV_pn-illume-theme-freesmartphone = "${AUTOREV}" SRCREV_pn-libframeworkd-glib = "${AUTOREV}" +SRCREV_pn-libgsm0710 = "${AUTOREV}" SRCREV_pn-mickeydbus = "${AUTOREV}" SRCREV_pn-mickeyterm = "${AUTOREV}" SRCREV_pn-python-pytrc = "${AUTOREV}" +SRCREV_pn-qtopia0710muxd = "${AUTOREV}" SRCREV_pn-zhone = "${AUTOREV}" diff --git a/conf/distro/include/kaeilos.inc b/conf/distro/include/kaeilos.inc new file mode 100644 index 0000000000..6d5ceb8da8 --- /dev/null +++ b/conf/distro/include/kaeilos.inc @@ -0,0 +1,292 @@ +#@TYPE: Distribution +#@NAME: KaeilOS +#@DESCRIPTION: Release independent distribution configuration for KaeilOS +#@MAINTAINER: Marco Cavallini <m.cavallini@koansoftware.com> +# KaeilOS is a registered trade mark of KOAN - Bergamo - Italia +# Product website : http://www.KaeilOS.com + +# Preserve original DISTRO value +USERDISTRO := "${DISTRO}" +DISTRO = "kaeilos" +DISTRO_NAME = "KaeilOS" + +TARGET_VENDOR = "-kaeilos" + +# Add FEED_ARCH to overrides +OVERRIDES .= ":${FEED_ARCH}" + +# Put links to sources in deploy/sources to make it easier for people to be GPL compliant +SRC_DIST_LOCAL ?= "symlink" +INHERIT += "src_distribute_local" + +# Can be "glibc", "eglibc" or "uclibc" +ANGSTROMLIBC ?= "glibc" +PSTAGE_EXTRAPATH = "${ANGSTROMLIBC}" + +CACHE = "${TMPDIR}/cache/${ANGSTROMLIBC}/${MACHINE}" +DEPLOY_DIR = "${TMPDIR}/deploy/${ANGSTROMLIBC}" +require conf/distro/include/angstrom-${ANGSTROMLIBC}.inc + +# ARM920T and up can use thumb mode to decrease binary size at the expense of speed +# (the complete story is a bit more nuanced due to cache starvation) +# KaeilOS turns on thumb for armv4t machine according to this RFC: +# http://lists.linuxtogo.org/pipermail/angstrom-distro-devel/2008-October/002714.html + +# We can't do ARM_INSTRUCTION_SET_armv4t since that will un-overridable in recipes like gcc +ANGSTROM_ARM_INSTRUCTION_SET ?= "arm" +ANGSTROM_ARM_INSTRUCTION_SET_armv4t = "thumb" +ANGSTROM_ARM_INSTRUCTION_SET_armv5te = "thumb" + + +ARM_INSTRUCTION_SET = "${ANGSTROM_ARM_INSTRUCTION_SET}" +# "arm" "thumb" +# The instruction set the compiler should use when generating application +# code. The kernel is always compiled with arm code at present. arm code +# is the original 32 bit ARM instruction set, thumb code is the 16 bit +# encoded RISC sub-set. Thumb code is smaller (maybe 70% of the ARM size) +# but requires more instructions (140% for 70% smaller code) so may be +# slower. + +THUMB_INTERWORK = "yes" +# "yes" "no" +# Whether to compile with code to allow interworking between the two +# instruction sets. This allows thumb code to be executed on a primarily +# arm system and vice versa. It is strongly recommended that DISTROs not +# turn this off - the actual cost is very small. + + +#Use this variable in feeds and other parts that need a URI +ANGSTROM_URI ?= "http://www.angstrom-distribution.org" + +#Use this variable to select which recipe you want to use to get feed configs (/etc/ipkg/, /etc/apt/sources.list) +# usefull for derivative distros and local testing +# As this is runtime we can't and won't use virtual/feed-configs +ANGSTROM_FEED_CONFIGS ?= "angstrom-feed-configs" + +#Set the default maintainer to angstrom-dev +MAINTAINER = "KaeilOS Developers <info@koansoftware.com>" + +#use debian style naming +INHERIT += "debian" + +#activate config checker +INHERIT += "sanity" + +#make devshell available as task +INHERIT += "devshell" + +#use angstrom source mirrors to combat 404s +INHERIT += "angstrom-mirrors" + +#run QA tests on builds and packages and log them +INHERIT += "insane" +QA_LOG = "1" + +ANGSTROM_PKG_FORMAT ?= "ipk" +require conf/distro/include/angstrom-package-${ANGSTROM_PKG_FORMAT}.inc + +# We don't want to keep OABI compat +ARM_KEEP_OABI = "0" + +#Generate locales on the buildsystem instead of on the target. Speeds up first boot, set to "1" to enable +PREFERRED_PROVIDER_qemu-native = "qemu-native" +ENABLE_BINARY_LOCALE_GENERATION ?= "1" + +# We only want to build UTF8 locales +LOCALE_UTF8_ONLY = "1" + +#qemu doesn't like armv6/eabi/vfp +ENABLE_BINARY_LOCALE_GENERATION_armv7a = "0" + +#qemu has taken a dislike to armeb as well +ENABLE_BINARY_LOCALE_GENERATION_armeb = "0" + +#ARM EABI is softfloat by default, but let's make sure :) +#make it overridable for platforms with FPU, like ep93xx or i.mx31 +TARGET_FPU_arm ?= "soft" +TARGET_FPU_armeb ?= "soft" +TARGET_FPU_ixp4xx ?= "soft" +TARGET_FPU_ppc405 ?= "soft" + +TARGET_FPU_armv6 ?= "hard" +TARGET_FPU_armv6-novfp ?= "soft" +TARGET_FPU_armv7a ?= "hard" +TARGET_FPU_ppc603e ?= "hard" + +# webkit-gtk and cairo have alignment issues with double instructions on armv5 so +# disable them here +TARGET_CC_ARCH_pn-webkit-gtk_armv5te = "-march=armv4t" +TARGET_CC_ARCH_pn-cairo_armv5te = "-march=armv4t" + +#Set the right arch for the feeds +#Alphabetically sorted + +FEED_ARCH ?= "${TARGET_ARCH}" + +#blackfin machines +FEED_ARCH_bfin = "blackfin" + +#armv4t machines + +FEED_ARCH_acern30 = "armv4t" +FEED_ARCH_amsdelta = "armv4t" +FEED_ARCH_ep93xx = "armv4t" +FEED_ARCH_eteng500 = "armv4t" +FEED_ARCH_om-gta01 = "armv4t" +FEED_ARCH_om-gta02 = "armv4t" +FEED_ARCH_h1940 = "armv4t" +FEED_ARCH_h6300 = "armv4t" +FEED_ARCH_kb9202 = "armv4t" +FEED_ARCH_ks8695 = "armv4t" +FEED_ARCH_rx1950 = "armv4t" +FEED_ARCH_rx3000 = "armv4t" +FEED_ARCH_sarge-at91 = "armv4t" +FEED_ARCH_smdk2440 = "armv4t" +FEED_ARCH_smdk2443 = "armv4t" + +#armv5t machines + +FEED_ARCH_a1200 = "armv5te" +FEED_ARCH_a780 = "armv5te" +FEED_ARCH_akita = "armv5te" +FEED_ARCH_asus620 = "armv5te" +FEED_ARCH_asus730 = "armv5te" +FEED_ARCH_at91sam9263ek = "armv5te" +FEED_ARCH_aximx50 = "armv5te" +FEED_ARCH_aximx50v = "armv5te" +FEED_ARCH_c7x0 = "armv5te" +FEED_ARCH_compulab-pxa270 = "armv5te" +FEED_ARCH_davinci-dvevm = "armv5te" +FEED_ARCH_devkitidp-pxa255 = "armv5te" +FEED_ARCH_e680 = "armv5te" +FEED_ARCH_er0100 = "armv5te" +FEED_ARCH_gumstix = "armv5te" +FEED_ARCH_gumstix-verdex = "armv5te" +FEED_ARCH_gumstix-connex = "armv5te" +FEED_ARCH_h1910 = "armv5te" +FEED_ARCH_h2200 = "armv5te" +FEED_ARCH_h3900 = "armv5te" +FEED_ARCH_h4000 = "armv5te" +FEED_ARCH_h5000 = "armv5te" +FEED_ARCH_htcalpine = "armv5te" +FEED_ARCH_htcapache = "armv5te" +FEED_ARCH_htcblueangel = "armv5te" +FEED_ARCH_htchimalaya = "armv5te" +FEED_ARCH_htcsable = "armv5te" +FEED_ARCH_htctornado = "armv5te" +FEED_ARCH_htcuniversal = "armv5te" +FEED_ARCH_hx2000 = "armv5te" +FEED_ARCH_hx4700 = "armv5te" +FEED_ARCH_ixp4xxle = "armv5te" +FEED_ARCH_logicpd-pxa270 = "armv5te" +FEED_ARCH_looxc550 = "armv5te" +FEED_ARCH_lsarm = "armv5te" +FEED_ARCH_magician = "armv5te" +FEED_ARCH_mainstone = "armv5te" +FEED_ARCH_mnci = "armv5te" +FEED_ARCH_mtx-3 = "armv5te" +FEED_ARCH_mx21ads = "armv5te" +FEED_ARCH_n2100 = "armv5te" +FEED_ARCH_navman-icn330 = "armv5te" +FEED_ARCH_netbook-pro = "armv5te" +FEED_ARCH_nokia770 = "armv5te" +FEED_ARCH_rokre2 = "armv5te" +FEED_ARCH_nslu2le = "armv5te" +FEED_ARCH_omap1510inn = "armv5te" +FEED_ARCH_omap1610h2 = "armv5te" +FEED_ARCH_omap1710h3 = "armv5te" +FEED_ARCH_omap5912osk = "armv5te" +FEED_ARCH_palmld = "armv5te" +FEED_ARCH_palmt650 = "armv5te" +FEED_ARCH_palmt680 = "armv5te" +FEED_ARCH_palmtc = "armv5te" +FEED_ARCH_palmtt = "armv5te" +FEED_ARCH_palmtt3 = "armv5te" +FEED_ARCH_palmtt5 = "armv5te" +FEED_ARCH_palmtx = "armv5te" +FEED_ARCH_palmz31 = "armv5te" +FEED_ARCH_palmz71 = "armv5te" +FEED_ARCH_palmz72 = "armv5te" +FEED_ARCH_poodle = "armv5te" +FEED_ARCH_qemuarm = "armv5te" +FEED_ARCH_spitz = "armv5te" +FEED_ARCH_tosa = "armv5te" +FEED_ARCH_triton = "armv5te" + +FEED_ARCH_ixp4xxbe = "armv5teb" +FEED_ARCH_nslu2be = "armv5teb" + +# armv6 + +FEED_ARCH_mx31ads = "armv6" +FEED_ARCH_mx31moboard = "armv6" +FEED_ARCH_nokia800 = "armv6" +FEED_ARCH_omap2420h4 = "armv6" +FEED_ARCH_omap2430sdp = "armv6" + +#i486 machines +FEED_ARCH_geodegx = "i486" +FEED_ARCH_geodelx = "i486" +FEED_ARCH_netvista = "i486" +FEED_ARCH_wrap = "i486" +FEED_ARCH_x86 = "i486" + +#i586 machines +FEED_ARCH_epia = "i586" +FEED_ARCH_i586-generic = "i586" +FEED_ARCH_qemux86 = "i586" + +#i686 machines + +FEED_ARCH_alix = "i686" +FEED_ARCH_colinux = "i686" +FEED_ARCH_guinness = "i686" +FEED_ARCH_i686-generic = "i686" +FEED_ARCH_progear = "i686" + +#powerpc machines + +FEED_ARCH_dht-walnut = "ppc405" +FEED_ARCH_magicbox = "ppc405" +FEED_ARCH_xilinx-ml403 = "ppc405" +FEED_ARCH_xilinx-ml410 = "ppc405" +FEED_ARCH_sequoia = "ppc440e" +FEED_ARCH_efika = "ppc603e" +FEED_ARCH_lite5200 = "ppc603e" +FEED_ARCH_lsppchd = "ppc603e" +FEED_ARCH_lsppchg = "ppc603e" +FEED_ARCH_storcenter = "ppc603e" +FEED_ARCH_turbostation = "ppc603e" +FEED_ARCH_mpc8313e-rdb = "ppce300c3" +FEED_ARCH_mpc8323e-rdb = "ppce300c2" + + +#strongarm machines, no EABI + +FEED_ARCH_collie = "arm-oabi" +FEED_ARCH_h3600 = "arm-oabi" +FEED_ARCH_h3800 = "arm-oabi" +FEED_ARCH_htcwallaby = "arm-oabi" +FEED_ARCH_jornada56x = "arm-oabi" +FEED_ARCH_jornada7xx = "arm-oabi" +FEED_ARCH_shark = "arm-oabi" +FEED_ARCH_simpad = "arm-oabi" + + +#Tweak packaging for strongarm machines since they can't use EABI + +PACKAGE_EXTRA_ARCHS_collie = "arm-oabi" +PACKAGE_EXTRA_ARCHS_h3600 = "arm-oabi" +PACKAGE_EXTRA_ARCHS_h3800 = "arm-oabi" +PACKAGE_EXTRA_ARCHS_simpad = "arm-oabi" +PACKAGE_EXTRA_ARCHS_htcwallaby = "arm-oabi" + + +#Name the generated images in a sane way +IMAGE_NAME = "${DISTRO_NAME}-${IMAGE_BASENAME}-${ANGSTROMLIBC}-${ANGSTROM_PKG_FORMAT}-${DISTRO_VERSION}-${MACHINE}" +DEPLOY_DIR_IMAGE = "${DEPLOY_DIR}/images/${MACHINE}" + +# KaeilOS *always* has some form of release config, so error out if someone thinks he knows better +DISTRO_CHECK := "${@bb.data.getVar("DISTRO_VERSION",d,1) or bb.fatal('Remove this line or set a dummy DISTRO_VERSION if you really want to build an unversioned distro')}" + +# We want images supporting the following features (for task-base) diff --git a/conf/distro/include/moko-autorev.inc b/conf/distro/include/moko-autorev.inc index 08279e8f98..ce9f488e77 100644 --- a/conf/distro/include/moko-autorev.inc +++ b/conf/distro/include/moko-autorev.inc @@ -59,8 +59,9 @@ SRCREV_pn-opkg ?= "${AUTOREV}" SRCREV_pn-opkg-native ?= "${AUTOREV}" SRCREV_pn-opkg-sdk ?= "${AUTOREV}" SRCREV_pn-packagekit ?= "${AUTOREV}" +SRCREV_pn-paroli ?= "${AUTOREV}" SRCREV_pn-pyefl-sudoku ?= "${AUTOREV}" -SRCREV_pn-python-gsmd ?= "${AUTOREV}" +SRCREV_pn-qi ?= "${AUTOREV}" SRCREV_pn-tichy ?= "${AUTOREV}" SRCREV_pn-u-boot-openmoko ?= "${AUTOREV}" SRCREV_pn-u-boot-openmoko-devel ?= "${AUTOREV}" diff --git a/conf/distro/include/preferred-om-2008-versions.inc b/conf/distro/include/preferred-om-2008-versions.inc index 433dc0d6e5..6cbd032259 100644 --- a/conf/distro/include/preferred-om-2008-versions.inc +++ b/conf/distro/include/preferred-om-2008-versions.inc @@ -56,8 +56,8 @@ PREFERRED_VERSION_aumix ?= "2.8" PREFERRED_VERSION_autoconf ?= "2.61" PREFERRED_VERSION_autoconf-native ?= "2.61" PREFERRED_VERSION_autofs ?= "4.1.4" -PREFERRED_VERSION_automake ?= "1.9.6" -PREFERRED_VERSION_automake-native ?= "1.9.6" +PREFERRED_VERSION_automake ?= "1.10" +PREFERRED_VERSION_automake-native ?= "1.10" PREFERRED_VERSION_avahi ?= "0.6.22" PREFERRED_VERSION_avahi-python ?= "0.6.21" PREFERRED_VERSION_avahi-ui ?= "0.6.21" @@ -1042,10 +1042,10 @@ PREFERRED_VERSION_libtinymail ?= "0.0.3" PREFERRED_VERSION_libtododb ?= "0.11" PREFERRED_VERSION_libtomcrypt ?= "0.97b" PREFERRED_VERSION_libtomoe-gtk ?= "0.1.0" -PREFERRED_VERSION_libtool ?= "1.5.24" -PREFERRED_VERSION_libtool-cross ?= "1.5.10" -PREFERRED_VERSION_libtool-native ?= "1.5.10" -PREFERRED_VERSION_libtool-sdk ?= "1.5.10" +PREFERRED_VERSION_libtool ?= "2.2.4" +PREFERRED_VERSION_libtool-cross ?= "2.2.4" +PREFERRED_VERSION_libtool-native ?= "2.2.4" +PREFERRED_VERSION_libtool-sdk ?= "2.2.4" PREFERRED_VERSION_libungif ?= "4.1.3" PREFERRED_VERSION_libupnp ?= "1.3.1" PREFERRED_VERSION_liburiparser ?= "0.5.1" @@ -1442,8 +1442,8 @@ PREFERRED_VERSION_pipepanic ?= "0.1.1" PREFERRED_VERSION_pivotinit ?= "1.0.0" PREFERRED_VERSION_pixman ?= "0.11.4" PREFERRED_VERSION_pixops-test ?= "1.0" -PREFERRED_VERSION_pkgconfig ?= "0.22" -PREFERRED_VERSION_pkgconfig-native ?= "0.22" +PREFERRED_VERSION_pkgconfig ?= "0.23" +PREFERRED_VERSION_pkgconfig-native ?= "0.23" PREFERRED_VERSION_plinciv ?= "0.16" PREFERRED_VERSION_plone ?= "2.1.2" PREFERRED_VERSION_plot ?= "0.28" @@ -1539,8 +1539,8 @@ PREFERRED_VERSION_python-pyfits ?= "1.1" PREFERRED_VERSION_python-pyflakes ?= "0.2.1" PREFERRED_VERSION_python-pygame ?= "1.8.1" PREFERRED_VERSION_python-pygnome ?= "2.16.2" -PREFERRED_VERSION_python-pygobject ?= "2.14.2" -PREFERRED_VERSION_python-pygobject-native ?= "2.14.2" +PREFERRED_VERSION_python-pygobject ?= "2.16.0" +PREFERRED_VERSION_python-pygobject-native ?= "2.16.0" PREFERRED_VERSION_python-pygoogle ?= "0.6" PREFERRED_VERSION_python-pygtk-1.2 ?= "0.6.12" PREFERRED_VERSION_python-pygtk ?= "2.10.4" diff --git a/conf/distro/include/preferred-slugos-versions.inc b/conf/distro/include/preferred-slugos-versions.inc new file mode 100644 index 0000000000..1c69b14fa6 --- /dev/null +++ b/conf/distro/include/preferred-slugos-versions.inc @@ -0,0 +1,95 @@ +#===============================================================================# +#===============================================================================# +# NOTE NOTE NOTE +# +# This *forces* the preferred kernel version; making it unable to be overridden +# in the local.conf file. This is a Very Bad Thing. This is temporary, and +# is intended to facilitate some SlugOS-specific testing without disturbing +# other distros that use the ixp4xx machine type (which is currently where the +# preferred kernel version is set). +# +# This *must* be removed after initial testing is completed. MJW 08-Dec-2008 +# +PREFERRED_VERSION_linux-ixp4xx = "2.6.27.8+svnr${SRCREV}" +# +#===============================================================================# +#===============================================================================# +# NOTE NOTE NOTE +# +# Override the sane-srcrev file with regard to the opkg versions - this should +# be removed as soon as opkg starts to work correctly again as newer opkg +# versions fix a number of bugs and add some desireable features. +# +SRCREV_pn-opkg = "160" +SRCREV_pn-opkg-native = "160" +SRCREV_pn-opkg-sdk = "160" +# +#===============================================================================# +#===============================================================================# + +### Standard package preferred versions go here, sorted +### alphabetically. Note that the main slugos.inc file +### may include preferred versions for toolchain components. + +PREFERRED_VERSION_automake-native ?= "1.10" +PREFERRED_VERSION_binutils ?= "2.18.50.0.7" +PREFERRED_VERSION_binutils-cross ?= "2.18.50.0.7" +PREFERRED_VERSION_binutils-cross-sdk ?= "2.18.50.0.7" +PREFERRED_VERSION_busybox ?= "1.13.2" +PREFERRED_VERSION_dbus ?= "1.2.1" +PREFERRED_VERSION_gcc ?= "4.2.4" +PREFERRED_VERSION_gcc-cross ?= "4.2.4" +PREFERRED_VERSION_gcc-cross-sdk ?= "4.2.4" +PREFERRED_VERSION_gcc-cross-initial ?= "4.2.4" +PREFERRED_VERSION_gcc-cross-intermediate ?= "4.2.4" +PREFERRED_VERSION_glib-2.0 ?= "2.18.3" +PREFERRED_VERSION_glib-2.0-native ?= "2.18.0" +PREFERRED_VERSION_glibc ?= "2.6.1" +PREFERRED_VERSION_glibc-initial ?= "2.6.1" +PREFERRED_VERSION_ipkg ?= "0.99.163" +PREFERRED_VERSION_ipkg-native ?= "0.99.163" +PREFERRED_VERSION_libtool ?= "1.5.10" +PREFERRED_VERSION_libtool-native ?= "1.5.10" +PREFERRED_VERSION_libtool-cross ?= "1.5.10" +PREFERRED_VERSION_libtool-sdk ?= "1.5.10" +PREFERRED_VERSION_linux-libc-headers ?= "2.6.23" +PREFERRED_VERSION_m4 ?= "1.4.8" +PREFERRED_VERSION_m4-native ?= "1.4.8" +PREFERRED_VERSION_netatalk ?= "2.0.3" +PREFERRED_VERSION_nslu2-linksys-firmware ?= "2.3r63" +PREFERRED_VERSION_pkgconfig ?= "0.23" +PREFERRED_VERSION_pkgconfig-native ?= "0.23" +PREFERRED_VERSION_udev ?= "118" + +##################### Stuff with special notes, and broken stuff: + +# Hack alert - selecting this version of libusb effectively selects +# the use of libusb1 and libusb-compat in the case that something +# still depends on libusb. This is required because otherwise +# libusb will overwrite libusb-compat in staging. +PREFERRED_VERSION_libusb ?= "0.0.0" + +# mtd-utils 1.2.0+git cannot be fetched, so SlugOS will stick +# with 1.1.0 for now: +PREFERRED_VERSION_mtd-utils ?= "1.1.0" + +# boost 1.36 won't build +PREFERRED_VERSION_boost ?= "1.33.1" + +####################### Obsolete stuff, not sure why we keep this: + +# New pango and older glib-2.0 versions don't mix, +# so specify exactly what we would like to build. +#PREFERRED_VERSION_pango ?= "1.20.5" +#PREFERRED_VERSION_glib-2.0 ?= "2.16.1" +#PREFERRED_VERSION_cairo ?= "1.4.8" +# +# Stick with an older gettext and e2fsprogs stuff +# and gnutls... (our autotools is too old at the moment) +#PREFERRED_VERSION_gnutls ?= "1.6.3" +#PREFERRED_VERSION_gettext ?= "0.14.1" +#PREFERRED_VERSION_gettext-native ?= "0.14.1" +#PREFERRED_VERSION_e2fsprogs-libs ?= "1.39" +#PREFERRED_VERSION_e2fsprogs ?= "1.38" +#PREFERRED_VERSION_e2fsprogs-native ?= "1.38" + diff --git a/conf/distro/include/preferred-xorg-versions-X11R7.4-updates.inc b/conf/distro/include/preferred-xorg-versions-X11R7.4-updates.inc index a81d5eca71..1f6076525f 100644 --- a/conf/distro/include/preferred-xorg-versions-X11R7.4-updates.inc +++ b/conf/distro/include/preferred-xorg-versions-X11R7.4-updates.inc @@ -2,6 +2,6 @@ PREFERRED_VERSION_xserver-xorg ?= "1.5.3" PREFERRED_VERSION_xf86-input-evdev ?= "2.1.0" +PREFERRED_VERSION_xf86-video-geode ?= "2.11.0" PREFERRED_VERSION_libxi ?= "1.2.0" PREFERRED_VERSION_inputproto ?= "1.5.0" - diff --git a/conf/distro/include/sane-srcrevs.inc b/conf/distro/include/sane-srcrevs.inc index ecc3d0917e..15baf2b144 100644 --- a/conf/distro/include/sane-srcrevs.inc +++ b/conf/distro/include/sane-srcrevs.inc @@ -57,7 +57,7 @@ SRCREV_pn-flashrom ?= "3682" SRCREV_pn-frameworkd ?= "700ab8250582767628165b7cf6f671ef756ba56d" SRCREV_pn-frameworkd-devel ?= "${SRCREV_pn-frameworkd}" SRCREV_pn-fsod ?= "3fa5eb6f2edcf7c9f0fc2027fda47b91d9f0f136" -SRCREV_pn-fso-abyss ?= "4afeacb21c3d4193289e2b7db549a91751d75195" +SRCREV_pn-fso-abyss ?= "09fd818470bb0da3b7614804f5141be52e0942c1" SRCREV_pn-fso-apm ?= "eb39ce7fb81bfa64e1a9eb5f142ca3d1065be3fa" SRCREV_pn-fso-gpsd ?= "78fe48dffb923175bde9f0aabc3500a9264a57e0" SRCREV_pn-fso-gsm0710muxd ?= "abcbcd7cc532a8834906de3fc24c8f8fe7643cd4" @@ -82,8 +82,9 @@ SRCREV_pn-libefso ?= "60" SRCREV_pn-libexalt ?= "78" SRCREV_pn-libexalt-dbus ?= "76" SRCREV_pn-libfakekey ?= "1455" -SRCREV_pn-libframeworkd-glib ?= "703017c8f874a325d917931378071c614597110e" +SRCREV_pn-libframeworkd-glib ?= "e90f7c208356b53c34e025585248ea0a7a2ea13c" SRCREV_pn-libgdbus ?= "aeab6e3c0185b271ca343b439470491b99cc587f" +SRCREV_pn-libgsm0710 ?= "a05704a56003dc02dca784cef4176e97eaf9f688" SRCREV_pn-libgsmd ?= "4505" SRCREV_pn-libiac ?= "1590" SRCREV_pn-libjana ?= "713" @@ -196,10 +197,11 @@ SRCREV_pn-pygsm ?= "976477f6b403f422b4ea730f71ebf409f6671141" SRCREV_pn-pylgrim ?= "20" SRCREV_pn-pyneod ?= "41de4d538b50b27ab2a2f5aae1a180b880a05b6a" SRCREV_pn-pyneog ?= "41de4d538b50b27ab2a2f5aae1a180b880a05b6a" -SRCREV_pn-python-coherence ?= "1154" +SRCREV_pn-python-coherence ?= "1161" SRCREV_pn-python-connexion ?= "1439" SRCREV_pn-python-formencode ?= "3148" SRCREV_pn-python-gsmd ?= "148" +SRCREV_pn-python-pycrypto ?= "d087280d7e9643a3e3f68f209932119fe6738b3c" SRCREV_pn-python-pyrtc ?= "eb39ce7fb81bfa64e1a9eb5f142ca3d1065be3fa" SRCREV_pn-python-pyyaml ?= "344" QEMUSRCREV ?= "4242" @@ -207,7 +209,7 @@ SRCREV_pn-tslib ?= "53" SRCREV_pn-qemu-native ?= "${QEMUSRCREV}" SRCREV_pn-qemu-sdk ?= "${QEMUSRCREV}" SRCREV_pn-qemu ?= "${QEMUSRCREV}" -SRCREV_pn-qi ?= "ed52486b43dca91891305b9e832c8366a2742798" +SRCREV_pn-qi ?= "1fc83905fe99da92ff18e6ba671ee339477b1b9e" SRCREV_pn-remoko ?= "121" SRCREV_pn-remoko-server ?= "121" SRCREV_pn-s3c24xx-gpio ?= "4130" @@ -229,12 +231,13 @@ SRCREV_pn-uclibc-initial ?= "24279" SRCREV_pn-usbpath ?= "3172" SRCREV_pn-usbpath-native ?= "3172" SRCREV_pn-vala-terminal ?= "94117f453ce884e9c30b611fae6fc19f85f98f2b" -SRCREV_pn-webkit-gtk ?= "39964" +SRCREV_pn-webkit-gtk ?= "40814" SRCREV_pn-webkit-qt ?= "28656" SRCREV_pn-webkit-qtopia ?= "28656" SRCREV_pn-wlan-ng-modules ?= "1859" SRCREV_pn-wlan-ng-utils ?= "1859" SRCREV_pn-wmiconfig ?= "4522" +SRCREV_pn-xf86-video-glamo ?= "8062d7aa7bac7e06c1a00bd88ca78098550606ed" SRCREV_pn-xoo ?= "1971" SRCREV_pn-xserver-kdrive-glamo ?= "9b28d998424c77fbc057dd3a022ccbb122793a52" SRCREV_pn-zhone ?= "f38cc52fbf11f7fe945797a6b8ade29ed479d924" diff --git a/conf/distro/include/slugos.inc b/conf/distro/include/slugos.inc index c74624b0ed..0f88755f8d 100644 --- a/conf/distro/include/slugos.inc +++ b/conf/distro/include/slugos.inc @@ -5,45 +5,6 @@ # WARNING: this file should not be used directly, use one of # the supported slugos-derived distributions instead. -#===============================================================================# -#===============================================================================# -#===============================================================================# -# NOTE NOTE NOTE -# -# This *forces* the preferred kernel version; making it unable to be overridden -# in the local.conf file. This is a Very Bad Thing. This is temporary, and -# is intended to facilitate some SlugOS-specific testing without disturbing -# other distros that use the ixp4xx machine type (which is currently where the -# preferred kernel version is set). -# -# This *must* be removed after initial testing is completed. MJW 08-Dec-2008 -# -PREFERRED_VERSION_linux-ixp4xx = "2.6.27.8+svnr${SRCREV}" -# -#===============================================================================# -#===============================================================================# -#===============================================================================# - - - -#===============================================================================# -#===============================================================================# -#===============================================================================# -# NOTE NOTE NOTE -# -# Override the sane-srcrev file with regard to the opkg versions - this should -# be removed as soon as opkg starts to work correctly again as newer opkg -# versions fix a number of bugs and add some desireable features. -# -SRCREV_pn-opkg = "160" -SRCREV_pn-opkg-native = "160" -SRCREV_pn-opkg-sdk = "160" -# -#===============================================================================# -#===============================================================================# -#===============================================================================# - - #---------------------------------------------------------------------------------- # STANDARD SLUGOS DEFINITIONS #---------------------------------------------------------------------------------- @@ -92,9 +53,7 @@ FULL_OPTIMIZATION = "-fexpensive-optimizations -fomit-frame-pointer -frename-reg # We need to keep OABI compat for things like madwifi-ng. ARM_KEEP_OABI = "1" -# We may wish to experiment with this as a further performance improvement, but -# small steps at a time are the best strategy. -#TARGET_LINK_HASH_STYLE = "-Wl,--hash-style=gnu" +TARGET_LINK_HASH_STYLE = "-Wl,--hash-style=gnu" CXXFLAGS += "-fvisibility-inlines-hidden" @@ -141,6 +100,12 @@ DISTRO_EXTRA_DEPENDS ?= "" DISTRO_EXTRA_RDEPENDS ?= "" DISTRO_EXTRA_RRECOMMENDS ?= "" +CVS_TARBALL_STASH = "http://sources.nslu2-linux.org/sources/" +INHERIT += "nslu2-mirrors" + +#FIXME: HACK: REMOVE THIS +IGNORE_STRIP_ERRORS = "" + #---------------------------------------------------------------------------------- # PACKAGE VERSION CONTROL #---------------------------------------------------------------------------------- @@ -150,127 +115,60 @@ DISTRO_EXTRA_RRECOMMENDS ?= "" # kernel, so there has to be a non-libc gcc to build the kernel!) # Virtuals: -PREFERRED_PROVIDER_virtual/${TARGET_PREFIX}gcc-initial = "gcc-cross-initial" +PREFERRED_PROVIDER_virtual/${TARGET_PREFIX}gcc-initial = "gcc-cross-initial" PREFERRED_PROVIDER_virtual/${TARGET_PREFIX}gcc-intermediate = "gcc-cross-intermediate" -PREFERRED_PROVIDER_virtual/${TARGET_PREFIX}gcc = "gcc-cross" -PREFERRED_PROVIDER_virtual/${TARGET_PREFIX}g++ = "gcc-cross" +PREFERRED_PROVIDER_virtual/${TARGET_PREFIX}gcc = "gcc-cross" +PREFERRED_PROVIDER_virtual/${TARGET_PREFIX}g++ = "gcc-cross" #Set preferred provider for the C library that is used to build the crosscompiler (NPTL voodoo) -PREFERRED_PROVIDER_virtual/${TARGET_PREFIX}libc-for-gcc = "glibc" -PREFERRED_PROVIDER_virtual/arm-linux-libc-for-gcc = "glibc" -PREFERRED_PROVIDER_virtual/armeb-linux-libc-for-gcc = "glibc" -PREFERRED_PROVIDER_virtual/arm-linux-gnueabi-libc-for-gcc = "glibc" -PREFERRED_PROVIDER_virtual/armeb-linux-gnueabi-libc-for-gcc = "glibc" +PREFERRED_PROVIDER_virtual/${TARGET_PREFIX}libc-for-gcc = "glibc" +PREFERRED_PROVIDER_virtual/arm-linux-libc-for-gcc = "glibc" +PREFERRED_PROVIDER_virtual/armeb-linux-libc-for-gcc = "glibc" +PREFERRED_PROVIDER_virtual/arm-linux-gnueabi-libc-for-gcc = "glibc" +PREFERRED_PROVIDER_virtual/armeb-linux-gnueabi-libc-for-gcc = "glibc" # Set the preferred provider for a few toolchain-related items, otherwise # these may be selected from the external-toolchain instead. -PREFERRED_PROVIDER_virtual/${TARGET_PREFIX}binutils = "binutils-cross" -PREFERRED_PROVIDER_virtual/arm-linux-binutils = "binutils-cross" -PREFERRED_PROVIDER_virtual/armeb-linux-binutils = "binutils-cross" -PREFERRED_PROVIDER_linux-libc-headers = "linux-libc-headers" - -# compiler/binary/library versions -PREFERRED_VERSION_binutils ?= "2.18.50.0.7" -PREFERRED_VERSION_binutils-cross ?= "2.18.50.0.7" -PREFERRED_VERSION_binutils-cross-sdk ?= "2.18.50.0.7" -PREFERRED_VERSION_gcc ?= "4.2.4" -PREFERRED_VERSION_gcc-cross ?= "4.2.4" -PREFERRED_VERSION_gcc-cross-sdk ?= "4.2.4" -PREFERRED_VERSION_gcc-cross-initial ?= "4.2.4" -PREFERRED_VERSION_gcc-cross-intermediate ?= "4.2.4" -PREFERRED_VERSION_glibc ?= "2.6.1" -PREFERRED_VERSION_glibc-initial ?= "2.6.1" +PREFERRED_PROVIDER_virtual/${TARGET_PREFIX}binutils = "binutils-cross" +PREFERRED_PROVIDER_virtual/arm-linux-binutils = "binutils-cross" +PREFERRED_PROVIDER_virtual/armeb-linux-binutils = "binutils-cross" +PREFERRED_PROVIDER_linux-libc-headers = "linux-libc-headers" # Select the smallest provider of x11 libraries -PREFERRED_PROVIDER_virtual/libx11 ?= "diet-x11" -SRCDATE_diet-x11 ?= "20060106" - -# Ensure consistency across all SlugOS builds for the provider of a -# relational database - use the latest version of the SleepyCat -# Berkeley database -PREFERRED_PROVIDER_virtual/db = "db" -PREFERRED_PROVIDER_virtual/db-native = "db-native" - -SRCDATE_ipkg-utils ?= "20060106" -SRCDATE_ipkg-utils-native ?= "20060106" -SRCDATE_ipkg-link ?= "20060106" -SRCDATE_irssi ?= "20050930" - -CVS_TARBALL_STASH = "http://sources.nslu2-linux.org/sources/" -INHERIT += "nslu2-mirrors" - -PREFERRED_VERSION_nslu2-linksys-firmware ?= "2.3r63" - -PREFERRED_VERSION_ipkg ?= "0.99.163" -PREFERRED_VERSION_ipkg-native ?= "0.99.163" - -#FIXME: HACK: REMOVE THIS -IGNORE_STRIP_ERRORS = "" - -PREFERRED_VERSION_linux-libc-headers ?= "2.6.23" +PREFERRED_PROVIDER_virtual/libx11 = "diet-x11" +SRCDATE_diet-x11 ?= "20060106" -# New pango and older glib-2.0 versions don't mix, -# so specify exactly what we would like to build. -#PREFERRED_VERSION_pango ?= "1.20.5" -#PREFERRED_VERSION_glib-2.0 ?= "2.16.1" -#PREFERRED_VERSION_cairo ?= "1.4.8" +# Ensure consistency across all SlugOS builds for the provider of a relational +# database - use the latest version of the SleepyCat Berkeley database +PREFERRED_PROVIDER_virtual/db = "db" +PREFERRED_PROVIDER_virtual/db-native = "db-native" -PREFERRED_VERSION_udev ?= "118" - -# Stick with an older gettext and e2fsprogs stuff -# and gnutls... (our autotools is too old at the moment) -#PREFERRED_VERSION_gnutls ?= "1.6.3" -#PREFERRED_VERSION_gettext ?= "0.14.1" -#PREFERRED_VERSION_gettext-native ?= "0.14.1" -#PREFERRED_VERSION_e2fsprogs-libs ?= "1.39" -#PREFERRED_VERSION_e2fsprogs ?= "1.38" -#PREFERRED_VERSION_e2fsprogs-native ?= "1.38" +SRCDATE_ipkg-utils ?= "20060106" +SRCDATE_ipkg-utils-native ?= "20060106" +SRCDATE_ipkg-link ?= "20060106" +SRCDATE_irssi ?= "20050930" # we don't ship gtk-directfb by default -PREFERRED_PROVIDER_gtk+ ?= "gtk+" -PREFERRED_PROVIDER_gdk-pixbuf-loader-ani ?= "gtk+" -PREFERRED_PROVIDER_gdk-pixbuf-loader-bmpg ?= "gtk+" -PREFERRED_PROVIDER_gdk-pixbuf-loader-gif ?= "gtk+" -PREFERRED_PROVIDER_gdk-pixbuf-loader-ico ?= "gtk+" -PREFERRED_PROVIDER_gdk-pixbuf-loader-jpeg ?= "gtk+" -PREFERRED_PROVIDER_gdk-pixbuf-loader-pcx ?= "gtk+" -PREFERRED_PROVIDER_gdk-pixbuf-loader-png ?= "gtk+" -PREFERRED_PROVIDER_gdk-pixbuf-loader-pnm ?= "gtk+" -PREFERRED_PROVIDER_gdk-pixbuf-loader-ras ?= "gtk+" -PREFERRED_PROVIDER_gdk-pixbuf-loader-tga ?= "gtk+" -PREFERRED_PROVIDER_gdk-pixbuf-loader-wbmp ?= "gtk+" -PREFERRED_PROVIDER_gdk-pixbuf-loader-xbm ?= "gtk+" -PREFERRED_PROVIDER_gdk-pixbuf-loader-xpm ?= "gtk+" - -PREFERRED_PROVIDER_avahi ?= "avahi" -PREFERRED_PROVIDER_gconf ?= "gconf" - -# These shouldn't be here either -- these versions should -# be pulled from a separate include file. But they can -# go here for now. -PREFERRED_VERSION_automake-native ?= "1.10" -PREFERRED_VERSION_busybox ?= "1.13.2" -PREFERRED_VERSION_dbus ?= "1.2.1" -PREFERRED_VERSION_glib-2.0 ?= "2.18.3" -PREFERRED_VERSION_glib-2.0-native ?= "2.18.0" -PREFERRED_VERSION_libtool ?= "1.5.10" -PREFERRED_VERSION_libtool-native ?= "1.5.10" -PREFERRED_VERSION_libtool-cross ?= "1.5.10" -PREFERRED_VERSION_libtool-sdk ?= "1.5.10" -PREFERRED_VERSION_m4 ?= "1.4.8" -PREFERRED_VERSION_m4-native ?= "1.4.8" -PREFERRED_VERSION_pkgconfig ?= "0.23" -PREFERRED_VERSION_pkgconfig-native ?= "0.23" - -# Hack alert - selecting this version of libusb effectively selects -# the use of libusb1 and libusb-compat in the case that something -# still depends on libusb. This is required because otherwise -# libusb will overwrite libusb-compat in staging. -PREFERRED_VERSION_libusb ?= "0.0.0" - -# mtd-utils 1.2.0+git cannot be fetched, so SlugOS will stick -# with 1.1.0 for now: -PREFERRED_VERSION_mtd-utils ?= "1.1.0" - +PREFERRED_PROVIDER_gtk+ ?= "gtk+" +PREFERRED_PROVIDER_gdk-pixbuf-loader-ani ?= "gtk+" +PREFERRED_PROVIDER_gdk-pixbuf-loader-bmpg ?= "gtk+" +PREFERRED_PROVIDER_gdk-pixbuf-loader-gif ?= "gtk+" +PREFERRED_PROVIDER_gdk-pixbuf-loader-ico ?= "gtk+" +PREFERRED_PROVIDER_gdk-pixbuf-loader-jpeg ?= "gtk+" +PREFERRED_PROVIDER_gdk-pixbuf-loader-pcx ?= "gtk+" +PREFERRED_PROVIDER_gdk-pixbuf-loader-png ?= "gtk+" +PREFERRED_PROVIDER_gdk-pixbuf-loader-pnm ?= "gtk+" +PREFERRED_PROVIDER_gdk-pixbuf-loader-ras ?= "gtk+" +PREFERRED_PROVIDER_gdk-pixbuf-loader-tga ?= "gtk+" +PREFERRED_PROVIDER_gdk-pixbuf-loader-wbmp ?= "gtk+" +PREFERRED_PROVIDER_gdk-pixbuf-loader-xbm ?= "gtk+" +PREFERRED_PROVIDER_gdk-pixbuf-loader-xpm ?= "gtk+" + +PREFERRED_PROVIDER_avahi ?= "avahi" +PREFERRED_PROVIDER_gconf ?= "gconf" + +# Include any package preferred versions and srcrevs: + +require conf/distro/include/preferred-slugos-versions.inc require conf/distro/include/sane-srcdates.inc require conf/distro/include/sane-srcrevs.inc diff --git a/conf/distro/kaeilos.conf b/conf/distro/kaeilos.conf new file mode 100644 index 0000000000..fac86c8667 --- /dev/null +++ b/conf/distro/kaeilos.conf @@ -0,0 +1,187 @@ +#@-------------------------------------------------------------------- +#@TYPE: Distribution +#@NAME: KaeilOS +#@DESCRIPTION: KaeilOS Linux Distribution for Kernel 2.6 based devices +#@MAINTAINER: Marco Cavallini <m.cavallini@koansoftware.com> +#@-------------------------------------------------------------------- + +#DISTRO_VERSION = "2008.1" +DISTRO_VERSION = "2008.1-test-${DATE}" +DISTRO_REVISION = "1" +DISTRO_PR = ".1" + +#build staging from packages +INHERIT += "packaged-staging" + +require conf/distro/include/sane-srcdates.inc +require conf/distro/include/sane-srcrevs.inc +require conf/distro/include/angstrom-2008-preferred-versions.inc +require conf/distro/include/preferred-opie-versions-1.2.4.inc + +PREFERRED_VERSION_xserver-kdrive = "1.3.0.0" +PREFERRED_VERSION_busybox = "1.13.2" + +DISTRO_DEV_MANAGER = "busybox-mdev" + +#Images built can have to modes: +# 'debug': empty rootpassword, strace included +# 'release' no root password, no strace and gdb by default +DISTRO_TYPE ?= "debug" +#DISTRO_TYPE = "release" + +# Ship just basic locale by default. Locales are big (~1Mb uncompr.), so +# shipping some adhoc subset will be still useless and size burden for +# users of all other languages/countries. Instead, worth to make it easy +# to install additional languages: installer/wizard + metapackages which +# will RRECOMMEND as much as possible content for a given language +# (locales, UI transalations, help, etc. - useless for pros, but really +# helpful for common users). +# Also, it appears that no locales fit in 16Mb for now. "C" locale rules! +IMAGE_LINGUAS = '${@base_less_or_equal("ROOT_FLASH_SIZE", "16", "", "en-us", d)}' + + +# set feed path variables +FEED_BASEPATH = "feeds/2008/${ANGSTROM_PKG_FORMAT}/${ANGSTROMLIBC}/" + + +#The angstrom-mirrors.bbclass should have everything, but we can use this as a fallback +CVS_TARBALL_STASH ?= "\ + http://www.angstrom-distribution.org/unstable/sources/ \ + " + +PCMCIA_MANAGER = "pcmciautils" + +#This is unrelated to the kernel version, but userspace apps (e.g. HAL) require a recent version to build against +PREFERRED_VERSION_linux-libc-headers = "2.6.23" + +#Prefer glibc 2.6 and uclibc 0.9.30, these have had the most testing. +PREFERRED_VERSION_glibc ?= "2.6.1" +PREFERRED_VERSION_glibc-initial ?= "2.6.1" +PREFERRED_VERSION_uclibc ?= "0.9.30" +PREFERRED_VERSION_uclibc-initial ?= "0.9.30" + +PREFERRED_PROVIDER_avahi = "avahi" + +#Small machines prefer kdrive, but we might ship full Xorg in other images +PREFERRED_PROVIDER_virtual/xserver ?= "xserver-kdrive" +PREFERRED_PROVIDER_xserver ?= "xserver-kdrive" + +#powerpc needs additional patches to gcc +ANGSTROM_GCC_VERSION_ppc405 ?= "4.1.1" +ANGSTROM_GCC_VERSION_xilinx-ml403 ?= "4.1.1" +ANGSTROM_GCC_VERSION_xilinx-ml403 ?= "4.1.1" + +# Blackfin has its own gcc +ANGSTROM_GCC_VERSION_bfin = "4.1.2" + +#for proper NEON support we need a CSL toolchain +#ANGSTROM_GCC_VERSION_armv7a = "4.2.1+csl-arm-2007q3-53" +ANGSTROM_GCC_VERSION_armv7a = "4.3.1" + +#Horrible workaround for armv7a follows: +# gcc 4.3.1 builds a kernel that oopses with a null-pointer in the rcu-update function +# gcc 4.2.1 (the one from *gasp* csl) builds a working kernel, but non-working userspace + +KERNEL_CCSUFFIX_armv7a= "-4.2.1+csl-arm-2007q3-53" + +#avr32 only has support for gcc 4.2.2 +ANGSTROM_GCC_VERSION_avr32 ?= "4.2.2" + +#Everybody else can just use this: +ANGSTROM_GCC_VERSION ?= "4.2.4" +PREFERRED_VERSION_binutils ?= "2.18.50.0.7" +PREFERRED_VERSION_binutils-cross ?= "2.18.50.0.7" +PREFERRED_VERSION_binutils-cross-sdk ?= "2.18.50.0.7" + +PREFERRED_VERSION_gcc ?= "${ANGSTROM_GCC_VERSION}" +PREFERRED_VERSION_gcc-cross ?= "${ANGSTROM_GCC_VERSION}" +PREFERRED_VERSION_gcc-cross-sdk ?= "${ANGSTROM_GCC_VERSION}" +PREFERRED_VERSION_gcc-cross-initial ?= "${ANGSTROM_GCC_VERSION}" +PREFERRED_VERSION_gcc-cross-intermediate ?= "${ANGSTROM_GCC_VERSION}" + +#Loads preferred versions from files, these have weak assigments (?=), so put them at the bottom +require conf/distro/include/preferred-e-versions.inc +require conf/distro/include/preferred-xorg-versions-X11R7.4-updates.inc +require conf/distro/include/preferred-xorg-versions-X11R7.4.inc + +#avr32 only has patches for binutils 2.17 in OE +PREFERRED_VERSION_binutils_avr32 = "2.17" +PREFERRED_VERSION_binutils-cross_avr32 = "2.17" +PREFERRED_VERSION_binutils-cross-sdk_avr32 = "2.17" + +# Virtuals: +PREFERRED_PROVIDER_virtual/${TARGET_PREFIX}binutils = "binutils-cross" +PREFERRED_PROVIDER_virtual/${TARGET_PREFIX}gcc-initial = "gcc-cross-initial" +PREFERRED_PROVIDER_virtual/${TARGET_PREFIX}gcc-intermediate = "gcc-cross-intermediate" +PREFERRED_PROVIDER_virtual/${TARGET_PREFIX}gcc = "gcc-cross" +PREFERRED_PROVIDER_virtual/${TARGET_PREFIX}g++ = "gcc-cross" + +# hostap stuff, we prefer the in-kernel modules, but those don't work for all machines +PREFERRED_PROVIDER_hostap-conf ?= "hostap-conf" + +PREFERRED_PROVIDER_virtual/db ?= "db" +PREFERRED_PROVIDER_virtual/db-native ?= "db-native" +PREFERRED_PROVIDER_virtual/libsdl ?= "libsdl-x11" +PREFERRED_PROVIDER_virtual/libx11 ?= "libx11" +PREFERRED_PROVIDER_virtual/libxine ?= "libxine-x11" +PREFERRED_PROVIDER_virtual/xserver ?= "xserver-kdrive" + +# Others: +PREFERRED_PROVIDER_linux-libc-headers = "linux-libc-headers" +PREFERRED_PROVIDER_dbus-glib = "dbus-glib" +PREFERRED_PROVIDER_esound ?= "pulseaudio" +PREFERRED_PROVIDER_gconf ?= "gconf-dbus" +PREFERRED_PROVIDER_gnome-vfs ?= "gnome-vfs" +PREFERRED_PROVIDER_gnome-vfs-plugin-file ?= "gnome-vfs" +PREFERRED_PROVIDER_tslib ?= "tslib" +PREFERRED_PROVIDER_tslib-conf ?= "tslib" +PREFERRED_PROVIDER_libgpewidget ?= "libgpewidget" +PREFERRED_PROVIDER_ntp ?= "ntp" +PREFERRED_PROVIDER_hotplug = "udev" +PREFERRED_PROVIDER_libxss = "libxss" +PREFERRED_PROVIDER_bluez-utils-dbus = "bluez-utils" + +# we don't ship gtk-directfb by default +PREFERRED_PROVIDER_gtk+ ?= "gtk+" +PREFERRED_PROVIDER_gdk-pixbuf-loader-ani ?= "gtk+" +PREFERRED_PROVIDER_gdk-pixbuf-loader-bmpg ?= "gtk+" +PREFERRED_PROVIDER_gdk-pixbuf-loader-gif ?= "gtk+" +PREFERRED_PROVIDER_gdk-pixbuf-loader-ico ?= "gtk+" +PREFERRED_PROVIDER_gdk-pixbuf-loader-jpeg ?= "gtk+" +PREFERRED_PROVIDER_gdk-pixbuf-loader-pcx ?= "gtk+" +PREFERRED_PROVIDER_gdk-pixbuf-loader-png ?= "gtk+" +PREFERRED_PROVIDER_gdk-pixbuf-loader-pnm ?= "gtk+" +PREFERRED_PROVIDER_gdk-pixbuf-loader-ras ?= "gtk+" +PREFERRED_PROVIDER_gdk-pixbuf-loader-tga ?= "gtk+" +PREFERRED_PROVIDER_gdk-pixbuf-loader-wbmp ?= "gtk+" +PREFERRED_PROVIDER_gdk-pixbuf-loader-xbm ?= "gtk+" +PREFERRED_PROVIDER_gdk-pixbuf-loader-xpm ?= "gtk+" + +#Silence a warning during parsing +PREFERRED_PROVIDER_task-bootstrap = "task-bootstrap" + +require conf/distro/include/kaeilos.inc + +# do some task-base stuff here + +# We want to ship extra debug utils in the rootfs when doing a debug build +DEBUG_APPS ?= "" +DEBUG_APPS += '${@base_conditional("DISTRO_TYPE", "release", "", "strace procps",d)}' + +# KaeilOS want to ship some extra stuff. This should be moved into task-base eventually +# contains ipkg specific stuff as well :( +DISTRO_EXTRA_RDEPENDS += "\ + update-modules \ + ${@base_contains("MACHINE_FEATURES", "screen", "psplash", "",d)} \ + kaeilos-version \ + opkg-nogpg opkg-collateral ${ANGSTROM_FEED_CONFIGS} \ + util-linux-ng-mount util-linux-ng-umount \ + ${DEBUG_APPS} angstrom-libc-fixup-hack \ + " + +DISTRO_EXTRA_RRECOMMENDS += " \ + kernel-module-vfat \ + kernel-module-ext2 \ + kernel-module-af-packet \ + openssh-sftp-server \ + " diff --git a/conf/machine/beagleboard.conf b/conf/machine/beagleboard.conf index c95c373d2c..78c63019ae 100644 --- a/conf/machine/beagleboard.conf +++ b/conf/machine/beagleboard.conf @@ -32,6 +32,21 @@ UBOOT_ENTRYPOINT = "0x80008000" UBOOT_LOADADDRESS = "0x80008000" UBOOT_MACHINE = "omap3_beagle_config" +# do ubiattach /dev/ubi_ctrl -m 4 +# From dmesg: +# UBI: smallest flash I/O unit: 2048 +# UBI: logical eraseblock size: 129024 bytes +# from ubiattach stdout: +# UBI device number 0, total 1996 LEBs +MKUBIFS_ARGS = "-m 2048 -e 129024 -c 1996" + +# do ubiattach /dev/ubi_ctrl -m 4 +# from dmesg: +# UBI: smallest flash I/O unit: 2048 +# UBI: physical eraseblock size: 131072 bytes (128 KiB) +# UBI: sub-page size: 512 +UBINIZE_ARGS = "-m 2048 -p 128KiB -s 512" + PREFERRED_VERSION_u-boot = "git" EXTRA_IMAGEDEPENDS += "u-boot x-load" diff --git a/conf/machine/collie.conf b/conf/machine/collie.conf index b26df9dfea..6d09406375 100644 --- a/conf/machine/collie.conf +++ b/conf/machine/collie.conf @@ -13,7 +13,7 @@ SERIAL_CONSOLE = "115200 ttySA0" ROOT_FLASH_SIZE = "14" # actually 14680064, see EXTRA_IMAGECMD -PREFERRED_PROVIDER_virtual/kernel = "linux-rp" +PREFERRED_PROVIDER_virtual/kernel = "linux" PREFERRED_PROVIDER_virtual/xserver = "xserver-kdrive" XSERVER ?= "xserver-kdrive-fbdev" diff --git a/conf/machine/include/kexecboot.inc b/conf/machine/include/kexecboot.inc index c8656bb117..1835af4727 100644 --- a/conf/machine/include/kexecboot.inc +++ b/conf/machine/include/kexecboot.inc @@ -13,4 +13,4 @@ RDEPENDS_kernel-base = "kernel-image" # we store kernel images in rootfs and only a minimal initramfs kernel in mtd1 for booting other kernels DONT_CHECK_KERNELSIZE ?= "1" -MACHINE_EXTRA_RRECOMMENDS_append = " kexecboot-cfg" +MACHINE_ESSENTIAL_EXTRA_RRECOMMENDS_append = " kexecboot-cfg" diff --git a/conf/machine/include/orion.inc b/conf/machine/include/orion.inc index c6fe6e3678..9e16805bd2 100644 --- a/conf/machine/include/orion.inc +++ b/conf/machine/include/orion.inc @@ -10,7 +10,7 @@ USE_DEVFS = "0" PREFERRED_PROVIDER_virtual/bootloader = "" PREFERRED_PROVIDER_virtual/kernel = "linux-orion" -PREFERRED_VERSION_linux-orion = "2.6.27.10" +PREFERRED_VERSION_linux-orion = "2.6.28.4" IMAGE_DEVICE_TABLES = "files/device_table-slugos.txt" IMAGE_FSTYPES = "tar.gz" diff --git a/conf/machine/om-gta03.conf b/conf/machine/om-gta03.conf new file mode 100644 index 0000000000..3bbb21e5e6 --- /dev/null +++ b/conf/machine/om-gta03.conf @@ -0,0 +1,35 @@ +#----------------------------------------------------------------------------- +#@TYPE: Machine +#@NAME: Openmoko GTA03 (XXX) +#@DESCRIPTION: Machine configuration for the Openmoko XXX GSM phone +#----------------------------------------------------------------------------- + +TARGET_ARCH = "arm" + +PREFERRED_PROVIDER_virtual/kernel ?= "linux-openmoko-2.6.28" +PREFERRED_PROVIDER_virtual/xserver = "xserver-kdrive" + +MACHINE_FEATURES = "kernel26 apm alsa bluetooth usbgadget usbhost phone vfat ext2" +MACHINE_DISPLAY_WIDTH_PIXELS = "480" +MACHINE_DISPLAY_HEIGHT_PIXELS = "640" +MACHINE_DISPLAY_ORIENTATION = "0" +MACHINE_DISPLAY_PPI = "285" +XSERVER = "xserver-kdrive-glamo xserver-kdrive-fbdev" + +# package machine specific modules +MACHINE_EXTRA_RRECOMMENDS = "\ + kernel-modules \ +" + +# no need to bypass this as in om-gta01, since this model is not using a multiplexed ttySAC0 +SERIAL_CONSOLE = "115200 ttySAC2" +USE_VT = "0" + +# used by some images +ROOT_FLASH_SIZE = "256" + +# boots only from SD +IMAGE_FSTYPES = "tar.bz2" + +# tune for S3C6410 +include conf/machine/include/tune-arm1176jzf-s.inc diff --git a/conf/machine/overo.conf b/conf/machine/overo.conf index 91413ec903..2a93ab069d 100644 --- a/conf/machine/overo.conf +++ b/conf/machine/overo.conf @@ -29,4 +29,17 @@ XSERVER = "xserver-xorg \ GUI_MACHINE_CLASS = "bigscreen" - +# do ubiattach /dev/ubi_ctrl -m 4 +# From dmesg: +# UBI: smallest flash I/O unit: 2048 +# UBI: logical eraseblock size: 129024 bytes +# from ubiattach stdout: +# UBI device number 0, total 1996 LEBs +MKUBIFS_ARGS = "-m 2048 -e 129024 -c 1996" + +# do ubiattach /dev/ubi_ctrl -m 4 +# from dmesg: +# UBI: smallest flash I/O unit: 2048 +# UBI: physical eraseblock size: 131072 bytes (128 KiB) +# UBI: sub-page size: 512 +UBINIZE_ARGS = "-m 2048 -p 128KiB -s 512" diff --git a/conf/machine/ronetix-pm9261.conf b/conf/machine/ronetix-pm9261.conf new file mode 100644 index 0000000000..5af1e721a7 --- /dev/null +++ b/conf/machine/ronetix-pm9261.conf @@ -0,0 +1,24 @@ +#@TYPE: Machine +#@Name: Ronetix PM9261 CPU Module +#@DESCRIPTION: Machine.configuration for the Ronetix evaluation board with PM9261 CPU module +#@MAINTAINER: Marco Cavallini <m.cavallini@koansoftware.com> + +TARGET_ARCH = "arm" + +PREFERRED_PROVIDER_virtual/kernel = "linux" +PREFERRED_PROVIDER_xserver = "xserver-kdrive" + +KERNEL_IMAGETYPE = "uImage" + +#don't try to access tty1 +USE_VT = "0" + +MACHINE_FEATURES = "kernel26 ext2 usbhost usbgadget screen touchscreen" + +# used by sysvinit_2 +SERIAL_CONSOLE = "115200 ttyS0" +IMAGE_FSTYPES ?= "jffs2" +EXTRA_IMAGECMD_jffs2 = "--pad --little-endian --eraseblock=0x20000 -n" + +require conf/machine/include/tune-arm926ejs.inc + diff --git a/conf/machine/ronetix-pm9263.conf b/conf/machine/ronetix-pm9263.conf new file mode 100644 index 0000000000..96acbe25dd --- /dev/null +++ b/conf/machine/ronetix-pm9263.conf @@ -0,0 +1,24 @@ +#@TYPE: Machine +#@Name: Ronetix PM9263 CPU Module +#@DESCRIPTION: Machine.configuration for the Ronetix evaluation board with PM9263 CPU module +#@MAINTAINER: Marco Cavallini <m.cavallini@koansoftware.com> + +TARGET_ARCH = "arm" + +PREFERRED_PROVIDER_virtual/kernel = "linux" +PREFERRED_PROVIDER_xserver = "xserver-kdrive" + +KERNEL_IMAGETYPE = "uImage" + +#don't try to access tty1 +USE_VT = "0" + +MACHINE_FEATURES = "kernel26 ext2 usbhost usbgadget screen touchscreen" + +# used by sysvinit_2 +SERIAL_CONSOLE = "115200 ttyS0" +IMAGE_FSTYPES ?= "jffs2" +EXTRA_IMAGECMD_jffs2 = "--pad --little-endian --eraseblock=0x20000 -n" + +require conf/machine/include/tune-arm926ejs.inc + diff --git a/contrib/angstrom/build-feeds.sh b/contrib/angstrom/build-feeds.sh index 14a185d715..fc61f985e5 100755 --- a/contrib/angstrom/build-feeds.sh +++ b/contrib/angstrom/build-feeds.sh @@ -181,6 +181,7 @@ do lighttpd \ links-x11 \ lirc \ + lowpan-utils \ m4 \ madplay \ mahjongg \ @@ -276,6 +277,7 @@ do task-opie-apps \ task-opie-games \ task-proper-tools \ + task-xqtlauncher \ tasks \ texinfo \ thttpd \ @@ -295,8 +297,10 @@ do viking \ vlc \ vpnc \ + w3cat \ wifi-radar \ win4 \ + wireshark \ wpa-gui \ wt \ x11vnc \ diff --git a/contrib/angstrom/build-release.sh b/contrib/angstrom/build-release.sh index d8144f80e4..62d4e1ec0c 100755 --- a/contrib/angstrom/build-release.sh +++ b/contrib/angstrom/build-release.sh @@ -60,7 +60,7 @@ done # No graphics -for machine in dns323 mv2120 kuropro lspro tsx09 ts409 gumstix-connex gumstix-verdex efika dht-walnut omap5912osk +for machine in dns323 mv2120 kuropro lspro tsx09 ts409 gumstix-connex gumstix-verdex efika dht-walnut omap5912osk afeb9260 do BUILD_MACHINE=$machine BUILD_CLEAN="base-files" @@ -76,15 +76,6 @@ do do_build done -# build altboot images for zaurus -for machine in c7x0 poodle tosa akita spitz collie -do - BUILD_CLEAN="base-files" - BUILD_MACHINE=$machine - BUILD_TARGETS="altboot-console-image" - do_build -done - # build kexecboot kernels for supported machines for machine in h2200 hx4700 c7x0 akita spitz poodle collie do @@ -95,7 +86,7 @@ done # graphics, flash storage -for machine in overo omap3-pandora beagleboard omap3evm om-gta01 om-gta02 a780 at91sam9263ek qemuarm qemux86 h2200 h3900 h4000 h5000 poodle tosa hx4700 c7x0 spitz akita collie simpad +for machine in overo omap3-pandora beagleboard omap3evm om-gta01 om-gta02 a780 at91sam9263ek qemuarm qemux86 h2200 h3900 h4000 h5000 poodle tosa hx4700 c7x0 spitz akita collie simpad palmz72 do BUILD_CLEAN="base-files" BUILD_MACHINE=$machine @@ -129,7 +120,7 @@ do done # Opie -for machine in h2200 h3900 h4000 h5000 hx4700 htcuniversal akita c7x0 collie poodle spitz tosa simpad +for machine in h2200 h3900 h4000 h5000 hx4700 htcuniversal akita c7x0 collie poodle spitz tosa simpad palmz72 do BUILD_CLEAN="base-files" BUILD_MACHINE=$machine diff --git a/contrib/artwork/oe.svg b/contrib/artwork/oe.svg index 8f3dd17041..4af9587094 100644 --- a/contrib/artwork/oe.svg +++ b/contrib/artwork/oe.svg @@ -1,123 +1,80 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN" -"http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd"> -<!-- Created with Sodipodi ("http://www.sodipodi.com/") --> -<svg - id="svg1" - sodipodi:version="0.32" - inkscape:version="0.38.1" - width="8.0000000cm" - height="6.0000000cm" - sodipodi:docname="oe-2.svg" - xmlns="http://www.w3.org/2000/svg" - xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" - xmlns:xml="http://www.w3.org/XML/1998/namespace" - xmlns:xlink="http://www.w3.org/1999/xlink" - sodipodi:docbase="/home/kergoth/docs/oe/logos/phil"> - <defs - id="defs3" /> - <sodipodi:namedview - id="base" - pagecolor="#ffffff" - bordercolor="#666666" - borderopacity="1.0" - inkscape:pageopacity="0.0" - inkscape:pageshadow="2" - inkscape:zoom="4.9119411" - inkscape:cx="130.17182" - inkscape:cy="82.153497" - inkscape:window-width="1600" - inkscape:window-height="1181" - showguides="true" - snaptoguides="true" - inkscape:window-x="0" - inkscape:window-y="0" /> - <path - style="fill:#9ca3c2;fill-rule:evenodd;stroke:#000000;stroke-width:0.8625;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;" - d="M 150.60592,91.743209 C 150.60592,126.90946 122.06521,155.45016 86.898980,155.45016 C 51.732741,155.45016 23.192037,126.90946 23.192037,91.743209 C 23.192037,56.576987 51.732741,28.036281 86.898980,28.036281 C 122.06521,28.036281 150.60592,56.576987 150.60592,91.743209 z M 125.59088,91.743225 C 125.59088,123.01260 108.25691,148.39065 86.898996,148.39065 C 65.541064,148.39065 48.207098,123.01260 48.207098,91.743225 C 48.207098,60.473843 65.541064,35.095803 86.898996,35.095803 C 108.25691,35.095803 125.59088,60.473843 125.59088,91.743225 z " - id="path861" /> - <path - style="fill:#9ca3c2;fill-rule:evenodd;stroke:#000000;stroke-width:0.8625;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1.0000000;fill-opacity:1.0000000;stroke-dasharray:none;" - d="M 132.75147,91.356420 C 132.87448,64.917742 151.72789,27.858725 196.63972,27.835097 C 207.45455,27.890687 223.63895,35.346804 225.55952,41.517017 C 183.84040,25.116588 151.35632,59.619550 151.26456,91.865400 C 151.42728,124.36573 184.86806,158.68422 225.66493,141.78379 C 222.82764,147.71089 208.80153,155.59326 196.50275,155.65048 C 151.84536,155.85942 132.62846,118.04958 132.75147,91.356420 z " - id="path869" - sodipodi:nodetypes="csczcsz" /> - <path - style="fill:#9ca3c2;fill-rule:evenodd;stroke:#000000;stroke-width:0.8625;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;" - d="M 173.2093 62.12526 C 187.1012 61.82853 198.1696 76.01726 198.3348 91.56551 C 198.4135 107.2003 187.9133 121.6873 173.1847 121.1256 C 187.7964 112.1516 188.1917 94.48494 188.1594 91.61621 C 188.1270 88.66092 187.4490 70.73875 173.2093 62.12526 z " - id="path877" - sodipodi:nodetypes="czczc" /> - <g - id="g921" - transform="matrix(0.680271,0.000000,0.000000,0.680271,-188.5137,-265.4138)"> - <text - xml:space="preserve" - style="font-size:56.000000;stroke-width:3.0000000pt;font-family:Verdana;" - x="417.81043" - y="1061.9202" - id="text902" - sodipodi:linespacing="100%" - transform="matrix(0.631134,0.000000,0.000000,0.631134,3.430357,0.000000)"> - <tspan - id="tspan903" - style="fill:#000000;fill-opacity:1.0000000;">open</tspan> - </text> - <text - xml:space="preserve" - style="font-size:56.000000;fill:#929292;stroke-width:3.0000000pt;font-family:Verdana;" - x="567.82333" - y="1061.9202" - id="text905" - sodipodi:linespacing="100%" - transform="scale(0.631134,0.631134)"> - <tspan - id="tspan906" - style="fill:#929292;fill-opacity:1.0000000;">embedded</tspan> - </text> - </g> - <g - id="g945" - style="stroke:#000000;stroke-opacity:0.1200;"> - <path - style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#000000;stroke-width:1.2500000;stroke-opacity:0.1200;" - d="M 210.10063,527.64010 L 600.37556,527.64010" - id="path840" - sodipodi:nodetypes="cc" - transform="matrix(0.680271,0.000000,0.000000,0.680271,-132.4632,-267.1952)" /> - <path - style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.2500000;stroke-linejoin:round;stroke-opacity:0.1200;" - d="M 577.34380,527.64009 C 577.34380,579.33452 535.38890,621.28942 483.69447,621.28942 C 432.00004,621.28942 390.04514,579.33452 390.04514,527.64009 C 390.04514,475.94566 432.00004,433.99076 483.69447,433.99076 C 535.38890,433.99076 577.34380,475.94566 577.34380,527.64009 z " - id="path849" - transform="matrix(0.680271,0.000000,0.000000,0.680271,-132.4632,-267.1952)" /> - <path - style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.2500000;stroke-linejoin:round;stroke-opacity:0.1200;" - d="M 378.24332,527.64008 C 378.24332,558.43082 353.25373,583.42040 322.46301,583.42040 C 291.67226,583.42040 266.68267,558.43082 266.68267,527.64008 C 266.68267,496.84933 291.67226,471.85976 322.46301,471.85976 C 353.25373,471.85976 378.24332,496.84933 378.24332,527.64008 z " - id="path839" - transform="matrix(0.680271,0.000000,0.000000,0.680271,-132.4632,-267.1952)" /> - <path - style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#000000;stroke-width:1.2500000;stroke-linejoin:round;stroke-opacity:0.1200;" - d="M 322.46300,422.21153 L 322.46300,633.06864" - id="path841" - sodipodi:nodetypes="cc" - transform="matrix(0.680271,0.000000,0.000000,0.680271,-132.4632,-267.1952)" /> - <path - style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.2500000;stroke-linejoin:round;stroke-opacity:0.1200;" - d="M 539.47480,527.64009 C 539.47480,558.43083 514.48521,583.42041 483.69449,583.42041 C 452.90374,583.42041 427.91415,558.43083 427.91415,527.64009 C 427.91415,496.84934 452.90374,471.85977 483.69449,471.85977 C 514.48521,471.85977 539.47480,496.84934 539.47480,527.64009 z " - id="path850" - transform="matrix(0.680271,0.000000,0.000000,0.680271,-132.4632,-267.1952)" /> - <path - style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#000000;stroke-width:1.2500000;stroke-linejoin:round;stroke-opacity:0.1200;" - d="M 483.69448,422.21153 L 483.69448,633.06864" - id="path851" - sodipodi:nodetypes="cc" - transform="matrix(0.680271,0.000000,0.000000,0.680271,-132.4632,-267.1952)" /> - <path - style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.76683110;stroke-linejoin:round;stroke-opacity:0.1200;" - d="M 144.34955,91.743214 C 144.34955,123.45594 118.61168,149.19380 86.898970,149.19380 C 55.186251,149.19380 29.448400,123.45594 29.448400,91.743214 C 29.448400,60.030495 55.186251,34.292644 86.898970,34.292644 C 118.61168,34.292644 144.34955,60.030495 144.34955,91.743214 z " - id="path943" /> - <path - style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.76683110;stroke-linejoin:round;stroke-opacity:0.1200;" - d="M 254.03070,91.743050 C 254.03070,123.45578 228.29283,149.19364 196.58012,149.19364 C 164.86740,149.19364 139.12954,123.45578 139.12954,91.743050 C 139.12954,60.030332 164.86740,34.292480 196.58012,34.292480 C 228.29283,34.292480 254.03070,60.030332 254.03070,91.743050 z " - id="path944" /> - </g> -</svg> +<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 13.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 14948) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ width="209.104px" height="167.858px" viewBox="0 0 209.104 167.858" enable-background="new 0 0 209.104 167.858"
+ xml:space="preserve">
+<g>
+ <g>
+ <path fill="#00BCE4" d="M74.145,145.897c-0.568,0.568-0.841,1.228-0.841,2.03v0.339h5.744v-0.339c0-1.601-1.273-2.87-2.872-2.872
+ C75.372,145.056,74.713,145.33,74.145,145.897z M73.304,154.262c0,0.876,0.729,1.605,1.605,1.605h6.334
+ c1.357,0,2.195,0.838,2.195,2.194c0,1.357-0.838,2.195-2.195,2.195h-6.334c-1.657,0-3.101-0.58-4.265-1.73
+ c-1.15-1.163-1.731-2.607-1.731-4.265v-6.334c0-4.041,3.221-7.261,7.262-7.263c2.019,0,3.752,0.705,5.148,2.115
+ c1.41,1.396,2.114,3.13,2.114,5.147v4.729H73.304V154.262z"/>
+ <path fill="#00BCE4" d="M99.738,140.665c1.662,0,3.094,0.584,4.246,1.75c1.166,1.153,1.749,2.584,1.75,4.246v11.4
+ c0,1.357-0.838,2.195-2.195,2.195s-2.195-0.838-2.195-2.195v-11.4c0-0.922-0.684-1.604-1.605-1.605h-1.604v13.006
+ c0,1.357-0.838,2.195-2.195,2.195s-2.195-0.838-2.195-2.195v-13.006h-3.21v13.006c0,1.357-0.838,2.195-2.195,2.195
+ s-2.195-0.838-2.195-2.195V142.86c0-1.357,0.838-2.195,2.195-2.195H99.738z"/>
+ <path fill="#00BCE4" d="M123.308,154.262c0,3.37-2.625,5.995-5.995,5.995h-6.334c-1.356,0-2.194-0.838-2.194-2.195V135.26
+ c0-1.356,0.838-2.195,2.194-2.195c1.357,0,2.195,0.839,2.195,2.195v5.405h4.139c3.472,0,5.993,2.658,5.995,5.995V154.262z
+ M113.174,145.056v10.812h4.139c0.903,0,1.604-0.701,1.604-1.605v-7.601c0-0.927-0.678-1.604-1.605-1.605H113.174z"/>
+ <path fill="#00BCE4" d="M130.897,145.897c-0.568,0.568-0.842,1.228-0.842,2.03v0.339h5.744v-0.339c0-1.601-1.273-2.87-2.872-2.872
+ C132.124,145.056,131.466,145.33,130.897,145.897z M130.056,154.262c0,0.876,0.729,1.605,1.605,1.605h6.334
+ c1.357,0,2.195,0.838,2.195,2.194c0,1.357-0.838,2.195-2.195,2.195h-6.334c-1.657,0-3.102-0.58-4.266-1.73
+ c-1.148-1.163-1.73-2.607-1.73-4.265v-6.334c0-4.041,3.221-7.261,7.263-7.263c2.019,0,3.752,0.705,5.147,2.115
+ c1.41,1.396,2.115,3.13,2.115,5.147v4.729h-10.135V154.262z"/>
+ <path fill="#00BCE4" d="M143.688,143.646c1.129-1.972,2.906-2.98,5.201-2.981h4.139v-5.405c0-1.356,0.838-2.195,2.195-2.195
+ s2.195,0.839,2.195,2.195v22.802c0,1.357-0.838,2.195-2.195,2.195h-6.334c-1.657,0-3.102-0.58-4.266-1.73
+ c-1.149-1.163-1.73-2.607-1.73-4.265v-7.601C142.894,145.581,143.157,144.572,143.688,143.646z M147.741,145.532
+ c-0.307,0.309-0.457,0.665-0.457,1.129v7.601c0,0.878,0.727,1.605,1.605,1.605h4.139v-10.812h-4.139
+ C148.433,145.056,148.067,145.207,147.741,145.532z"/>
+ <path fill="#00BCE4" d="M160.917,143.646c1.129-1.972,2.905-2.98,5.201-2.981h4.139v-5.405c0-1.356,0.838-2.195,2.195-2.195
+ c1.356,0,2.195,0.839,2.195,2.195v22.802c0,1.357-0.839,2.195-2.195,2.195h-6.334c-1.657,0-3.102-0.58-4.266-1.73
+ c-1.149-1.163-1.73-2.607-1.73-4.265v-7.601C160.122,145.581,160.386,144.572,160.917,143.646z M164.97,145.532
+ c-0.308,0.309-0.457,0.665-0.457,1.129v7.601c0,0.878,0.727,1.605,1.605,1.605h4.139v-10.812h-4.139
+ C165.661,145.056,165.296,145.207,164.97,145.532z"/>
+ <path fill="#00BCE4" d="M182.583,145.897c-0.568,0.568-0.842,1.228-0.842,2.03v0.339h5.743l0.001-0.339
+ c0-1.601-1.273-2.87-2.873-2.872C183.81,145.056,183.15,145.33,182.583,145.897z M181.741,154.262
+ c0,0.876,0.729,1.605,1.605,1.605h6.333c1.357,0,2.195,0.838,2.195,2.194c0,1.357-0.838,2.195-2.195,2.195h-6.333
+ c-1.658,0-3.102-0.58-4.266-1.73c-1.149-1.163-1.73-2.607-1.73-4.265v-6.334c0-4.041,3.221-7.261,7.262-7.263
+ c2.019,0,3.752,0.705,5.148,2.115c1.41,1.396,2.114,3.13,2.114,5.147v4.729h-10.134V154.262z"/>
+ <path fill="#00BCE4" d="M195.374,143.646c1.129-1.972,2.905-2.98,5.2-2.981h4.139v-5.405c0-1.356,0.839-2.195,2.195-2.195
+ c1.357,0,2.195,0.839,2.195,2.195v22.802c0,1.357-0.838,2.195-2.195,2.195h-6.333c-1.658,0-3.102-0.58-4.266-1.73
+ c-1.149-1.163-1.73-2.607-1.73-4.265v-7.601C194.579,145.582,194.843,144.572,195.374,143.646z M199.427,145.532
+ c-0.308,0.309-0.457,0.665-0.457,1.129v7.601c0,0.878,0.727,1.605,1.605,1.605h4.138v-10.812h-4.138
+ C200.118,145.056,199.753,145.207,199.427,145.532z"/>
+ </g>
+ <g>
+ <path fill="#5C6F7B" d="M19.423,140.665h6.333c1.662,0,3.094,0.584,4.246,1.75c1.167,1.153,1.75,2.585,1.75,4.246v7.601
+ c0,1.651-0.587,3.082-1.748,4.244c-1.152,1.167-2.586,1.751-4.248,1.751h-4.138v5.406c0,1.357-0.838,2.195-2.195,2.195
+ s-2.195-0.839-2.195-2.195V142.86C17.228,141.503,18.066,140.665,19.423,140.665z M21.619,155.867h4.138
+ c0.903,0,1.605-0.701,1.605-1.605v-7.601c0-0.928-0.679-1.604-1.605-1.605h-4.138V155.867z"/>
+ <path fill="#5C6F7B" d="M39.688,145.897c-0.569,0.568-0.841,1.228-0.841,2.03v0.339h5.743v-0.339c0-1.601-1.272-2.87-2.872-2.872
+ C40.915,145.056,40.256,145.33,39.688,145.897z M38.847,154.262c0,0.876,0.729,1.605,1.605,1.605h6.333
+ c1.357,0,2.195,0.838,2.195,2.194c0,1.357-0.838,2.195-2.195,2.195h-6.333c-1.657,0-3.101-0.58-4.265-1.73
+ c-1.15-1.163-1.73-2.607-1.73-4.265v-6.334c0-4.041,3.22-7.261,7.262-7.263c2.018,0,3.752,0.705,5.147,2.115
+ c1.411,1.396,2.115,3.13,2.115,5.147v4.729H38.847V154.262z"/>
+ <path fill="#5C6F7B" d="M51.685,142.86c0-1.357,0.838-2.195,2.195-2.195h6.334c1.662,0,3.094,0.584,4.246,1.75
+ c1.167,1.153,1.749,2.584,1.75,4.246v11.4c0,1.357-0.838,2.195-2.195,2.195s-2.195-0.838-2.195-2.195v-11.4
+ c0-0.922-0.684-1.604-1.605-1.605h-4.138v13.006c0,1.357-0.838,2.195-2.195,2.195c-1.357,0-2.195-0.838-2.195-2.195V142.86z"/>
+ <path fill-rule="evenodd" clip-rule="evenodd" fill="#5C6F7B" d="M10.134,147.928c0-1.601-1.273-2.87-2.872-2.872
+ c-1.599,0-2.872,1.273-2.872,2.872v5.067c0,0.824,0.267,1.485,0.822,2.049c0.564,0.555,1.226,0.823,2.05,0.823
+ c1.601,0,2.871-1.273,2.872-2.873V147.928z M0,147.928c0-4.041,3.22-7.261,7.262-7.263c2.019,0,3.752,0.705,5.148,2.115
+ c1.411,1.396,2.114,3.13,2.114,5.147v5.067c0,4.041-3.222,7.262-7.262,7.262c-1.997,0-3.732-0.713-5.147-2.114
+ C0.713,156.727,0,154.991,0,152.995V147.928z"/>
+ </g>
+ <g>
+ <path fill-rule="evenodd" clip-rule="evenodd" fill="#5C6F7B" d="M25.428,79.124C25.428,35.424,60.853,0,104.552,0
+ s79.123,35.424,79.123,79.124c0,14.938-4.139,28.909-11.333,40.828h-26.366c10.352-10.5,16.738-24.918,16.738-40.828
+ c0-32.123-26.039-58.163-58.162-58.163s-58.163,26.04-58.163,58.163c0,15.91,6.388,30.328,16.738,40.828H36.761
+ C29.568,108.032,25.428,94.062,25.428,79.124z"/>
+ </g>
+ <g>
+ <path fill="#00BCE4" d="M94.122,79.124c0-2.882,1.168-5.491,3.059-7.379l17.436-17.494c-9.682-3.913-21.184-1.944-29.033,5.905
+ c-10.476,10.476-10.476,27.461,0,37.937c10.476,10.477,27.461,10.477,37.938,0c4.547-4.547,7.12-10.321,7.721-16.256l18.46-18.461
+ c5.838,16.774,2.056,36.151-11.345,49.553c-18.67,18.67-48.939,18.67-67.609,0c-18.67-18.67-18.67-48.938,0-67.608
+ c18.669-18.67,48.939-18.67,67.609,0c2.535,2.536,4.728,5.287,6.574,8.193l-32.986,32.997c-1.888,1.89-4.511,3.045-7.393,3.045
+ C98.791,89.554,94.122,84.884,94.122,79.124z"/>
+ </g>
+</g>
+</svg>
diff --git a/contrib/artwork/powered-by-oe.svg b/contrib/artwork/powered-by-oe.svg index 7e1c382f57..2898b095cc 100644 --- a/contrib/artwork/powered-by-oe.svg +++ b/contrib/artwork/powered-by-oe.svg @@ -1,144 +1,123 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<!-- Created with Sodipodi ("http://www.sodipodi.com/") --> -<svg - xmlns:dc="http://purl.org/dc/elements/1.1/" - xmlns:cc="http://web.resource.org/cc/" - xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" - xmlns:svg="http://www.w3.org/2000/svg" - xmlns="http://www.w3.org/2000/svg" - xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" - xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - id="svg1" - sodipodi:version="0.32" - inkscape:version="0.45.1" - width="8.0000000cm" - height="6.0000000cm" - sodipodi:docname="oe.svg" - sodipodi:docbase="/home/mallum/Desktop" - inkscape:output_extension="org.inkscape.output.svg.inkscape"> - <metadata - id="metadata22"> - <rdf:RDF> - <cc:Work - rdf:about=""> - <dc:format>image/svg+xml</dc:format> - <dc:type - rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> - </cc:Work> - </rdf:RDF> - </metadata> - <defs - id="defs3" /> - <sodipodi:namedview - id="base" - pagecolor="#ffffff" - bordercolor="#666666" - borderopacity="1.0" - inkscape:pageopacity="0.0" - inkscape:pageshadow="2" - inkscape:zoom="3.621852" - inkscape:cx="141.73228" - inkscape:cy="106.29921" - inkscape:window-width="1600" - inkscape:window-height="972" - showguides="true" - snaptoguides="true" - inkscape:window-x="0" - inkscape:window-y="25" - inkscape:current-layer="svg1" /> - <path - style="fill:#9ca3c2;fill-rule:evenodd;stroke:#000000;stroke-width:0.86250001;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none" - d="M 150.60592,99.743209 C 150.60592,134.90946 122.06521,163.45016 86.89898,163.45016 C 51.732741,163.45016 23.192037,134.90946 23.192037,99.743209 C 23.192037,64.576987 51.732741,36.036281 86.89898,36.036281 C 122.06521,36.036281 150.60592,64.576987 150.60592,99.743209 z M 125.59088,99.743225 C 125.59088,131.0126 108.25691,156.39065 86.898996,156.39065 C 65.541064,156.39065 48.207098,131.0126 48.207098,99.743225 C 48.207098,68.473843 65.541064,43.095803 86.898996,43.095803 C 108.25691,43.095803 125.59088,68.473843 125.59088,99.743225 z " - id="path861" /> - <path - style="fill:#9ca3c2;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.86250001;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1" - d="M 132.75147,99.35642 C 132.87448,72.917742 151.72789,35.858725 196.63972,35.835097 C 207.45455,35.890687 223.63895,43.346804 225.55952,49.517017 C 183.8404,33.116588 151.35632,67.61955 151.26456,99.8654 C 151.42728,132.36573 184.86806,166.68422 225.66493,149.78379 C 222.82764,155.71089 208.80153,163.59326 196.50275,163.65048 C 151.84536,163.85942 132.62846,126.04958 132.75147,99.35642 z " - id="path869" - sodipodi:nodetypes="csczcsz" /> - <path - style="fill:#9ca3c2;fill-rule:evenodd;stroke:#000000;stroke-width:0.86250001;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none" - d="M 173.2093,70.12526 C 187.1012,69.82853 198.1696,84.01726 198.3348,99.56551 C 198.4135,115.2003 187.9133,129.6873 173.1847,129.1256 C 187.7964,120.1516 188.1917,102.48494 188.1594,99.61621 C 188.127,96.66092 187.449,78.73875 173.2093,70.12526 z " - id="path877" - sodipodi:nodetypes="czczc" /> - <g - id="g921" - transform="matrix(0.680271,0,0,0.680271,-188.5137,-257.4138)"> - <text - xml:space="preserve" - style="font-size:56px;line-height:100%;stroke-width:3pt;font-family:Verdana" - x="417.81042" - y="1061.9202" - id="text902" - sodipodi:linespacing="100%" - transform="matrix(0.631134,0,0,0.631134,3.430357,0)"> <tspan - id="tspan903" - style="fill:#000000;fill-opacity:1">open</tspan> </text> - <text - xml:space="preserve" - style="font-size:56px;line-height:100%;fill:#929292;stroke-width:3pt;font-family:Verdana" - x="567.8233" - y="1061.9202" - id="text905" - sodipodi:linespacing="100%" - transform="scale(0.631134,0.631134)"> <tspan - id="tspan906" - style="fill:#929292;fill-opacity:1">embedded</tspan> </text> - </g> - <g - id="g945" - style="stroke:#000000;stroke-opacity:0.12000002" - transform="translate(0,8)"> - <path - style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:1.25;stroke-opacity:0.12000002" - d="M 210.10063,527.6401 L 600.37556,527.6401" - id="path840" - sodipodi:nodetypes="cc" - transform="matrix(0.680271,0,0,0.680271,-132.4632,-267.1952)" /> - <path - style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.25;stroke-linejoin:round;stroke-opacity:0.12000002" - d="M 577.3438,527.64009 C 577.3438,579.33452 535.3889,621.28942 483.69447,621.28942 C 432.00004,621.28942 390.04514,579.33452 390.04514,527.64009 C 390.04514,475.94566 432.00004,433.99076 483.69447,433.99076 C 535.3889,433.99076 577.3438,475.94566 577.3438,527.64009 z " - id="path849" - transform="matrix(0.680271,0,0,0.680271,-132.4632,-267.1952)" /> - <path - style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.25;stroke-linejoin:round;stroke-opacity:0.12000002" - d="M 378.24332,527.64008 C 378.24332,558.43082 353.25373,583.4204 322.46301,583.4204 C 291.67226,583.4204 266.68267,558.43082 266.68267,527.64008 C 266.68267,496.84933 291.67226,471.85976 322.46301,471.85976 C 353.25373,471.85976 378.24332,496.84933 378.24332,527.64008 z " - id="path839" - transform="matrix(0.680271,0,0,0.680271,-132.4632,-267.1952)" /> - <path - style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:1.25;stroke-linejoin:round;stroke-opacity:0.12000002" - d="M 322.463,422.21153 L 322.463,633.06864" - id="path841" - sodipodi:nodetypes="cc" - transform="matrix(0.680271,0,0,0.680271,-132.4632,-267.1952)" /> - <path - style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.25;stroke-linejoin:round;stroke-opacity:0.12000002" - d="M 539.4748,527.64009 C 539.4748,558.43083 514.48521,583.42041 483.69449,583.42041 C 452.90374,583.42041 427.91415,558.43083 427.91415,527.64009 C 427.91415,496.84934 452.90374,471.85977 483.69449,471.85977 C 514.48521,471.85977 539.4748,496.84934 539.4748,527.64009 z " - id="path850" - transform="matrix(0.680271,0,0,0.680271,-132.4632,-267.1952)" /> - <path - style="fill:none;fill-opacity:0.75;fill-rule:evenodd;stroke:#000000;stroke-width:1.25;stroke-linejoin:round;stroke-opacity:0.12000002" - d="M 483.69448,422.21153 L 483.69448,633.06864" - id="path851" - sodipodi:nodetypes="cc" - transform="matrix(0.680271,0,0,0.680271,-132.4632,-267.1952)" /> - <path - style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.7668311;stroke-linejoin:round;stroke-opacity:0.12000002" - d="M 144.34955,91.743214 C 144.34955,123.45594 118.61168,149.1938 86.89897,149.1938 C 55.186251,149.1938 29.4484,123.45594 29.4484,91.743214 C 29.4484,60.030495 55.186251,34.292644 86.89897,34.292644 C 118.61168,34.292644 144.34955,60.030495 144.34955,91.743214 z " - id="path943" /> - <path - style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.7668311;stroke-linejoin:round;stroke-opacity:0.12000002" - d="M 254.0307,91.74305 C 254.0307,123.45578 228.29283,149.19364 196.58012,149.19364 C 164.8674,149.19364 139.12954,123.45578 139.12954,91.74305 C 139.12954,60.030332 164.8674,34.29248 196.58012,34.29248 C 228.29283,34.29248 254.0307,60.030332 254.0307,91.74305 z " - id="path944" /> - </g> - <text - sodipodi:linespacing="100%" - id="text2180" - y="24.027855" - x="71.040924" - style="font-size:24.0431633px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#929292;stroke-width:3pt;font-family:Verdana" - xml:space="preserve"><tspan - sodipodi:role="line" - id="tspan2195" - x="71.040924" - y="24.027855">Powered by</tspan></text> -</svg> +<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 13.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 14948) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ width="209.104px" height="204.298px" viewBox="0 0 209.104 204.298" enable-background="new 0 0 209.104 204.298"
+ xml:space="preserve">
+<g id="Layer_1">
+ <g>
+ <g>
+ <path fill="#00BCE4" d="M74.145,182.337c-0.568,0.568-0.841,1.228-0.841,2.03v0.339h5.743v-0.339c0-1.601-1.272-2.87-2.872-2.872
+ C75.372,181.495,74.713,181.77,74.145,182.337z M73.304,190.701c0,0.876,0.729,1.605,1.604,1.605h6.334
+ c1.357,0,2.195,0.838,2.195,2.194c0,1.357-0.838,2.195-2.195,2.195h-6.334c-1.657,0-3.101-0.58-4.265-1.73
+ c-1.149-1.163-1.73-2.607-1.73-4.265v-6.334c0-4.041,3.221-7.261,7.262-7.263c2.019,0,3.752,0.705,5.148,2.115
+ c1.41,1.396,2.114,3.13,2.114,5.147v4.729H73.304V190.701z"/>
+ <path fill="#00BCE4" d="M99.737,177.104c1.662,0,3.094,0.584,4.246,1.75c1.166,1.153,1.749,2.584,1.75,4.246v11.4
+ c0,1.357-0.838,2.195-2.195,2.195s-2.195-0.838-2.195-2.195v-11.4c0-0.922-0.684-1.604-1.605-1.605h-1.604v13.006
+ c0,1.357-0.838,2.195-2.195,2.195s-2.195-0.838-2.195-2.195v-13.006h-3.21v13.006c0,1.357-0.838,2.195-2.195,2.195
+ s-2.195-0.838-2.195-2.195V179.3c0-1.357,0.838-2.195,2.195-2.195H99.737z"/>
+ <path fill="#00BCE4" d="M123.308,190.701c0,3.37-2.625,5.995-5.995,5.995h-6.334c-1.356,0-2.194-0.838-2.194-2.195v-22.802
+ c0-1.356,0.838-2.195,2.194-2.195c1.357,0,2.195,0.839,2.195,2.195v5.405h4.139c3.472,0,5.993,2.658,5.995,5.995V190.701z
+ M113.174,181.495v10.812h4.139c0.903,0,1.604-0.701,1.604-1.605v-7.601c0-0.927-0.678-1.604-1.605-1.605H113.174z"/>
+ <path fill="#00BCE4" d="M130.897,182.337c-0.568,0.568-0.842,1.228-0.842,2.03v0.339h5.744v-0.339
+ c0-1.601-1.273-2.87-2.872-2.872C132.124,181.495,131.466,181.77,130.897,182.337z M130.056,190.701
+ c0,0.876,0.729,1.605,1.605,1.605h6.334c1.357,0,2.195,0.838,2.195,2.194c0,1.357-0.838,2.195-2.195,2.195h-6.334
+ c-1.657,0-3.102-0.58-4.266-1.73c-1.148-1.163-1.73-2.607-1.73-4.265v-6.334c0-4.041,3.221-7.261,7.263-7.263
+ c2.019,0,3.752,0.705,5.147,2.115c1.41,1.396,2.115,3.13,2.115,5.147v4.729h-10.135V190.701z"/>
+ <path fill="#00BCE4" d="M143.688,180.086c1.129-1.972,2.906-2.98,5.201-2.981h4.139v-5.405c0-1.356,0.838-2.195,2.195-2.195
+ s2.195,0.839,2.195,2.195v22.802c0,1.357-0.838,2.195-2.195,2.195h-6.334c-1.657,0-3.102-0.58-4.266-1.73
+ c-1.149-1.163-1.73-2.607-1.73-4.265v-7.601C142.894,182.021,143.157,181.012,143.688,180.086z M147.741,181.972
+ c-0.307,0.309-0.457,0.665-0.457,1.129v7.601c0,0.878,0.727,1.605,1.605,1.605h4.139v-10.812h-4.139
+ C148.433,181.495,148.067,181.646,147.741,181.972z"/>
+ <path fill="#00BCE4" d="M160.917,180.086c1.129-1.972,2.905-2.98,5.201-2.981h4.139v-5.405c0-1.356,0.838-2.195,2.195-2.195
+ c1.356,0,2.195,0.839,2.195,2.195v22.802c0,1.357-0.839,2.195-2.195,2.195h-6.334c-1.657,0-3.102-0.58-4.266-1.73
+ c-1.149-1.163-1.73-2.607-1.73-4.265v-7.601C160.122,182.021,160.386,181.012,160.917,180.086z M164.97,181.972
+ c-0.308,0.309-0.457,0.665-0.457,1.129v7.601c0,0.878,0.727,1.605,1.605,1.605h4.139v-10.812h-4.139
+ C165.661,181.495,165.296,181.646,164.97,181.972z"/>
+ <path fill="#00BCE4" d="M182.583,182.337c-0.568,0.568-0.842,1.228-0.842,2.03v0.339h5.743l0.001-0.339
+ c0-1.601-1.273-2.87-2.873-2.872C183.81,181.495,183.15,181.77,182.583,182.337z M181.741,190.701
+ c0,0.876,0.729,1.605,1.605,1.605h6.333c1.357,0,2.195,0.838,2.195,2.194c0,1.357-0.838,2.195-2.195,2.195h-6.333
+ c-1.658,0-3.102-0.58-4.266-1.73c-1.149-1.163-1.73-2.607-1.73-4.265v-6.334c0-4.041,3.221-7.261,7.262-7.263
+ c2.019,0,3.752,0.705,5.148,2.115c1.41,1.396,2.114,3.13,2.114,5.147v4.729h-10.134V190.701z"/>
+ <path fill="#00BCE4" d="M195.374,180.086c1.129-1.972,2.905-2.98,5.2-2.981h4.139v-5.405c0-1.356,0.839-2.195,2.195-2.195
+ c1.357,0,2.195,0.839,2.195,2.195v22.802c0,1.357-0.838,2.195-2.195,2.195h-6.333c-1.658,0-3.102-0.58-4.266-1.73
+ c-1.149-1.163-1.73-2.607-1.73-4.265v-7.601C194.579,182.021,194.843,181.012,195.374,180.086z M199.427,181.972
+ c-0.308,0.309-0.457,0.665-0.457,1.129v7.601c0,0.878,0.727,1.605,1.605,1.605h4.138v-10.812h-4.138
+ C200.118,181.495,199.753,181.646,199.427,181.972z"/>
+ </g>
+ <g>
+ <path fill="#5C6F7B" d="M19.423,177.104h6.334c1.661,0,3.094,0.584,4.245,1.75c1.167,1.153,1.75,2.585,1.75,4.246v7.601
+ c0,1.651-0.587,3.082-1.747,4.244c-1.152,1.167-2.587,1.751-4.248,1.751h-4.139v5.406c0,1.357-0.838,2.195-2.195,2.195
+ s-2.195-0.839-2.195-2.195V179.3C17.228,177.942,18.065,177.104,19.423,177.104z M21.618,192.307h4.139
+ c0.903,0,1.605-0.701,1.605-1.605v-7.601c0-0.928-0.679-1.604-1.605-1.605h-4.139V192.307z"/>
+ <path fill="#5C6F7B" d="M39.688,182.337c-0.569,0.568-0.842,1.228-0.842,2.03v0.339h5.743v-0.339c0-1.601-1.272-2.87-2.872-2.872
+ C40.915,181.495,40.256,181.77,39.688,182.337z M38.847,190.701c0,0.876,0.729,1.605,1.605,1.605h6.333
+ c1.357,0,2.195,0.838,2.195,2.194c0,1.357-0.838,2.195-2.195,2.195h-6.333c-1.657,0-3.102-0.58-4.266-1.73
+ c-1.149-1.163-1.73-2.607-1.73-4.265v-6.334c0-4.041,3.221-7.261,7.263-7.263c2.018,0,3.752,0.705,5.147,2.115
+ c1.41,1.396,2.114,3.13,2.114,5.147v4.729H38.847V190.701z"/>
+ <path fill="#5C6F7B" d="M51.685,179.3c0-1.357,0.838-2.195,2.195-2.195h6.334c1.661,0,3.094,0.584,4.245,1.75
+ c1.167,1.153,1.749,2.584,1.75,4.246v11.4c0,1.357-0.838,2.195-2.195,2.195s-2.195-0.838-2.195-2.195v-11.4
+ c0-0.922-0.684-1.604-1.605-1.605h-4.138v13.006c0,1.357-0.838,2.195-2.195,2.195s-2.195-0.838-2.195-2.195V179.3z"/>
+ <path fill-rule="evenodd" clip-rule="evenodd" fill="#5C6F7B" d="M10.134,184.367c0-1.601-1.273-2.87-2.872-2.872
+ c-1.6,0-2.872,1.273-2.872,2.872v5.067c0,0.824,0.268,1.485,0.822,2.049c0.564,0.555,1.226,0.823,2.05,0.823
+ c1.601,0,2.871-1.273,2.872-2.873V184.367z M0,184.367c0-4.041,3.22-7.261,7.262-7.263c2.019,0,3.752,0.705,5.147,2.115
+ c1.411,1.396,2.114,3.13,2.114,5.147v5.067c0,4.041-3.222,7.262-7.262,7.262c-1.997,0-3.732-0.713-5.147-2.114
+ C0.713,193.166,0,191.431,0,189.435V184.367z"/>
+ </g>
+ <g>
+ <path fill-rule="evenodd" clip-rule="evenodd" fill="#5C6F7B" d="M25.428,115.563c0-43.699,35.425-79.124,79.124-79.124
+ s79.123,35.424,79.123,79.124c0,14.938-4.139,28.909-11.333,40.828h-26.366c10.352-10.5,16.738-24.918,16.738-40.828
+ c0-32.123-26.039-58.163-58.162-58.163s-58.163,26.04-58.163,58.163c0,15.91,6.388,30.328,16.738,40.828H36.761
+ C29.567,144.472,25.428,130.501,25.428,115.563z"/>
+ </g>
+ <g>
+ <path fill="#00BCE4" d="M94.122,115.563c0-2.882,1.168-5.491,3.059-7.379l17.436-17.494c-9.682-3.913-21.185-1.944-29.033,5.905
+ c-10.477,10.476-10.477,27.461,0,37.937c10.476,10.477,27.461,10.477,37.938,0c4.547-4.547,7.12-10.321,7.721-16.256
+ l18.46-18.461c5.838,16.774,2.056,36.151-11.345,49.553c-18.67,18.67-48.939,18.67-67.609,0s-18.67-48.938,0-67.608
+ s48.939-18.67,67.609,0c2.535,2.536,4.728,5.287,6.574,8.193l-32.986,32.997c-1.888,1.89-4.511,3.045-7.393,3.045
+ C98.791,125.993,94.122,121.323,94.122,115.563z"/>
+ </g>
+ </g>
+</g>
+<g id="text">
+ <g>
+ <path fill="#5C6F7B" d="M14.716,13.858c0-2.304-0.072-4.283-0.144-5.903h4.751l0.252,2.447h0.072
+ c1.296-1.872,3.312-2.843,5.867-2.843c3.852,0,7.307,3.347,7.307,8.963c0,6.407-4.067,9.431-7.991,9.431
+ c-2.124,0-3.78-0.864-4.571-2.016h-0.072v8.747h-5.471V13.858z M20.188,17.998c0,0.432,0.036,0.828,0.108,1.152
+ c0.36,1.476,1.62,2.592,3.204,2.592c2.376,0,3.78-1.98,3.78-4.967c0-2.808-1.26-4.932-3.708-4.932
+ c-1.548,0-2.916,1.152-3.276,2.772c-0.072,0.288-0.108,0.647-0.108,0.972V17.998z"/>
+ <path fill="#5C6F7B" d="M53.093,16.558c0,6.443-4.571,9.395-9.287,9.395c-5.147,0-9.107-3.384-9.107-9.071
+ c0-5.688,3.743-9.323,9.395-9.323C49.494,7.559,53.093,11.267,53.093,16.558z M40.351,16.738c0,3.023,1.26,5.292,3.599,5.292
+ c2.124,0,3.492-2.124,3.492-5.292c0-2.628-1.008-5.292-3.492-5.292C41.323,11.446,40.351,14.146,40.351,16.738z"/>
+ <path fill="#5C6F7B" d="M59.143,7.955l1.404,7.199c0.36,1.8,0.72,3.78,1.008,5.795h0.072c0.36-2.016,0.864-4.031,1.296-5.759
+ l1.872-7.235h4.319l1.764,7.019c0.468,1.979,0.936,3.959,1.295,5.975h0.072c0.252-2.016,0.612-3.996,1.008-6.011l1.512-6.983
+ h5.363l-5.399,17.602h-5.147l-1.656-6.191c-0.432-1.728-0.756-3.275-1.116-5.471h-0.072c-0.324,2.196-0.684,3.852-1.152,5.471
+ l-1.764,6.191h-5.147L53.563,7.955H59.143z"/>
+ <path fill="#5C6F7B" d="M85.836,18.501c0.18,2.268,2.412,3.348,4.967,3.348c1.872,0,3.384-0.252,4.859-0.72l0.72,3.708
+ c-1.8,0.72-3.996,1.116-6.372,1.116c-5.975,0-9.395-3.492-9.395-8.999c0-4.463,2.771-9.395,8.891-9.395
+ c5.688,0,7.847,4.427,7.847,8.783c0,0.936-0.108,1.764-0.18,2.16H85.836z M92.28,14.758c0-1.332-0.576-3.563-3.096-3.563
+ c-2.304,0-3.24,2.088-3.384,3.563H92.28z"/>
+ <path fill="#5C6F7B" d="M100.15,13.75c0-2.592-0.072-4.283-0.144-5.795h4.715l0.181,3.239h0.144
+ c0.899-2.556,3.06-3.635,4.751-3.635c0.504,0,0.756,0,1.152,0.072v5.184c-0.396-0.108-0.864-0.18-1.477-0.18
+ c-2.016,0-3.383,1.08-3.743,2.771c-0.071,0.36-0.108,0.792-0.108,1.224v8.927h-5.471V13.75z"/>
+ <path fill="#5C6F7B" d="M117.387,18.501c0.18,2.268,2.411,3.348,4.967,3.348c1.872,0,3.384-0.252,4.859-0.72l0.721,3.708
+ c-1.801,0.72-3.996,1.116-6.372,1.116c-5.976,0-9.395-3.492-9.395-8.999c0-4.463,2.771-9.395,8.891-9.395
+ c5.688,0,7.847,4.427,7.847,8.783c0,0.936-0.107,1.764-0.18,2.16H117.387z M123.83,14.758c0-1.332-0.576-3.563-3.096-3.563
+ c-2.305,0-3.24,2.088-3.385,3.563H123.83z"/>
+ <path fill="#5C6F7B" d="M148.803,0v20.301c0,1.98,0.071,4.067,0.143,5.255h-4.859l-0.252-2.592h-0.071
+ c-1.116,1.98-3.239,2.988-5.507,2.988c-4.176,0-7.523-3.563-7.523-9.035c-0.036-5.939,3.672-9.359,7.883-9.359
+ c2.16,0,3.852,0.756,4.644,1.979h0.071V0H148.803z M143.33,15.406c0-0.288-0.035-0.684-0.071-0.972
+ c-0.324-1.476-1.512-2.7-3.204-2.7c-2.483,0-3.779,2.232-3.779,5.003c0,2.988,1.477,4.859,3.744,4.859
+ c1.584,0,2.844-1.08,3.167-2.628c0.108-0.396,0.144-0.792,0.144-1.26V15.406z"/>
+ <path fill="#5C6F7B" d="M159.748,0h5.471v10.042h0.072c1.044-1.512,2.88-2.483,5.328-2.483c4.211,0,7.307,3.491,7.271,8.891
+ c0,6.335-4.031,9.503-8.063,9.503c-2.051,0-4.031-0.756-5.291-2.844h-0.072l-0.215,2.448h-4.645
+ c0.072-1.152,0.145-3.275,0.145-5.255V0z M165.219,18.069c0,0.36,0.037,0.684,0.108,0.972c0.36,1.476,1.62,2.592,3.204,2.592
+ c2.34,0,3.779-1.8,3.779-4.968c0-2.735-1.225-4.895-3.779-4.895c-1.477,0-2.844,1.116-3.204,2.7
+ c-0.071,0.324-0.108,0.648-0.108,1.008V18.069z"/>
+ <path fill="#5C6F7B" d="M184.162,7.955l2.628,8.639c0.287,1.044,0.647,2.34,0.863,3.275h0.108c0.252-0.936,0.54-2.268,0.792-3.275
+ l2.159-8.639h5.867l-4.104,11.59c-2.52,6.983-4.211,9.791-6.19,11.555c-1.908,1.656-3.924,2.231-5.292,2.412l-1.151-4.644
+ c0.684-0.108,1.548-0.432,2.375-0.936c0.828-0.432,1.729-1.295,2.269-2.195c0.18-0.252,0.288-0.54,0.288-0.792
+ c0-0.18-0.036-0.468-0.253-0.9l-6.443-16.09H184.162z"/>
+ </g>
+</g>
+</svg>
diff --git a/packages/adobe-flash/flash-plugin_10.0.12.36.bb b/packages/adobe-flash/flash-plugin_10.0.12.36.bb new file mode 100644 index 0000000000..d6cde60031 --- /dev/null +++ b/packages/adobe-flash/flash-plugin_10.0.12.36.bb @@ -0,0 +1,35 @@ +# Adobe provides two versions of flash player packages +# +# One "unversioned" download at : +# +# ${ADOBE_MIRROR}/install_flash_player_9_linux.tar.gz +# +# And the other, versioned, which is encapsulated in RPM. +# +# We use the versioned one to make sure we can keep track of the +# version and thus do repeatable builds at the cost of future download +# failures when adobe updates. +DESCRIPTION = "Adobe Flash 9 plugin for Mozilla/Firefox web browsers" +LICENSE = "AdobeFlash" +DEPENDS = "rpm2cpio-native" +PR = "r1" + +SRC_URI = "${ADOBE_MIRROR}/flash-plugin-${PV}-release.i386.rpm" + +do_configure() { + rpm=${WORKDIR}/flash-plugin-${PV}-release.i386.rpm + if [ -f "$rpm" ]; then + rpm2cpio.pl $rpm | cpio -id + find . -type f -exec mv -i {} "`pwd`" \; + fi +} +do_install() { + mkdir -p ${D}${libdir}/mozilla/plugins/ + install -m 0755 libflashplayer.so ${D}${libdir}/mozilla/plugins/ + # AFAIK this is not needed + # install -m 0644 flashplayer.xpt ${D}${libdir}/mozilla/plugins/ +} + +FILES_${PN} = "${libdir}/* ${libdir}/X11/*" + +COMPATIBLE_HOST = "i.86.*-linux" diff --git a/packages/alsa/alsa-state.bb b/packages/alsa/alsa-state.bb index a6c613403c..3ebc0d5476 100644 --- a/packages/alsa/alsa-state.bb +++ b/packages/alsa/alsa-state.bb @@ -7,7 +7,7 @@ DESCRIPTION = "Alsa Scenario Files" LICENSE = "MIT" PV = "0.2.0" -PR = "r2" +PR = "r3" SRC_URI = "\ file://asound.conf \ diff --git a/packages/alsa/alsa-state/at91sam9263ek/asound.conf b/packages/alsa/alsa-state/at91sam9263ek/asound.conf new file mode 100644 index 0000000000..87bb5ec050 --- /dev/null +++ b/packages/alsa/alsa-state/at91sam9263ek/asound.conf @@ -0,0 +1,2 @@ +pcm.!default { type hw card 0 } +ctl.!default { type hw card 0 } diff --git a/packages/alsa/alsa-utils_1.0.18.bb b/packages/alsa/alsa-utils_1.0.18.bb index 5bcad4f525..2931545252 100644 --- a/packages/alsa/alsa-utils_1.0.18.bb +++ b/packages/alsa/alsa-utils_1.0.18.bb @@ -8,6 +8,7 @@ PR = "r1" SRC_URI = "ftp://ftp.alsa-project.org/pub/utils/alsa-utils-${PV}.tar.bz2 \ file://alsa-utils-automake.patch;patch=1 \ file://alsa-utils-remove-xmlto.patch;patch=1 \ + file://alsa-utils-autoconf-strl-funcs.patch;patch=1 \ " inherit autotools diff --git a/packages/alsa/files/alsa-utils-autoconf-strl-funcs.patch b/packages/alsa/files/alsa-utils-autoconf-strl-funcs.patch new file mode 100644 index 0000000000..d736abbdab --- /dev/null +++ b/packages/alsa/files/alsa-utils-autoconf-strl-funcs.patch @@ -0,0 +1,43 @@ +Index: alsa-utils-1.0.18/alsactl/init_sysdeps.c +=================================================================== +--- alsa-utils-1.0.18.orig/alsactl/init_sysdeps.c 2008-10-29 05:42:11.000000000 -0700 ++++ alsa-utils-1.0.18/alsactl/init_sysdeps.c 2009-02-10 23:17:47.000000000 -0800 +@@ -17,7 +17,7 @@ + * + */ + +-#ifdef __GLIBC__ ++#if !HAVE_STRLCPY + static size_t strlcpy(char *dst, const char *src, size_t size) + { + size_t bytes = 0; +@@ -36,7 +36,10 @@ + *q = '\0'; + return bytes; + } ++#endif /* !HAVE_STRLCPY */ + ++ ++#if !HAVE_STRLCAT + static size_t strlcat(char *dst, const char *src, size_t size) + { + size_t bytes = 0; +@@ -60,4 +63,4 @@ + *q = '\0'; + return bytes; + } +-#endif /* __GLIBC__ */ ++#endif /* !HAVE_STRLCAT */ +Index: alsa-utils-1.0.18/configure.in +=================================================================== +--- alsa-utils-1.0.18.orig/configure.in 2008-10-29 05:48:01.000000000 -0700 ++++ alsa-utils-1.0.18/configure.in 2009-02-10 23:02:07.000000000 -0800 +@@ -6,7 +6,7 @@ + + AM_GNU_GETTEXT([external]) + AM_GNU_GETTEXT_VERSION([0.15]) +- ++AC_CHECK_FUNCS([strlcat strlcpy]) + dnl Checks for programs. + + dnl try to gues cross-compiler if not set diff --git a/packages/at76c503a/at76c503a-modules/at76_usb-0.17-.patch b/packages/at76c503a/at76c503a-modules/at76_usb-0.17-.patch new file mode 100644 index 0000000000..06200f5ac7 --- /dev/null +++ b/packages/at76c503a/at76c503a-modules/at76_usb-0.17-.patch @@ -0,0 +1,66 @@ +--- at76_usb-0.17/at76_usb.c 2007-09-30 09:21:38.000000000 +0200 ++++ at76_usb-0.17.1/at76_usb.c 2008-12-02 17:29:15.000000000 +0100 +@@ -2327,7 +2327,7 @@ + iwe->cmd = SIOCGIWAP; + iwe->u.ap_addr.sa_family = ARPHRD_ETHER; + memcpy(iwe->u.ap_addr.sa_data, curr_bss->bssid, 6); +- curr_pos = iwe_stream_add_event(curr_pos, ++ curr_pos = iwe_stream_add_event(info, curr_pos, + extra + IW_SCAN_MAX_DATA, iwe, + IW_EV_ADDR_LEN); + +@@ -2335,7 +2335,7 @@ + iwe->cmd = SIOCGIWESSID; + iwe->u.data.flags = 1; + +- curr_pos = iwe_stream_add_point(curr_pos, ++ curr_pos = iwe_stream_add_point(info, curr_pos, + extra + IW_SCAN_MAX_DATA, iwe, + curr_bss->ssid); + +@@ -2346,14 +2346,14 @@ + IW_MODE_MASTER : IW_MODE_AUTO; + /* IW_MODE_AUTO = 0 which I thought is + * the most logical value to return in this case */ +- curr_pos = iwe_stream_add_event(curr_pos, ++ curr_pos = iwe_stream_add_event(info, curr_pos, + extra + IW_SCAN_MAX_DATA, iwe, + IW_EV_UINT_LEN); + + iwe->cmd = SIOCGIWFREQ; + iwe->u.freq.m = curr_bss->channel; + iwe->u.freq.e = 0; +- curr_pos = iwe_stream_add_event(curr_pos, ++ curr_pos = iwe_stream_add_event(info, curr_pos, + extra + IW_SCAN_MAX_DATA, iwe, + IW_EV_FREQ_LEN); + +@@ -2364,7 +2364,7 @@ + iwe->u.data.flags = IW_ENCODE_DISABLED; + + iwe->u.data.length = 0; +- curr_pos = iwe_stream_add_point(curr_pos, ++ curr_pos = iwe_stream_add_point(info, curr_pos, + extra + IW_SCAN_MAX_DATA, iwe, + NULL); + +@@ -2383,7 +2383,7 @@ + iwe->u.qual.updated |= IW_QUAL_QUAL_INVALID; + } + /* Add new value to event */ +- curr_pos = iwe_stream_add_event(curr_pos, ++ curr_pos = iwe_stream_add_event(info, curr_pos, + extra + IW_SCAN_MAX_DATA, iwe, + IW_EV_QUAL_LEN); + +@@ -2401,8 +2401,8 @@ + iwe->u.bitrate.value = + ((curr_bss->rates[i] & 0x7f) * 500000); + /* Add new value to event */ +- curr_val = iwe_stream_add_value(curr_pos, curr_val, +- extra + ++ curr_val = iwe_stream_add_value(info, curr_pos, ++ curr_val, extra + + IW_SCAN_MAX_DATA, iwe, + IW_EV_PARAM_LEN); + } diff --git a/packages/at76c503a/at76c503a-modules_0.17.bb b/packages/at76c503a/at76c503a-modules_0.17.bb index 58b782b483..e0230ded84 100644 --- a/packages/at76c503a/at76c503a-modules_0.17.bb +++ b/packages/at76c503a/at76c503a-modules_0.17.bb @@ -2,11 +2,13 @@ DESCRIPTION = "Driver for at76 based usb-wifi devices" SECTION = "base" LICENSE = "GPL" -PR = "r1" +PR = "r2" RDEPENDS = "at76c503-firmware" SRC_URI = "http://download.berlios.de/at76c503a/at76_usb-0.17.tar.gz" +SRC_URI_ixp4xx = "http://download.berlios.de/at76c503a/at76_usb-0.17.tar.gz \ + file://at76_usb-0.17-.patch;patch=1" S = "${WORKDIR}/at76_usb-${PV}/" inherit module diff --git a/packages/aufs/aufs/aufs_create_no_manpage.patch b/packages/aufs/aufs/aufs_create_no_manpage.patch deleted file mode 100644 index ec7c0c1138..0000000000 --- a/packages/aufs/aufs/aufs_create_no_manpage.patch +++ /dev/null @@ -1,34 +0,0 @@ -OE-only: -comment: Not building the manpage is just a hack. - -diff -Nur aufs.vanilla/util/Makefile aufs/util/Makefile ---- aufs.vanilla/util/Makefile 2008-08-23 13:00:37.000000000 +0200 -+++ aufs/util/Makefile 2008-08-23 15:40:26.000000000 +0200 -@@ -1,25 +1,10 @@ - - # $Id: Makefile,v 1.10 2008/05/26 04:02:40 sfjro Exp $ - --all: aufs.5 aulchown -+all: aulchown - test -x ./mount.aufs || chmod a+x ./mount.aufs - --aufs.5: aufs.in.5 ./c2tmac -- ${RM} $@ -- ./c2tmac > $@ -- awk '{ \ -- gsub(/\140[^\047]*\047/, "\\[oq]&\\[cq]"); \ -- gsub(/\\\[oq\]\140/, "\\[oq]"); \ -- gsub(/\047\\\[cq\]/, "\\[cq]"); \ -- gsub(/\047/, "\\[aq]"); \ -- print; \ -- }' aufs.in.5 >> $@ -- chmod a-w $@ -- - CFLAGS += -O2 -Wall ${EXTRA_CFLAGS} ${ccflags-y} - --.INTERMEDIATE: c2tmac.o c2tmac --c2tmac.o: c2tmac.c ../include/linux/aufs_type.h -- - clean: -- ${RM} c2tmac aulchown aufs.5 *~ .*~ -+ ${RM} aulchown *~ .*~ diff --git a/packages/aufs/aufs_cvs.bb b/packages/aufs/aufs_cvs.bb index cf98e08fc9..815a24fda4 100644 --- a/packages/aufs/aufs_cvs.bb +++ b/packages/aufs/aufs_cvs.bb @@ -2,7 +2,7 @@ DESCRIPTION = "Aufs is a stackable unification filesystem such as Unionfs, which HOMEPAGE = "http://aufs.sourceforge.net/" LICENSE = "GPL" PV = "cvs${SRCDATE}" -PR = "r2" +PR = "r3" RSUGGESTS_${PN} = "${PN}-tools" @@ -10,12 +10,6 @@ inherit module S = "${WORKDIR}/aufs" -# We do not create the manpage for aufs because we do not install it anyway. -# If you want to have the manpage created you will need to add host cc to -# the makefile else it will fail to crosscompile. -# See http://svn.exactcode.de/t2/trunk/package/filesystem/aufs/compile.patch.cross -# as an example how this could be done. - SRC_URI = "cvs://anonymous@aufs.cvs.sourceforge.net/cvsroot/aufs;module=aufs;date=${SRCDATE}" EXTRA_OEMAKE = "KDIR=${STAGING_KERNEL_DIR} -f local.mk" @@ -39,6 +33,16 @@ do_configure() { fi } +do_compile_prepend() { +#compile binaries for host + cd ${S}/util + BRANCH_MAX=$(fgrep CONFIG_AUFS_BRANCH_MAX ../local.mk | grep y | cut -d " " -f 2) + ${BUILD_CC} -D ${BRANCH_MAX} c2tmac.c ../include/linux/aufs_type.h -o c2tmac + ${BUILD_CC} -D ${BRANCH_MAX} c2sh.c ../include/linux/aufs_type.h -o c2sh + cd ${S} +} + + do_install() { install -d ${D}/${sbindir} install -m 0500 mount.aufs umount.aufs auplink aulchown ${D}/${sbindir} diff --git a/packages/avahi/avahi_0.6.24.bb b/packages/avahi/avahi_0.6.24.bb new file mode 100644 index 0000000000..15f56ffa95 --- /dev/null +++ b/packages/avahi/avahi_0.6.24.bb @@ -0,0 +1,5 @@ +require avahi.inc + +DEPENDS += "intltool-native" + +PACKAGES =+ "libavahi-gobject" diff --git a/packages/base-files/base-files/kaeilos/issue b/packages/base-files/base-files/kaeilos/issue new file mode 100644 index 0000000000..ea00fdb3db --- /dev/null +++ b/packages/base-files/base-files/kaeilos/issue @@ -0,0 +1,12 @@ + +## ## ### ######## #### ## ####### ###### +## ## ## ## ## ## ## ## ## ## ## +## ## ## ## ## ## ## ## ## ## +##### ## ## ###### ## ## ## ## ###### +## ## ######### ## ## ## ## ## ## +## ## ## ## ## ## ## ## ## ## ## +## ## ## ## ######## #### ######## ####### ######(R) +KaeilOS Linux \n \l + +KaeilOS 2008.1-test-20081222 \n \l + diff --git a/packages/base-files/base-files/kaeilos/issue.net b/packages/base-files/base-files/kaeilos/issue.net new file mode 100644 index 0000000000..781939c966 --- /dev/null +++ b/packages/base-files/base-files/kaeilos/issue.net @@ -0,0 +1,12 @@ + +## ## ### ######## #### ## ####### ###### +## ## ## ## ## ## ## ## ## ## ## +## ## ## ## ## ## ## ## ## ## +##### ## ## ###### ## ## ## ## ###### +## ## ######### ## ## ## ## ## ## +## ## ## ## ## ## ## ## ## ## ## +## ## ## ## ######## #### ######## ####### ######(R) +KaeilOS Linux %h + +KaeilOS 2008.1-test-20081222 %h + diff --git a/packages/base-files/base-files_3.0.14.bb b/packages/base-files/base-files_3.0.14.bb index 3072e238a0..8d57794159 100644 --- a/packages/base-files/base-files_3.0.14.bb +++ b/packages/base-files/base-files_3.0.14.bb @@ -1,7 +1,7 @@ DESCRIPTION = "Miscellaneous files for the base system." SECTION = "base" PRIORITY = "required" -PR = "r83" +PR = "r84" LICENSE = "GPL" SRC_URI = " \ diff --git a/packages/bison/bison-native_2.3.bb b/packages/bison/bison-native_2.3.bb index ec2f269eec..af6249ac9d 100644 --- a/packages/bison/bison-native_2.3.bb +++ b/packages/bison/bison-native_2.3.bb @@ -2,6 +2,7 @@ require bison_${PV}.bb SECTION = "devel" FILESDIR = "${@os.path.dirname(bb.data.getVar('FILE',d,1))}/bison-${PV}" S = "${WORKDIR}/bison-${PV}" +PR="r1" inherit native autotools @@ -15,6 +16,7 @@ exec ${STAGING_BINDIR}/bison -y "\$@" EOF chmod a+rx ${STAGING_BINDIR}/yacc install -d ${STAGING_DATADIR}/bison/m4sugar - install -m 0755 data/c.m4 data/glr.c data/lalr1.cc data/yacc.c ${STAGING_DATADIR}/bison/ + install -m 0755 data/c.m4 data/c++.m4 data/glr.c data/glr.cc data/lalr1.cc data/location.cc data/yacc.c ${STAGING_DATADIR}/bison/ + install -m 0755 data/m4sugar/m4sugar.m4 ${STAGING_DATADIR}/bison/m4sugar/ } diff --git a/packages/blackbox/blackbox_0.70.1.bb b/packages/blackbox/blackbox_0.70.1.bb index 50dc5a69c6..05010f97bb 100644 --- a/packages/blackbox/blackbox_0.70.1.bb +++ b/packages/blackbox/blackbox_0.70.1.bb @@ -2,7 +2,7 @@ DESCRIPTION = "Blackbox Window Manager" SECTION = "x11/wm" LICENSE = "GPL" DEPENDS = "libx11 libxext libxcomposite libxfixes libxdamage libxrender libxinerama libxpm xrandr xft" -PR = "r0" +PR = "r1" SRC_URI = "${SOURCEFORGE_MIRROR}/blackboxwm/blackbox-0.70.1.tar.gz \ file://remove-host-includes.patch;patch=1" @@ -12,3 +12,10 @@ inherit autotools pkgconfig EXTRA_OECONF = "--disable-i18n --without-imlib --with-xpm --with-gnome-menus" +#fix path of pc file +do_install_append() { + sed -i s#${STAGING_LIBDIR}#${libdir}#g ${D}/${libdir}/pkgconfig/libbt.pc +} +do_stage_append () { + sed -i s#${STAGING_LIBDIR}#${libdir}#g ${STAGING_LIBDIR}/pkgconfig/libbt.pc +} diff --git a/packages/busybox/busybox-1.11.3/kaeilos/defconfig b/packages/busybox/busybox-1.11.3/kaeilos/defconfig new file mode 100644 index 0000000000..f3130caca8 --- /dev/null +++ b/packages/busybox/busybox-1.11.3/kaeilos/defconfig @@ -0,0 +1,855 @@ +# +# Automatically generated make config: don't edit +# Busybox version: 1.11.1 +# Thu Oct 9 14:15:08 2008 +# +CONFIG_HAVE_DOT_CONFIG=y + +# +# Busybox Settings +# + +# +# General Configuration +# +# CONFIG_DESKTOP is not set +CONFIG_FEATURE_ASSUME_UNICODE=y +CONFIG_FEATURE_BUFFERS_USE_MALLOC=y +# CONFIG_FEATURE_BUFFERS_GO_ON_STACK is not set +# CONFIG_FEATURE_BUFFERS_GO_IN_BSS is not set +CONFIG_SHOW_USAGE=y +# CONFIG_FEATURE_VERBOSE_USAGE is not set +CONFIG_FEATURE_COMPRESS_USAGE=y +# CONFIG_FEATURE_INSTALLER is not set +CONFIG_LOCALE_SUPPORT=y +CONFIG_GETOPT_LONG=y +CONFIG_FEATURE_DEVPTS=y +# CONFIG_FEATURE_CLEAN_UP is not set +CONFIG_FEATURE_PIDFILE=y +CONFIG_FEATURE_SUID=y +CONFIG_FEATURE_SUID_CONFIG=y +CONFIG_FEATURE_SUID_CONFIG_QUIET=y +# CONFIG_SELINUX is not set +# CONFIG_FEATURE_PREFER_APPLETS is not set +CONFIG_BUSYBOX_EXEC_PATH="/proc/self/exe" +CONFIG_FEATURE_SYSLOG=y +CONFIG_FEATURE_HAVE_RPC=y + +# +# Build Options +# +# CONFIG_STATIC is not set +# CONFIG_PIE is not set +# CONFIG_NOMMU is not set +# CONFIG_BUILD_LIBBUSYBOX is not set +# CONFIG_FEATURE_INDIVIDUAL is not set +# CONFIG_FEATURE_SHARED_BUSYBOX is not set +CONFIG_LFS=y +CONFIG_CROSS_COMPILER_PREFIX="" + +# +# Debugging Options +# +# CONFIG_DEBUG is not set +# CONFIG_DEBUG_PESSIMIZE is not set +# CONFIG_WERROR is not set +CONFIG_NO_DEBUG_LIB=y +# CONFIG_DMALLOC is not set +# CONFIG_EFENCE is not set +# CONFIG_INCLUDE_SUSv2 is not set + +# +# Installation Options +# +# CONFIG_INSTALL_NO_USR is not set +CONFIG_INSTALL_APPLET_SYMLINKS=y +# CONFIG_INSTALL_APPLET_HARDLINKS is not set +# CONFIG_INSTALL_APPLET_SCRIPT_WRAPPERS is not set +# CONFIG_INSTALL_APPLET_DONT is not set +# CONFIG_INSTALL_SH_APPLET_SYMLINK is not set +# CONFIG_INSTALL_SH_APPLET_HARDLINK is not set +# CONFIG_INSTALL_SH_APPLET_SCRIPT_WRAPPER is not set +CONFIG_PREFIX="./_install" + +# +# Busybox Library Tuning +# +CONFIG_PASSWORD_MINLEN=6 +CONFIG_MD5_SIZE_VS_SPEED=2 +CONFIG_FEATURE_FAST_TOP=y +# CONFIG_FEATURE_ETC_NETWORKS is not set +CONFIG_FEATURE_EDITING=y +CONFIG_FEATURE_EDITING_MAX_LEN=1024 +# CONFIG_FEATURE_EDITING_VI is not set +CONFIG_FEATURE_EDITING_HISTORY=15 +CONFIG_FEATURE_EDITING_SAVEHISTORY=y +CONFIG_FEATURE_TAB_COMPLETION=y +CONFIG_FEATURE_USERNAME_COMPLETION=y +CONFIG_FEATURE_EDITING_FANCY_PROMPT=y +CONFIG_FEATURE_VERBOSE_CP_MESSAGE=y +CONFIG_FEATURE_COPYBUF_KB=4 +CONFIG_MONOTONIC_SYSCALL=y +CONFIG_IOCTL_HEX2STR_ERROR=y +CONFIG_FEATURE_HWIB=y + +# +# Applets +# + +# +# Archival Utilities +# +CONFIG_AR=y +# CONFIG_FEATURE_AR_LONG_FILENAMES is not set +CONFIG_BUNZIP2=y +# CONFIG_BZIP2 is not set +CONFIG_CPIO=y +# CONFIG_FEATURE_CPIO_O is not set +# CONFIG_DPKG is not set +# CONFIG_DPKG_DEB is not set +# CONFIG_FEATURE_DPKG_DEB_EXTRACT_ONLY is not set +CONFIG_GUNZIP=y +# CONFIG_FEATURE_GUNZIP_UNCOMPRESS is not set +CONFIG_GZIP=y +# CONFIG_RPM2CPIO is not set +# CONFIG_RPM is not set +# CONFIG_FEATURE_RPM_BZ2 is not set +CONFIG_TAR=y +CONFIG_FEATURE_TAR_CREATE=y +CONFIG_FEATURE_TAR_GZIP=y +CONFIG_FEATURE_TAR_BZIP2=y +# CONFIG_FEATURE_TAR_LZMA is not set +# CONFIG_FEATURE_TAR_COMPRESS is not set +CONFIG_FEATURE_TAR_AUTODETECT=y +CONFIG_FEATURE_TAR_FROM=y +CONFIG_FEATURE_TAR_OLDGNU_COMPATIBILITY=y +# CONFIG_FEATURE_TAR_OLDSUN_COMPATIBILITY is not set +CONFIG_FEATURE_TAR_GNU_EXTENSIONS=y +# CONFIG_FEATURE_TAR_LONG_OPTIONS is not set +CONFIG_FEATURE_TAR_UNAME_GNAME=y +# CONFIG_UNCOMPRESS is not set +# CONFIG_UNLZMA is not set +# CONFIG_FEATURE_LZMA_FAST is not set +CONFIG_UNZIP=y + +# +# Common options for cpio and tar +# +# CONFIG_FEATURE_DEB_TAR_GZ is not set +# CONFIG_FEATURE_DEB_TAR_BZ2 is not set +# CONFIG_FEATURE_DEB_TAR_LZMA is not set + +# +# Coreutils +# +CONFIG_BASENAME=y +# CONFIG_CAL is not set +CONFIG_CAT=y +# CONFIG_CATV is not set +CONFIG_CHGRP=y +CONFIG_CHMOD=y +CONFIG_CHOWN=y +CONFIG_CHROOT=y +# CONFIG_CKSUM is not set +# CONFIG_COMM is not set +CONFIG_CP=y +CONFIG_CUT=y +CONFIG_DATE=y +CONFIG_FEATURE_DATE_ISOFMT=y +CONFIG_DD=y +CONFIG_FEATURE_DD_SIGNAL_HANDLING=y +# CONFIG_FEATURE_DD_IBS_OBS is not set +CONFIG_DF=y +# CONFIG_FEATURE_DF_INODE is not set +CONFIG_DIRNAME=y +# CONFIG_DOS2UNIX is not set +# CONFIG_UNIX2DOS is not set +CONFIG_DU=y +CONFIG_FEATURE_DU_DEFAULT_BLOCKSIZE_1K=y +CONFIG_ECHO=y +CONFIG_FEATURE_FANCY_ECHO=y +CONFIG_ENV=y +CONFIG_FEATURE_ENV_LONG_OPTIONS=y +# CONFIG_EXPAND is not set +# CONFIG_FEATURE_EXPAND_LONG_OPTIONS is not set +CONFIG_EXPR=y +# CONFIG_EXPR_MATH_SUPPORT_64 is not set +CONFIG_FALSE=y +# CONFIG_FOLD is not set +CONFIG_HEAD=y +# CONFIG_FEATURE_FANCY_HEAD is not set +# CONFIG_HOSTID is not set +CONFIG_ID=y +# CONFIG_INSTALL is not set +# CONFIG_FEATURE_INSTALL_LONG_OPTIONS is not set +# CONFIG_LENGTH is not set +CONFIG_LN=y +CONFIG_LOGNAME=y +CONFIG_LS=y +CONFIG_FEATURE_LS_FILETYPES=y +CONFIG_FEATURE_LS_FOLLOWLINKS=y +CONFIG_FEATURE_LS_RECURSIVE=y +CONFIG_FEATURE_LS_SORTFILES=y +CONFIG_FEATURE_LS_TIMESTAMPS=y +CONFIG_FEATURE_LS_USERNAME=y +CONFIG_FEATURE_LS_COLOR=y +# CONFIG_FEATURE_LS_COLOR_IS_DEFAULT is not set +CONFIG_MD5SUM=y +CONFIG_MKDIR=y +CONFIG_FEATURE_MKDIR_LONG_OPTIONS=y +CONFIG_MKFIFO=y +CONFIG_MKNOD=y +CONFIG_MV=y +# CONFIG_FEATURE_MV_LONG_OPTIONS is not set +# CONFIG_NICE is not set +CONFIG_NOHUP=y +CONFIG_OD=y +# CONFIG_PRINTENV is not set +CONFIG_PRINTF=y +CONFIG_PWD=y +CONFIG_READLINK=y +CONFIG_FEATURE_READLINK_FOLLOW=y +CONFIG_REALPATH=y +CONFIG_RM=y +CONFIG_RMDIR=y +# CONFIG_FEATURE_RMDIR_LONG_OPTIONS is not set +CONFIG_SEQ=y +# CONFIG_SHA1SUM is not set +CONFIG_SLEEP=y +CONFIG_FEATURE_FANCY_SLEEP=y +CONFIG_SORT=y +CONFIG_FEATURE_SORT_BIG=y +# CONFIG_SPLIT is not set +# CONFIG_FEATURE_SPLIT_FANCY is not set +# CONFIG_STAT is not set +# CONFIG_FEATURE_STAT_FORMAT is not set +CONFIG_STTY=y +# CONFIG_SUM is not set +CONFIG_SYNC=y +# CONFIG_TAC is not set +CONFIG_TAIL=y +CONFIG_FEATURE_FANCY_TAIL=y +CONFIG_TEE=y +# CONFIG_FEATURE_TEE_USE_BLOCK_IO is not set +CONFIG_TEST=y +# CONFIG_FEATURE_TEST_64 is not set +CONFIG_TOUCH=y +CONFIG_TR=y +CONFIG_FEATURE_TR_CLASSES=y +# CONFIG_FEATURE_TR_EQUIV is not set +CONFIG_TRUE=y +CONFIG_TTY=y +CONFIG_UNAME=y +# CONFIG_UNEXPAND is not set +# CONFIG_FEATURE_UNEXPAND_LONG_OPTIONS is not set +CONFIG_UNIQ=y +CONFIG_USLEEP=y +# CONFIG_UUDECODE is not set +# CONFIG_UUENCODE is not set +CONFIG_WC=y +# CONFIG_FEATURE_WC_LARGE is not set +CONFIG_WHO=y +CONFIG_WHOAMI=y +CONFIG_YES=y + +# +# Common options for cp and mv +# +# CONFIG_FEATURE_PRESERVE_HARDLINKS is not set + +# +# Common options for ls, more and telnet +# +CONFIG_FEATURE_AUTOWIDTH=y + +# +# Common options for df, du, ls +# +CONFIG_FEATURE_HUMAN_READABLE=y + +# +# Common options for md5sum, sha1sum +# +CONFIG_FEATURE_MD5_SHA1_SUM_CHECK=y + +# +# Console Utilities +# +CONFIG_CHVT=y +CONFIG_CLEAR=y +CONFIG_DEALLOCVT=y +CONFIG_DUMPKMAP=y +# CONFIG_KBD_MODE is not set +CONFIG_LOADFONT=y +CONFIG_LOADKMAP=y +CONFIG_OPENVT=y +CONFIG_RESET=y +# CONFIG_RESIZE is not set +# CONFIG_FEATURE_RESIZE_PRINT is not set +CONFIG_SETCONSOLE=y +# CONFIG_FEATURE_SETCONSOLE_LONG_OPTIONS is not set +# CONFIG_SETKEYCODES is not set +# CONFIG_SETLOGCONS is not set + +# +# Debian Utilities +# +CONFIG_MKTEMP=y +# CONFIG_PIPE_PROGRESS is not set +CONFIG_RUN_PARTS=y +CONFIG_FEATURE_RUN_PARTS_LONG_OPTIONS=y +CONFIG_FEATURE_RUN_PARTS_FANCY=y +CONFIG_START_STOP_DAEMON=y +CONFIG_FEATURE_START_STOP_DAEMON_FANCY=y +CONFIG_FEATURE_START_STOP_DAEMON_LONG_OPTIONS=y +CONFIG_WHICH=y + +# +# Editors +# +CONFIG_AWK=y +CONFIG_FEATURE_AWK_MATH=y +CONFIG_CMP=y +CONFIG_DIFF=y +CONFIG_FEATURE_DIFF_BINARY=y +CONFIG_FEATURE_DIFF_DIR=y +CONFIG_FEATURE_DIFF_MINIMAL=y +# CONFIG_ED is not set +CONFIG_PATCH=y +CONFIG_SED=y +CONFIG_VI=y +CONFIG_FEATURE_VI_MAX_LEN=1024 +CONFIG_FEATURE_VI_8BIT=y +CONFIG_FEATURE_VI_COLON=y +CONFIG_FEATURE_VI_YANKMARK=y +CONFIG_FEATURE_VI_SEARCH=y +CONFIG_FEATURE_VI_USE_SIGNALS=y +CONFIG_FEATURE_VI_DOT_CMD=y +# CONFIG_FEATURE_VI_READONLY is not set +# CONFIG_FEATURE_VI_SETOPTS is not set +CONFIG_FEATURE_VI_SET=y +CONFIG_FEATURE_VI_WIN_RESIZE=y +CONFIG_FEATURE_VI_OPTIMIZE_CURSOR=y +CONFIG_FEATURE_ALLOW_EXEC=y + +# +# Finding Utilities +# +CONFIG_FIND=y +CONFIG_FEATURE_FIND_PRINT0=y +CONFIG_FEATURE_FIND_MTIME=y +CONFIG_FEATURE_FIND_MMIN=y +CONFIG_FEATURE_FIND_PERM=y +CONFIG_FEATURE_FIND_TYPE=y +CONFIG_FEATURE_FIND_XDEV=y +CONFIG_FEATURE_FIND_MAXDEPTH=y +CONFIG_FEATURE_FIND_NEWER=y +# CONFIG_FEATURE_FIND_INUM is not set +CONFIG_FEATURE_FIND_EXEC=y +CONFIG_FEATURE_FIND_USER=y +CONFIG_FEATURE_FIND_GROUP=y +CONFIG_FEATURE_FIND_NOT=y +CONFIG_FEATURE_FIND_DEPTH=y +CONFIG_FEATURE_FIND_PAREN=y +CONFIG_FEATURE_FIND_SIZE=y +CONFIG_FEATURE_FIND_PRUNE=y +# CONFIG_FEATURE_FIND_DELETE is not set +CONFIG_FEATURE_FIND_PATH=y +CONFIG_FEATURE_FIND_REGEX=y +# CONFIG_FEATURE_FIND_CONTEXT is not set +CONFIG_GREP=y +CONFIG_FEATURE_GREP_EGREP_ALIAS=y +CONFIG_FEATURE_GREP_FGREP_ALIAS=y +CONFIG_FEATURE_GREP_CONTEXT=y +CONFIG_XARGS=y +# CONFIG_FEATURE_XARGS_SUPPORT_CONFIRMATION is not set +CONFIG_FEATURE_XARGS_SUPPORT_QUOTES=y +# CONFIG_FEATURE_XARGS_SUPPORT_TERMOPT is not set +# CONFIG_FEATURE_XARGS_SUPPORT_ZERO_TERM is not set + +# +# Init Utilities +# +CONFIG_INIT=y +# CONFIG_DEBUG_INIT is not set +CONFIG_FEATURE_USE_INITTAB=y +CONFIG_FEATURE_KILL_REMOVED=y +CONFIG_FEATURE_KILL_DELAY=0 +# CONFIG_FEATURE_INIT_SCTTY is not set +# CONFIG_FEATURE_INIT_SYSLOG is not set +# CONFIG_FEATURE_EXTRA_QUIET is not set +# CONFIG_FEATURE_INIT_COREDUMPS is not set +CONFIG_FEATURE_INITRD=y +CONFIG_HALT=y +# CONFIG_MESG is not set + +# +# Login/Password Management Utilities +# +CONFIG_FEATURE_SHADOWPASSWDS=y +# CONFIG_USE_BB_PWD_GRP is not set +# CONFIG_USE_BB_SHADOW is not set +CONFIG_USE_BB_CRYPT=y +CONFIG_ADDGROUP=y +CONFIG_FEATURE_ADDUSER_TO_GROUP=y +CONFIG_DELGROUP=y +CONFIG_FEATURE_DEL_USER_FROM_GROUP=y +CONFIG_FEATURE_CHECK_NAMES=y +CONFIG_ADDUSER=y +CONFIG_FEATURE_ADDUSER_LONG_OPTIONS=y +CONFIG_DELUSER=y +CONFIG_GETTY=y +CONFIG_FEATURE_UTMP=y +CONFIG_FEATURE_WTMP=y +CONFIG_LOGIN=y +# CONFIG_PAM is not set +CONFIG_LOGIN_SCRIPTS=y +CONFIG_FEATURE_NOLOGIN=y +CONFIG_FEATURE_SECURETTY=y +CONFIG_PASSWD=y +CONFIG_FEATURE_PASSWD_WEAK_CHECK=y +CONFIG_CRYPTPW=y +CONFIG_CHPASSWD=y +CONFIG_SU=y +CONFIG_FEATURE_SU_SYSLOG=y +CONFIG_FEATURE_SU_CHECKS_SHELLS=y +CONFIG_SULOGIN=y +CONFIG_VLOCK=y + +# +# Linux Ext2 FS Progs +# +CONFIG_CHATTR=y +CONFIG_FSCK=y +# CONFIG_LSATTR is not set + +# +# Linux Module Utilities +# +# CONFIG_DEPMOD is not set +# CONFIG_FEATURE_DEPMOD_PRUNE_FANCY is not set +# CONFIG_FEATURE_DEPMOD_ALIAS is not set +CONFIG_INSMOD=y +# CONFIG_FEATURE_INSMOD_VERSION_CHECKING is not set +# CONFIG_FEATURE_INSMOD_KSYMOOPS_SYMBOLS is not set +# CONFIG_FEATURE_INSMOD_LOADINKMEM is not set +# CONFIG_FEATURE_INSMOD_LOAD_MAP is not set +# CONFIG_FEATURE_INSMOD_LOAD_MAP_FULL is not set +CONFIG_RMMOD=y +CONFIG_LSMOD=y +# CONFIG_FEATURE_LSMOD_PRETTY_2_6_OUTPUT is not set +CONFIG_MODPROBE=y +CONFIG_FEATURE_MODPROBE_MULTIPLE_OPTIONS=y +CONFIG_FEATURE_MODPROBE_FANCY_ALIAS=y +CONFIG_FEATURE_MODPROBE_BLACKLIST=y + +# +# Options common to multiple modutils +# +CONFIG_FEATURE_CHECK_TAINTED_MODULE=y +# CONFIG_FEATURE_2_4_MODULES is not set +CONFIG_FEATURE_2_6_MODULES=y +CONFIG_DEFAULT_MODULES_DIR="/lib/modules" +CONFIG_DEFAULT_DEPMOD_FILE="modules.dep" +# CONFIG_FEATURE_QUERY_MODULE_INTERFACE is not set + +# +# Linux System Utilities +# +CONFIG_DMESG=y +CONFIG_FEATURE_DMESG_PRETTY=y +CONFIG_FBSET=y +CONFIG_FEATURE_FBSET_FANCY=y +CONFIG_FEATURE_FBSET_READMODE=y +# CONFIG_FDFLUSH is not set +# CONFIG_FDFORMAT is not set +CONFIG_FDISK=y +CONFIG_FDISK_SUPPORT_LARGE_DISKS=y +CONFIG_FEATURE_FDISK_WRITABLE=y +# CONFIG_FEATURE_AIX_LABEL is not set +# CONFIG_FEATURE_SGI_LABEL is not set +# CONFIG_FEATURE_SUN_LABEL is not set +CONFIG_FEATURE_OSF_LABEL=y +CONFIG_FEATURE_FDISK_ADVANCED=y +# CONFIG_FINDFS is not set +# CONFIG_FREERAMDISK is not set +CONFIG_FSCK_MINIX=y +CONFIG_MKFS_MINIX=y + +# +# Minix filesystem support +# +CONFIG_FEATURE_MINIX2=y +CONFIG_GETOPT=y +CONFIG_HEXDUMP=y +# CONFIG_FEATURE_HEXDUMP_REVERSE is not set +# CONFIG_HD is not set +CONFIG_HWCLOCK=y +CONFIG_FEATURE_HWCLOCK_LONG_OPTIONS=y +CONFIG_FEATURE_HWCLOCK_ADJTIME_FHS=y +# CONFIG_IPCRM is not set +# CONFIG_IPCS is not set +CONFIG_LOSETUP=y +CONFIG_MDEV=y +CONFIG_FEATURE_MDEV_CONF=y +CONFIG_FEATURE_MDEV_RENAME=y +CONFIG_FEATURE_MDEV_RENAME_REGEXP=y +CONFIG_FEATURE_MDEV_EXEC=y +CONFIG_FEATURE_MDEV_LOAD_FIRMWARE=y +CONFIG_MKSWAP=y +# CONFIG_FEATURE_MKSWAP_V0 is not set +CONFIG_MORE=y +CONFIG_FEATURE_USE_TERMIOS=y +CONFIG_VOLUMEID=y +# CONFIG_FEATURE_VOLUMEID_EXT is not set +# CONFIG_FEATURE_VOLUMEID_REISERFS is not set +# CONFIG_FEATURE_VOLUMEID_FAT is not set +# CONFIG_FEATURE_VOLUMEID_HFS is not set +# CONFIG_FEATURE_VOLUMEID_JFS is not set +# CONFIG_FEATURE_VOLUMEID_XFS is not set +# CONFIG_FEATURE_VOLUMEID_NTFS is not set +# CONFIG_FEATURE_VOLUMEID_ISO9660 is not set +# CONFIG_FEATURE_VOLUMEID_UDF is not set +# CONFIG_FEATURE_VOLUMEID_LUKS is not set +# CONFIG_FEATURE_VOLUMEID_LINUXSWAP is not set +# CONFIG_FEATURE_VOLUMEID_CRAMFS is not set +# CONFIG_FEATURE_VOLUMEID_ROMFS is not set +# CONFIG_FEATURE_VOLUMEID_SYSV is not set +# CONFIG_FEATURE_VOLUMEID_OCFS2 is not set +# CONFIG_FEATURE_VOLUMEID_LINUXRAID is not set +CONFIG_MOUNT=y +# CONFIG_FEATURE_MOUNT_FAKE is not set +# CONFIG_FEATURE_MOUNT_VERBOSE is not set +CONFIG_FEATURE_MOUNT_HELPERS=y +CONFIG_FEATURE_MOUNT_LABEL=y +CONFIG_FEATURE_MOUNT_NFS=y +CONFIG_FEATURE_MOUNT_CIFS=y +CONFIG_FEATURE_MOUNT_FLAGS=y +CONFIG_FEATURE_MOUNT_FSTAB=y +CONFIG_PIVOT_ROOT=y +CONFIG_RDATE=y +CONFIG_READPROFILE=y +# CONFIG_RTCWAKE is not set +# CONFIG_SCRIPT is not set +# CONFIG_SETARCH is not set +CONFIG_SWAPONOFF=y +# CONFIG_FEATURE_SWAPON_PRI is not set +CONFIG_SWITCH_ROOT=y +CONFIG_UMOUNT=y +CONFIG_FEATURE_UMOUNT_ALL=y + +# +# Common options for mount/umount +# +CONFIG_FEATURE_MOUNT_LOOP=y +# CONFIG_FEATURE_MTAB_SUPPORT is not set + +# +# Miscellaneous Utilities +# +# CONFIG_ADJTIMEX is not set +# CONFIG_BBCONFIG is not set +# CONFIG_CHAT is not set +# CONFIG_FEATURE_CHAT_NOFAIL is not set +# CONFIG_FEATURE_CHAT_TTY_HIFI is not set +# CONFIG_FEATURE_CHAT_IMPLICIT_CR is not set +# CONFIG_FEATURE_CHAT_SWALLOW_OPTS is not set +# CONFIG_FEATURE_CHAT_SEND_ESCAPES is not set +# CONFIG_FEATURE_CHAT_VAR_ABORT_LEN is not set +# CONFIG_FEATURE_CHAT_CLR_ABORT is not set +# CONFIG_CHRT is not set +# CONFIG_CROND is not set +# CONFIG_DEBUG_CROND_OPTION is not set +# CONFIG_FEATURE_CROND_CALL_SENDMAIL is not set +# CONFIG_CRONTAB is not set +CONFIG_DC=y +# CONFIG_DEVFSD is not set +# CONFIG_DEVFSD_MODLOAD is not set +# CONFIG_DEVFSD_FG_NP is not set +# CONFIG_DEVFSD_VERBOSE is not set +# CONFIG_FEATURE_DEVFS is not set +# CONFIG_EJECT is not set +# CONFIG_FEATURE_EJECT_SCSI is not set +# CONFIG_FBSPLASH is not set +# CONFIG_INOTIFYD is not set +# CONFIG_LAST is not set +# CONFIG_FEATURE_LAST_SMALL is not set +# CONFIG_FEATURE_LAST_FANCY is not set +CONFIG_LESS=y +CONFIG_FEATURE_LESS_MAXLINES=9999999 +CONFIG_FEATURE_LESS_BRACKETS=y +CONFIG_FEATURE_LESS_FLAGS=y +# CONFIG_FEATURE_LESS_FLAGCS is not set +# CONFIG_FEATURE_LESS_MARKS is not set +# CONFIG_FEATURE_LESS_REGEXP is not set +# CONFIG_HDPARM is not set +# CONFIG_FEATURE_HDPARM_GET_IDENTITY is not set +# CONFIG_FEATURE_HDPARM_HDIO_SCAN_HWIF is not set +# CONFIG_FEATURE_HDPARM_HDIO_UNREGISTER_HWIF is not set +# CONFIG_FEATURE_HDPARM_HDIO_DRIVE_RESET is not set +# CONFIG_FEATURE_HDPARM_HDIO_TRISTATE_HWIF is not set +# CONFIG_FEATURE_HDPARM_HDIO_GETSET_DMA is not set +CONFIG_MAKEDEVS=y +# CONFIG_FEATURE_MAKEDEVS_LEAF is not set +CONFIG_FEATURE_MAKEDEVS_TABLE=y +# CONFIG_MAN is not set +# CONFIG_MICROCOM is not set +# CONFIG_MOUNTPOINT is not set +# CONFIG_MT is not set +# CONFIG_RAIDAUTORUN is not set +CONFIG_READAHEAD=y +# CONFIG_RUNLEVEL is not set +# CONFIG_RX is not set +# CONFIG_SETSID is not set +CONFIG_STRINGS=y +# CONFIG_TASKSET is not set +# CONFIG_FEATURE_TASKSET_FANCY is not set +CONFIG_TIME=y +# CONFIG_TTYSIZE is not set +# CONFIG_WATCHDOG is not set + +# +# Networking Utilities +# +CONFIG_FEATURE_IPV6=y +CONFIG_FEATURE_PREFER_IPV4_ADDRESS=y +# CONFIG_VERBOSE_RESOLUTION_ERRORS is not set +# CONFIG_ARP is not set +# CONFIG_ARPING is not set +# CONFIG_BRCTL is not set +# CONFIG_FEATURE_BRCTL_FANCY is not set +# CONFIG_FEATURE_BRCTL_SHOW is not set +# CONFIG_DNSD is not set +# CONFIG_ETHER_WAKE is not set +# CONFIG_FAKEIDENTD is not set +# CONFIG_FTPGET is not set +# CONFIG_FTPPUT is not set +# CONFIG_FEATURE_FTPGETPUT_LONG_OPTIONS is not set +CONFIG_HOSTNAME=y +# CONFIG_HTTPD is not set +# CONFIG_FEATURE_HTTPD_RANGES is not set +# CONFIG_FEATURE_HTTPD_USE_SENDFILE is not set +# CONFIG_FEATURE_HTTPD_RELOAD_CONFIG_SIGHUP is not set +# CONFIG_FEATURE_HTTPD_SETUID is not set +# CONFIG_FEATURE_HTTPD_BASIC_AUTH is not set +# CONFIG_FEATURE_HTTPD_AUTH_MD5 is not set +# CONFIG_FEATURE_HTTPD_CONFIG_WITH_MIME_TYPES is not set +# CONFIG_FEATURE_HTTPD_CGI is not set +# CONFIG_FEATURE_HTTPD_CONFIG_WITH_SCRIPT_INTERPR is not set +# CONFIG_FEATURE_HTTPD_SET_REMOTE_PORT_TO_ENV is not set +# CONFIG_FEATURE_HTTPD_ENCODE_URL_STR is not set +# CONFIG_FEATURE_HTTPD_ERROR_PAGES is not set +# CONFIG_FEATURE_HTTPD_PROXY is not set +CONFIG_IFCONFIG=y +CONFIG_FEATURE_IFCONFIG_STATUS=y +# CONFIG_FEATURE_IFCONFIG_SLIP is not set +# CONFIG_FEATURE_IFCONFIG_MEMSTART_IOADDR_IRQ is not set +CONFIG_FEATURE_IFCONFIG_HW=y +# CONFIG_FEATURE_IFCONFIG_BROADCAST_PLUS is not set +# CONFIG_IFENSLAVE is not set +CONFIG_IFUPDOWN=y +CONFIG_IFUPDOWN_IFSTATE_PATH="/var/run/ifstate" +# CONFIG_FEATURE_IFUPDOWN_IP is not set +# CONFIG_FEATURE_IFUPDOWN_IP_BUILTIN is not set +CONFIG_FEATURE_IFUPDOWN_IFCONFIG_BUILTIN=y +CONFIG_FEATURE_IFUPDOWN_IPV4=y +CONFIG_FEATURE_IFUPDOWN_IPV6=y +CONFIG_FEATURE_IFUPDOWN_MAPPING=y +# CONFIG_FEATURE_IFUPDOWN_EXTERNAL_DHCP is not set +# CONFIG_INETD is not set +# CONFIG_FEATURE_INETD_SUPPORT_BUILTIN_ECHO is not set +# CONFIG_FEATURE_INETD_SUPPORT_BUILTIN_DISCARD is not set +# CONFIG_FEATURE_INETD_SUPPORT_BUILTIN_TIME is not set +# CONFIG_FEATURE_INETD_SUPPORT_BUILTIN_DAYTIME is not set +# CONFIG_FEATURE_INETD_SUPPORT_BUILTIN_CHARGEN is not set +# CONFIG_FEATURE_INETD_RPC is not set +CONFIG_IP=y +CONFIG_FEATURE_IP_ADDRESS=y +CONFIG_FEATURE_IP_LINK=y +CONFIG_FEATURE_IP_ROUTE=y +CONFIG_FEATURE_IP_TUNNEL=y +# CONFIG_FEATURE_IP_RULE is not set +# CONFIG_FEATURE_IP_SHORT_FORMS is not set +# CONFIG_FEATURE_IP_RARE_PROTOCOLS is not set +# CONFIG_IPADDR is not set +# CONFIG_IPLINK is not set +# CONFIG_IPROUTE is not set +# CONFIG_IPTUNNEL is not set +# CONFIG_IPRULE is not set +# CONFIG_IPCALC is not set +# CONFIG_FEATURE_IPCALC_FANCY is not set +# CONFIG_FEATURE_IPCALC_LONG_OPTIONS is not set +# CONFIG_NAMEIF is not set +# CONFIG_FEATURE_NAMEIF_EXTENDED is not set +CONFIG_NC=y +CONFIG_NC_SERVER=y +CONFIG_NC_EXTRA=y +CONFIG_NETSTAT=y +# CONFIG_FEATURE_NETSTAT_WIDE is not set +CONFIG_NSLOOKUP=y +CONFIG_PING=y +CONFIG_PING6=y +CONFIG_FEATURE_FANCY_PING=y +# CONFIG_PSCAN is not set +CONFIG_ROUTE=y +# CONFIG_SENDMAIL is not set +# CONFIG_FETCHMAIL is not set +# CONFIG_SLATTACH is not set +CONFIG_TELNET=y +# CONFIG_FEATURE_TELNET_TTYPE is not set +CONFIG_FEATURE_TELNET_AUTOLOGIN=y +CONFIG_TELNETD=y +# CONFIG_FEATURE_TELNETD_STANDALONE is not set +CONFIG_TFTP=y +# CONFIG_TFTPD is not set +CONFIG_FEATURE_TFTP_GET=y +CONFIG_FEATURE_TFTP_PUT=y +# CONFIG_FEATURE_TFTP_BLOCKSIZE is not set +# CONFIG_DEBUG_TFTP is not set +CONFIG_TRACEROUTE=y +CONFIG_FEATURE_TRACEROUTE_VERBOSE=y +# CONFIG_FEATURE_TRACEROUTE_SOURCE_ROUTE is not set +# CONFIG_FEATURE_TRACEROUTE_USE_ICMP is not set +CONFIG_APP_UDHCPD=y +# CONFIG_APP_DHCPRELAY is not set +CONFIG_APP_DUMPLEASES=y +# CONFIG_FEATURE_UDHCPD_WRITE_LEASES_EARLY is not set +CONFIG_DHCPD_LEASES_FILE="/var/lib/misc/udhcpd.leases" +CONFIG_APP_UDHCPC=y +CONFIG_FEATURE_UDHCPC_ARPING=y +# CONFIG_FEATURE_UDHCP_PORT is not set +# CONFIG_FEATURE_UDHCP_DEBUG is not set +# CONFIG_FEATURE_RFC3397 is not set +CONFIG_DHCPC_DEFAULT_SCRIPT="/usr/share/udhcpc/default.script" +CONFIG_UDHCPC_SLACK_FOR_BUGGY_SERVERS=80 +# CONFIG_VCONFIG is not set +CONFIG_WGET=y +CONFIG_FEATURE_WGET_STATUSBAR=y +CONFIG_FEATURE_WGET_AUTHENTICATION=y +CONFIG_FEATURE_WGET_LONG_OPTIONS=y +# CONFIG_ZCIP is not set +# CONFIG_TCPSVD is not set +# CONFIG_UDPSVD is not set + +# +# Process Utilities +# +CONFIG_FREE=y +CONFIG_FUSER=y +CONFIG_KILL=y +CONFIG_KILLALL=y +# CONFIG_KILLALL5 is not set +# CONFIG_NMETER is not set +# CONFIG_PGREP is not set +CONFIG_PIDOF=y +CONFIG_FEATURE_PIDOF_SINGLE=y +CONFIG_FEATURE_PIDOF_OMIT=y +# CONFIG_PKILL is not set +CONFIG_PS=y +CONFIG_FEATURE_PS_WIDE=y +# CONFIG_FEATURE_PS_TIME is not set +# CONFIG_FEATURE_PS_UNUSUAL_SYSTEMS is not set +CONFIG_RENICE=y +CONFIG_BB_SYSCTL=y +CONFIG_TOP=y +CONFIG_FEATURE_TOP_CPU_USAGE_PERCENTAGE=y +CONFIG_FEATURE_TOP_CPU_GLOBAL_PERCENTS=y +# CONFIG_FEATURE_TOP_DECIMALS is not set +# CONFIG_FEATURE_TOPMEM is not set +CONFIG_UPTIME=y +CONFIG_WATCH=y + +# +# Shells +# +CONFIG_FEATURE_SH_IS_ASH=y +# CONFIG_FEATURE_SH_IS_HUSH is not set +# CONFIG_FEATURE_SH_IS_MSH is not set +# CONFIG_FEATURE_SH_IS_NONE is not set +CONFIG_ASH=y + +# +# Ash Shell Options +# +CONFIG_ASH_BASH_COMPAT=y +CONFIG_ASH_JOB_CONTROL=y +CONFIG_ASH_READ_NCHARS=y +CONFIG_ASH_READ_TIMEOUT=y +CONFIG_ASH_ALIAS=y +CONFIG_ASH_MATH_SUPPORT=y +# CONFIG_ASH_MATH_SUPPORT_64 is not set +CONFIG_ASH_GETOPTS=y +# CONFIG_ASH_BUILTIN_ECHO is not set +CONFIG_ASH_BUILTIN_PRINTF=y +CONFIG_ASH_BUILTIN_TEST=y +# CONFIG_ASH_CMDCMD is not set +# CONFIG_ASH_MAIL is not set +CONFIG_ASH_OPTIMIZE_FOR_SIZE=y +# CONFIG_ASH_RANDOM_SUPPORT is not set +CONFIG_ASH_EXPAND_PRMT=y +# CONFIG_HUSH is not set +# CONFIG_HUSH_HELP is not set +# CONFIG_HUSH_INTERACTIVE is not set +# CONFIG_HUSH_JOB is not set +# CONFIG_HUSH_TICK is not set +# CONFIG_HUSH_IF is not set +# CONFIG_HUSH_LOOPS is not set +# CONFIG_LASH is not set +# CONFIG_MSH is not set + +# +# Bourne Shell Options +# +CONFIG_FEATURE_SH_EXTRA_QUIET=y +# CONFIG_FEATURE_SH_STANDALONE is not set +# CONFIG_FEATURE_SH_NOFORK is not set +# CONFIG_CTTYHACK is not set + +# +# System Logging Utilities +# +CONFIG_SYSLOGD=y +CONFIG_FEATURE_ROTATE_LOGFILE=y +CONFIG_FEATURE_REMOTE_LOG=y +CONFIG_FEATURE_SYSLOGD_DUP=y +CONFIG_FEATURE_IPC_SYSLOG=y +CONFIG_FEATURE_IPC_SYSLOG_BUFFER_SIZE=16 +CONFIG_LOGREAD=y +CONFIG_FEATURE_LOGREAD_REDUCED_LOCKING=y +CONFIG_KLOGD=y +CONFIG_LOGGER=y + +# +# Runit Utilities +# +# CONFIG_RUNSV is not set +# CONFIG_RUNSVDIR is not set +# CONFIG_SV is not set +# CONFIG_SVLOGD is not set +# CONFIG_CHPST is not set +# CONFIG_SETUIDGID is not set +# CONFIG_ENVUIDGID is not set +# CONFIG_ENVDIR is not set +# CONFIG_SOFTLIMIT is not set +# CONFIG_CHCON is not set +# CONFIG_FEATURE_CHCON_LONG_OPTIONS is not set +# CONFIG_GETENFORCE is not set +# CONFIG_GETSEBOOL is not set +# CONFIG_LOAD_POLICY is not set +# CONFIG_MATCHPATHCON is not set +# CONFIG_RESTORECON is not set +# CONFIG_RUNCON is not set +# CONFIG_FEATURE_RUNCON_LONG_OPTIONS is not set +# CONFIG_SELINUXENABLED is not set +# CONFIG_SETENFORCE is not set +# CONFIG_SETFILES is not set +# CONFIG_FEATURE_SETFILES_CHECK_OPTION is not set +# CONFIG_SETSEBOOL is not set +# CONFIG_SESTATUS is not set + +# +# Print Utilities +# +# CONFIG_LPD is not set +# CONFIG_LPR is not set +# CONFIG_LPQ is not set diff --git a/packages/busybox/busybox-1.13.2/get_header_tar.patch b/packages/busybox/busybox-1.13.2/get_header_tar.patch new file mode 100644 index 0000000000..0121cd1b61 --- /dev/null +++ b/packages/busybox/busybox-1.13.2/get_header_tar.patch @@ -0,0 +1,11 @@ +--- busybox-1.13.2/archival/libunarchive/get_header_tar.c.orig 2008-11-09 18:28:02.000000000 +0100 ++++ busybox-1.13.2/archival/libunarchive/get_header_tar.c 2009-02-11 22:34:52.000000000 +0100 +@@ -252,6 +252,8 @@ + file_header->name = concat_path_file(tar.prefix, tar.name); + } else + file_header->name = xstrdup(tar.name); ++ if (strlen(file_header->name) > 100) ++ file_header->name[100] = 0; + } + + /* Set bits 12-15 of the files mode */ diff --git a/packages/busybox/busybox-1.13.2/kaeilos/defconfig b/packages/busybox/busybox-1.13.2/kaeilos/defconfig new file mode 100644 index 0000000000..f3130caca8 --- /dev/null +++ b/packages/busybox/busybox-1.13.2/kaeilos/defconfig @@ -0,0 +1,855 @@ +# +# Automatically generated make config: don't edit +# Busybox version: 1.11.1 +# Thu Oct 9 14:15:08 2008 +# +CONFIG_HAVE_DOT_CONFIG=y + +# +# Busybox Settings +# + +# +# General Configuration +# +# CONFIG_DESKTOP is not set +CONFIG_FEATURE_ASSUME_UNICODE=y +CONFIG_FEATURE_BUFFERS_USE_MALLOC=y +# CONFIG_FEATURE_BUFFERS_GO_ON_STACK is not set +# CONFIG_FEATURE_BUFFERS_GO_IN_BSS is not set +CONFIG_SHOW_USAGE=y +# CONFIG_FEATURE_VERBOSE_USAGE is not set +CONFIG_FEATURE_COMPRESS_USAGE=y +# CONFIG_FEATURE_INSTALLER is not set +CONFIG_LOCALE_SUPPORT=y +CONFIG_GETOPT_LONG=y +CONFIG_FEATURE_DEVPTS=y +# CONFIG_FEATURE_CLEAN_UP is not set +CONFIG_FEATURE_PIDFILE=y +CONFIG_FEATURE_SUID=y +CONFIG_FEATURE_SUID_CONFIG=y +CONFIG_FEATURE_SUID_CONFIG_QUIET=y +# CONFIG_SELINUX is not set +# CONFIG_FEATURE_PREFER_APPLETS is not set +CONFIG_BUSYBOX_EXEC_PATH="/proc/self/exe" +CONFIG_FEATURE_SYSLOG=y +CONFIG_FEATURE_HAVE_RPC=y + +# +# Build Options +# +# CONFIG_STATIC is not set +# CONFIG_PIE is not set +# CONFIG_NOMMU is not set +# CONFIG_BUILD_LIBBUSYBOX is not set +# CONFIG_FEATURE_INDIVIDUAL is not set +# CONFIG_FEATURE_SHARED_BUSYBOX is not set +CONFIG_LFS=y +CONFIG_CROSS_COMPILER_PREFIX="" + +# +# Debugging Options +# +# CONFIG_DEBUG is not set +# CONFIG_DEBUG_PESSIMIZE is not set +# CONFIG_WERROR is not set +CONFIG_NO_DEBUG_LIB=y +# CONFIG_DMALLOC is not set +# CONFIG_EFENCE is not set +# CONFIG_INCLUDE_SUSv2 is not set + +# +# Installation Options +# +# CONFIG_INSTALL_NO_USR is not set +CONFIG_INSTALL_APPLET_SYMLINKS=y +# CONFIG_INSTALL_APPLET_HARDLINKS is not set +# CONFIG_INSTALL_APPLET_SCRIPT_WRAPPERS is not set +# CONFIG_INSTALL_APPLET_DONT is not set +# CONFIG_INSTALL_SH_APPLET_SYMLINK is not set +# CONFIG_INSTALL_SH_APPLET_HARDLINK is not set +# CONFIG_INSTALL_SH_APPLET_SCRIPT_WRAPPER is not set +CONFIG_PREFIX="./_install" + +# +# Busybox Library Tuning +# +CONFIG_PASSWORD_MINLEN=6 +CONFIG_MD5_SIZE_VS_SPEED=2 +CONFIG_FEATURE_FAST_TOP=y +# CONFIG_FEATURE_ETC_NETWORKS is not set +CONFIG_FEATURE_EDITING=y +CONFIG_FEATURE_EDITING_MAX_LEN=1024 +# CONFIG_FEATURE_EDITING_VI is not set +CONFIG_FEATURE_EDITING_HISTORY=15 +CONFIG_FEATURE_EDITING_SAVEHISTORY=y +CONFIG_FEATURE_TAB_COMPLETION=y +CONFIG_FEATURE_USERNAME_COMPLETION=y +CONFIG_FEATURE_EDITING_FANCY_PROMPT=y +CONFIG_FEATURE_VERBOSE_CP_MESSAGE=y +CONFIG_FEATURE_COPYBUF_KB=4 +CONFIG_MONOTONIC_SYSCALL=y +CONFIG_IOCTL_HEX2STR_ERROR=y +CONFIG_FEATURE_HWIB=y + +# +# Applets +# + +# +# Archival Utilities +# +CONFIG_AR=y +# CONFIG_FEATURE_AR_LONG_FILENAMES is not set +CONFIG_BUNZIP2=y +# CONFIG_BZIP2 is not set +CONFIG_CPIO=y +# CONFIG_FEATURE_CPIO_O is not set +# CONFIG_DPKG is not set +# CONFIG_DPKG_DEB is not set +# CONFIG_FEATURE_DPKG_DEB_EXTRACT_ONLY is not set +CONFIG_GUNZIP=y +# CONFIG_FEATURE_GUNZIP_UNCOMPRESS is not set +CONFIG_GZIP=y +# CONFIG_RPM2CPIO is not set +# CONFIG_RPM is not set +# CONFIG_FEATURE_RPM_BZ2 is not set +CONFIG_TAR=y +CONFIG_FEATURE_TAR_CREATE=y +CONFIG_FEATURE_TAR_GZIP=y +CONFIG_FEATURE_TAR_BZIP2=y +# CONFIG_FEATURE_TAR_LZMA is not set +# CONFIG_FEATURE_TAR_COMPRESS is not set +CONFIG_FEATURE_TAR_AUTODETECT=y +CONFIG_FEATURE_TAR_FROM=y +CONFIG_FEATURE_TAR_OLDGNU_COMPATIBILITY=y +# CONFIG_FEATURE_TAR_OLDSUN_COMPATIBILITY is not set +CONFIG_FEATURE_TAR_GNU_EXTENSIONS=y +# CONFIG_FEATURE_TAR_LONG_OPTIONS is not set +CONFIG_FEATURE_TAR_UNAME_GNAME=y +# CONFIG_UNCOMPRESS is not set +# CONFIG_UNLZMA is not set +# CONFIG_FEATURE_LZMA_FAST is not set +CONFIG_UNZIP=y + +# +# Common options for cpio and tar +# +# CONFIG_FEATURE_DEB_TAR_GZ is not set +# CONFIG_FEATURE_DEB_TAR_BZ2 is not set +# CONFIG_FEATURE_DEB_TAR_LZMA is not set + +# +# Coreutils +# +CONFIG_BASENAME=y +# CONFIG_CAL is not set +CONFIG_CAT=y +# CONFIG_CATV is not set +CONFIG_CHGRP=y +CONFIG_CHMOD=y +CONFIG_CHOWN=y +CONFIG_CHROOT=y +# CONFIG_CKSUM is not set +# CONFIG_COMM is not set +CONFIG_CP=y +CONFIG_CUT=y +CONFIG_DATE=y +CONFIG_FEATURE_DATE_ISOFMT=y +CONFIG_DD=y +CONFIG_FEATURE_DD_SIGNAL_HANDLING=y +# CONFIG_FEATURE_DD_IBS_OBS is not set +CONFIG_DF=y +# CONFIG_FEATURE_DF_INODE is not set +CONFIG_DIRNAME=y +# CONFIG_DOS2UNIX is not set +# CONFIG_UNIX2DOS is not set +CONFIG_DU=y +CONFIG_FEATURE_DU_DEFAULT_BLOCKSIZE_1K=y +CONFIG_ECHO=y +CONFIG_FEATURE_FANCY_ECHO=y +CONFIG_ENV=y +CONFIG_FEATURE_ENV_LONG_OPTIONS=y +# CONFIG_EXPAND is not set +# CONFIG_FEATURE_EXPAND_LONG_OPTIONS is not set +CONFIG_EXPR=y +# CONFIG_EXPR_MATH_SUPPORT_64 is not set +CONFIG_FALSE=y +# CONFIG_FOLD is not set +CONFIG_HEAD=y +# CONFIG_FEATURE_FANCY_HEAD is not set +# CONFIG_HOSTID is not set +CONFIG_ID=y +# CONFIG_INSTALL is not set +# CONFIG_FEATURE_INSTALL_LONG_OPTIONS is not set +# CONFIG_LENGTH is not set +CONFIG_LN=y +CONFIG_LOGNAME=y +CONFIG_LS=y +CONFIG_FEATURE_LS_FILETYPES=y +CONFIG_FEATURE_LS_FOLLOWLINKS=y +CONFIG_FEATURE_LS_RECURSIVE=y +CONFIG_FEATURE_LS_SORTFILES=y +CONFIG_FEATURE_LS_TIMESTAMPS=y +CONFIG_FEATURE_LS_USERNAME=y +CONFIG_FEATURE_LS_COLOR=y +# CONFIG_FEATURE_LS_COLOR_IS_DEFAULT is not set +CONFIG_MD5SUM=y +CONFIG_MKDIR=y +CONFIG_FEATURE_MKDIR_LONG_OPTIONS=y +CONFIG_MKFIFO=y +CONFIG_MKNOD=y +CONFIG_MV=y +# CONFIG_FEATURE_MV_LONG_OPTIONS is not set +# CONFIG_NICE is not set +CONFIG_NOHUP=y +CONFIG_OD=y +# CONFIG_PRINTENV is not set +CONFIG_PRINTF=y +CONFIG_PWD=y +CONFIG_READLINK=y +CONFIG_FEATURE_READLINK_FOLLOW=y +CONFIG_REALPATH=y +CONFIG_RM=y +CONFIG_RMDIR=y +# CONFIG_FEATURE_RMDIR_LONG_OPTIONS is not set +CONFIG_SEQ=y +# CONFIG_SHA1SUM is not set +CONFIG_SLEEP=y +CONFIG_FEATURE_FANCY_SLEEP=y +CONFIG_SORT=y +CONFIG_FEATURE_SORT_BIG=y +# CONFIG_SPLIT is not set +# CONFIG_FEATURE_SPLIT_FANCY is not set +# CONFIG_STAT is not set +# CONFIG_FEATURE_STAT_FORMAT is not set +CONFIG_STTY=y +# CONFIG_SUM is not set +CONFIG_SYNC=y +# CONFIG_TAC is not set +CONFIG_TAIL=y +CONFIG_FEATURE_FANCY_TAIL=y +CONFIG_TEE=y +# CONFIG_FEATURE_TEE_USE_BLOCK_IO is not set +CONFIG_TEST=y +# CONFIG_FEATURE_TEST_64 is not set +CONFIG_TOUCH=y +CONFIG_TR=y +CONFIG_FEATURE_TR_CLASSES=y +# CONFIG_FEATURE_TR_EQUIV is not set +CONFIG_TRUE=y +CONFIG_TTY=y +CONFIG_UNAME=y +# CONFIG_UNEXPAND is not set +# CONFIG_FEATURE_UNEXPAND_LONG_OPTIONS is not set +CONFIG_UNIQ=y +CONFIG_USLEEP=y +# CONFIG_UUDECODE is not set +# CONFIG_UUENCODE is not set +CONFIG_WC=y +# CONFIG_FEATURE_WC_LARGE is not set +CONFIG_WHO=y +CONFIG_WHOAMI=y +CONFIG_YES=y + +# +# Common options for cp and mv +# +# CONFIG_FEATURE_PRESERVE_HARDLINKS is not set + +# +# Common options for ls, more and telnet +# +CONFIG_FEATURE_AUTOWIDTH=y + +# +# Common options for df, du, ls +# +CONFIG_FEATURE_HUMAN_READABLE=y + +# +# Common options for md5sum, sha1sum +# +CONFIG_FEATURE_MD5_SHA1_SUM_CHECK=y + +# +# Console Utilities +# +CONFIG_CHVT=y +CONFIG_CLEAR=y +CONFIG_DEALLOCVT=y +CONFIG_DUMPKMAP=y +# CONFIG_KBD_MODE is not set +CONFIG_LOADFONT=y +CONFIG_LOADKMAP=y +CONFIG_OPENVT=y +CONFIG_RESET=y +# CONFIG_RESIZE is not set +# CONFIG_FEATURE_RESIZE_PRINT is not set +CONFIG_SETCONSOLE=y +# CONFIG_FEATURE_SETCONSOLE_LONG_OPTIONS is not set +# CONFIG_SETKEYCODES is not set +# CONFIG_SETLOGCONS is not set + +# +# Debian Utilities +# +CONFIG_MKTEMP=y +# CONFIG_PIPE_PROGRESS is not set +CONFIG_RUN_PARTS=y +CONFIG_FEATURE_RUN_PARTS_LONG_OPTIONS=y +CONFIG_FEATURE_RUN_PARTS_FANCY=y +CONFIG_START_STOP_DAEMON=y +CONFIG_FEATURE_START_STOP_DAEMON_FANCY=y +CONFIG_FEATURE_START_STOP_DAEMON_LONG_OPTIONS=y +CONFIG_WHICH=y + +# +# Editors +# +CONFIG_AWK=y +CONFIG_FEATURE_AWK_MATH=y +CONFIG_CMP=y +CONFIG_DIFF=y +CONFIG_FEATURE_DIFF_BINARY=y +CONFIG_FEATURE_DIFF_DIR=y +CONFIG_FEATURE_DIFF_MINIMAL=y +# CONFIG_ED is not set +CONFIG_PATCH=y +CONFIG_SED=y +CONFIG_VI=y +CONFIG_FEATURE_VI_MAX_LEN=1024 +CONFIG_FEATURE_VI_8BIT=y +CONFIG_FEATURE_VI_COLON=y +CONFIG_FEATURE_VI_YANKMARK=y +CONFIG_FEATURE_VI_SEARCH=y +CONFIG_FEATURE_VI_USE_SIGNALS=y +CONFIG_FEATURE_VI_DOT_CMD=y +# CONFIG_FEATURE_VI_READONLY is not set +# CONFIG_FEATURE_VI_SETOPTS is not set +CONFIG_FEATURE_VI_SET=y +CONFIG_FEATURE_VI_WIN_RESIZE=y +CONFIG_FEATURE_VI_OPTIMIZE_CURSOR=y +CONFIG_FEATURE_ALLOW_EXEC=y + +# +# Finding Utilities +# +CONFIG_FIND=y +CONFIG_FEATURE_FIND_PRINT0=y +CONFIG_FEATURE_FIND_MTIME=y +CONFIG_FEATURE_FIND_MMIN=y +CONFIG_FEATURE_FIND_PERM=y +CONFIG_FEATURE_FIND_TYPE=y +CONFIG_FEATURE_FIND_XDEV=y +CONFIG_FEATURE_FIND_MAXDEPTH=y +CONFIG_FEATURE_FIND_NEWER=y +# CONFIG_FEATURE_FIND_INUM is not set +CONFIG_FEATURE_FIND_EXEC=y +CONFIG_FEATURE_FIND_USER=y +CONFIG_FEATURE_FIND_GROUP=y +CONFIG_FEATURE_FIND_NOT=y +CONFIG_FEATURE_FIND_DEPTH=y +CONFIG_FEATURE_FIND_PAREN=y +CONFIG_FEATURE_FIND_SIZE=y +CONFIG_FEATURE_FIND_PRUNE=y +# CONFIG_FEATURE_FIND_DELETE is not set +CONFIG_FEATURE_FIND_PATH=y +CONFIG_FEATURE_FIND_REGEX=y +# CONFIG_FEATURE_FIND_CONTEXT is not set +CONFIG_GREP=y +CONFIG_FEATURE_GREP_EGREP_ALIAS=y +CONFIG_FEATURE_GREP_FGREP_ALIAS=y +CONFIG_FEATURE_GREP_CONTEXT=y +CONFIG_XARGS=y +# CONFIG_FEATURE_XARGS_SUPPORT_CONFIRMATION is not set +CONFIG_FEATURE_XARGS_SUPPORT_QUOTES=y +# CONFIG_FEATURE_XARGS_SUPPORT_TERMOPT is not set +# CONFIG_FEATURE_XARGS_SUPPORT_ZERO_TERM is not set + +# +# Init Utilities +# +CONFIG_INIT=y +# CONFIG_DEBUG_INIT is not set +CONFIG_FEATURE_USE_INITTAB=y +CONFIG_FEATURE_KILL_REMOVED=y +CONFIG_FEATURE_KILL_DELAY=0 +# CONFIG_FEATURE_INIT_SCTTY is not set +# CONFIG_FEATURE_INIT_SYSLOG is not set +# CONFIG_FEATURE_EXTRA_QUIET is not set +# CONFIG_FEATURE_INIT_COREDUMPS is not set +CONFIG_FEATURE_INITRD=y +CONFIG_HALT=y +# CONFIG_MESG is not set + +# +# Login/Password Management Utilities +# +CONFIG_FEATURE_SHADOWPASSWDS=y +# CONFIG_USE_BB_PWD_GRP is not set +# CONFIG_USE_BB_SHADOW is not set +CONFIG_USE_BB_CRYPT=y +CONFIG_ADDGROUP=y +CONFIG_FEATURE_ADDUSER_TO_GROUP=y +CONFIG_DELGROUP=y +CONFIG_FEATURE_DEL_USER_FROM_GROUP=y +CONFIG_FEATURE_CHECK_NAMES=y +CONFIG_ADDUSER=y +CONFIG_FEATURE_ADDUSER_LONG_OPTIONS=y +CONFIG_DELUSER=y +CONFIG_GETTY=y +CONFIG_FEATURE_UTMP=y +CONFIG_FEATURE_WTMP=y +CONFIG_LOGIN=y +# CONFIG_PAM is not set +CONFIG_LOGIN_SCRIPTS=y +CONFIG_FEATURE_NOLOGIN=y +CONFIG_FEATURE_SECURETTY=y +CONFIG_PASSWD=y +CONFIG_FEATURE_PASSWD_WEAK_CHECK=y +CONFIG_CRYPTPW=y +CONFIG_CHPASSWD=y +CONFIG_SU=y +CONFIG_FEATURE_SU_SYSLOG=y +CONFIG_FEATURE_SU_CHECKS_SHELLS=y +CONFIG_SULOGIN=y +CONFIG_VLOCK=y + +# +# Linux Ext2 FS Progs +# +CONFIG_CHATTR=y +CONFIG_FSCK=y +# CONFIG_LSATTR is not set + +# +# Linux Module Utilities +# +# CONFIG_DEPMOD is not set +# CONFIG_FEATURE_DEPMOD_PRUNE_FANCY is not set +# CONFIG_FEATURE_DEPMOD_ALIAS is not set +CONFIG_INSMOD=y +# CONFIG_FEATURE_INSMOD_VERSION_CHECKING is not set +# CONFIG_FEATURE_INSMOD_KSYMOOPS_SYMBOLS is not set +# CONFIG_FEATURE_INSMOD_LOADINKMEM is not set +# CONFIG_FEATURE_INSMOD_LOAD_MAP is not set +# CONFIG_FEATURE_INSMOD_LOAD_MAP_FULL is not set +CONFIG_RMMOD=y +CONFIG_LSMOD=y +# CONFIG_FEATURE_LSMOD_PRETTY_2_6_OUTPUT is not set +CONFIG_MODPROBE=y +CONFIG_FEATURE_MODPROBE_MULTIPLE_OPTIONS=y +CONFIG_FEATURE_MODPROBE_FANCY_ALIAS=y +CONFIG_FEATURE_MODPROBE_BLACKLIST=y + +# +# Options common to multiple modutils +# +CONFIG_FEATURE_CHECK_TAINTED_MODULE=y +# CONFIG_FEATURE_2_4_MODULES is not set +CONFIG_FEATURE_2_6_MODULES=y +CONFIG_DEFAULT_MODULES_DIR="/lib/modules" +CONFIG_DEFAULT_DEPMOD_FILE="modules.dep" +# CONFIG_FEATURE_QUERY_MODULE_INTERFACE is not set + +# +# Linux System Utilities +# +CONFIG_DMESG=y +CONFIG_FEATURE_DMESG_PRETTY=y +CONFIG_FBSET=y +CONFIG_FEATURE_FBSET_FANCY=y +CONFIG_FEATURE_FBSET_READMODE=y +# CONFIG_FDFLUSH is not set +# CONFIG_FDFORMAT is not set +CONFIG_FDISK=y +CONFIG_FDISK_SUPPORT_LARGE_DISKS=y +CONFIG_FEATURE_FDISK_WRITABLE=y +# CONFIG_FEATURE_AIX_LABEL is not set +# CONFIG_FEATURE_SGI_LABEL is not set +# CONFIG_FEATURE_SUN_LABEL is not set +CONFIG_FEATURE_OSF_LABEL=y +CONFIG_FEATURE_FDISK_ADVANCED=y +# CONFIG_FINDFS is not set +# CONFIG_FREERAMDISK is not set +CONFIG_FSCK_MINIX=y +CONFIG_MKFS_MINIX=y + +# +# Minix filesystem support +# +CONFIG_FEATURE_MINIX2=y +CONFIG_GETOPT=y +CONFIG_HEXDUMP=y +# CONFIG_FEATURE_HEXDUMP_REVERSE is not set +# CONFIG_HD is not set +CONFIG_HWCLOCK=y +CONFIG_FEATURE_HWCLOCK_LONG_OPTIONS=y +CONFIG_FEATURE_HWCLOCK_ADJTIME_FHS=y +# CONFIG_IPCRM is not set +# CONFIG_IPCS is not set +CONFIG_LOSETUP=y +CONFIG_MDEV=y +CONFIG_FEATURE_MDEV_CONF=y +CONFIG_FEATURE_MDEV_RENAME=y +CONFIG_FEATURE_MDEV_RENAME_REGEXP=y +CONFIG_FEATURE_MDEV_EXEC=y +CONFIG_FEATURE_MDEV_LOAD_FIRMWARE=y +CONFIG_MKSWAP=y +# CONFIG_FEATURE_MKSWAP_V0 is not set +CONFIG_MORE=y +CONFIG_FEATURE_USE_TERMIOS=y +CONFIG_VOLUMEID=y +# CONFIG_FEATURE_VOLUMEID_EXT is not set +# CONFIG_FEATURE_VOLUMEID_REISERFS is not set +# CONFIG_FEATURE_VOLUMEID_FAT is not set +# CONFIG_FEATURE_VOLUMEID_HFS is not set +# CONFIG_FEATURE_VOLUMEID_JFS is not set +# CONFIG_FEATURE_VOLUMEID_XFS is not set +# CONFIG_FEATURE_VOLUMEID_NTFS is not set +# CONFIG_FEATURE_VOLUMEID_ISO9660 is not set +# CONFIG_FEATURE_VOLUMEID_UDF is not set +# CONFIG_FEATURE_VOLUMEID_LUKS is not set +# CONFIG_FEATURE_VOLUMEID_LINUXSWAP is not set +# CONFIG_FEATURE_VOLUMEID_CRAMFS is not set +# CONFIG_FEATURE_VOLUMEID_ROMFS is not set +# CONFIG_FEATURE_VOLUMEID_SYSV is not set +# CONFIG_FEATURE_VOLUMEID_OCFS2 is not set +# CONFIG_FEATURE_VOLUMEID_LINUXRAID is not set +CONFIG_MOUNT=y +# CONFIG_FEATURE_MOUNT_FAKE is not set +# CONFIG_FEATURE_MOUNT_VERBOSE is not set +CONFIG_FEATURE_MOUNT_HELPERS=y +CONFIG_FEATURE_MOUNT_LABEL=y +CONFIG_FEATURE_MOUNT_NFS=y +CONFIG_FEATURE_MOUNT_CIFS=y +CONFIG_FEATURE_MOUNT_FLAGS=y +CONFIG_FEATURE_MOUNT_FSTAB=y +CONFIG_PIVOT_ROOT=y +CONFIG_RDATE=y +CONFIG_READPROFILE=y +# CONFIG_RTCWAKE is not set +# CONFIG_SCRIPT is not set +# CONFIG_SETARCH is not set +CONFIG_SWAPONOFF=y +# CONFIG_FEATURE_SWAPON_PRI is not set +CONFIG_SWITCH_ROOT=y +CONFIG_UMOUNT=y +CONFIG_FEATURE_UMOUNT_ALL=y + +# +# Common options for mount/umount +# +CONFIG_FEATURE_MOUNT_LOOP=y +# CONFIG_FEATURE_MTAB_SUPPORT is not set + +# +# Miscellaneous Utilities +# +# CONFIG_ADJTIMEX is not set +# CONFIG_BBCONFIG is not set +# CONFIG_CHAT is not set +# CONFIG_FEATURE_CHAT_NOFAIL is not set +# CONFIG_FEATURE_CHAT_TTY_HIFI is not set +# CONFIG_FEATURE_CHAT_IMPLICIT_CR is not set +# CONFIG_FEATURE_CHAT_SWALLOW_OPTS is not set +# CONFIG_FEATURE_CHAT_SEND_ESCAPES is not set +# CONFIG_FEATURE_CHAT_VAR_ABORT_LEN is not set +# CONFIG_FEATURE_CHAT_CLR_ABORT is not set +# CONFIG_CHRT is not set +# CONFIG_CROND is not set +# CONFIG_DEBUG_CROND_OPTION is not set +# CONFIG_FEATURE_CROND_CALL_SENDMAIL is not set +# CONFIG_CRONTAB is not set +CONFIG_DC=y +# CONFIG_DEVFSD is not set +# CONFIG_DEVFSD_MODLOAD is not set +# CONFIG_DEVFSD_FG_NP is not set +# CONFIG_DEVFSD_VERBOSE is not set +# CONFIG_FEATURE_DEVFS is not set +# CONFIG_EJECT is not set +# CONFIG_FEATURE_EJECT_SCSI is not set +# CONFIG_FBSPLASH is not set +# CONFIG_INOTIFYD is not set +# CONFIG_LAST is not set +# CONFIG_FEATURE_LAST_SMALL is not set +# CONFIG_FEATURE_LAST_FANCY is not set +CONFIG_LESS=y +CONFIG_FEATURE_LESS_MAXLINES=9999999 +CONFIG_FEATURE_LESS_BRACKETS=y +CONFIG_FEATURE_LESS_FLAGS=y +# CONFIG_FEATURE_LESS_FLAGCS is not set +# CONFIG_FEATURE_LESS_MARKS is not set +# CONFIG_FEATURE_LESS_REGEXP is not set +# CONFIG_HDPARM is not set +# CONFIG_FEATURE_HDPARM_GET_IDENTITY is not set +# CONFIG_FEATURE_HDPARM_HDIO_SCAN_HWIF is not set +# CONFIG_FEATURE_HDPARM_HDIO_UNREGISTER_HWIF is not set +# CONFIG_FEATURE_HDPARM_HDIO_DRIVE_RESET is not set +# CONFIG_FEATURE_HDPARM_HDIO_TRISTATE_HWIF is not set +# CONFIG_FEATURE_HDPARM_HDIO_GETSET_DMA is not set +CONFIG_MAKEDEVS=y +# CONFIG_FEATURE_MAKEDEVS_LEAF is not set +CONFIG_FEATURE_MAKEDEVS_TABLE=y +# CONFIG_MAN is not set +# CONFIG_MICROCOM is not set +# CONFIG_MOUNTPOINT is not set +# CONFIG_MT is not set +# CONFIG_RAIDAUTORUN is not set +CONFIG_READAHEAD=y +# CONFIG_RUNLEVEL is not set +# CONFIG_RX is not set +# CONFIG_SETSID is not set +CONFIG_STRINGS=y +# CONFIG_TASKSET is not set +# CONFIG_FEATURE_TASKSET_FANCY is not set +CONFIG_TIME=y +# CONFIG_TTYSIZE is not set +# CONFIG_WATCHDOG is not set + +# +# Networking Utilities +# +CONFIG_FEATURE_IPV6=y +CONFIG_FEATURE_PREFER_IPV4_ADDRESS=y +# CONFIG_VERBOSE_RESOLUTION_ERRORS is not set +# CONFIG_ARP is not set +# CONFIG_ARPING is not set +# CONFIG_BRCTL is not set +# CONFIG_FEATURE_BRCTL_FANCY is not set +# CONFIG_FEATURE_BRCTL_SHOW is not set +# CONFIG_DNSD is not set +# CONFIG_ETHER_WAKE is not set +# CONFIG_FAKEIDENTD is not set +# CONFIG_FTPGET is not set +# CONFIG_FTPPUT is not set +# CONFIG_FEATURE_FTPGETPUT_LONG_OPTIONS is not set +CONFIG_HOSTNAME=y +# CONFIG_HTTPD is not set +# CONFIG_FEATURE_HTTPD_RANGES is not set +# CONFIG_FEATURE_HTTPD_USE_SENDFILE is not set +# CONFIG_FEATURE_HTTPD_RELOAD_CONFIG_SIGHUP is not set +# CONFIG_FEATURE_HTTPD_SETUID is not set +# CONFIG_FEATURE_HTTPD_BASIC_AUTH is not set +# CONFIG_FEATURE_HTTPD_AUTH_MD5 is not set +# CONFIG_FEATURE_HTTPD_CONFIG_WITH_MIME_TYPES is not set +# CONFIG_FEATURE_HTTPD_CGI is not set +# CONFIG_FEATURE_HTTPD_CONFIG_WITH_SCRIPT_INTERPR is not set +# CONFIG_FEATURE_HTTPD_SET_REMOTE_PORT_TO_ENV is not set +# CONFIG_FEATURE_HTTPD_ENCODE_URL_STR is not set +# CONFIG_FEATURE_HTTPD_ERROR_PAGES is not set +# CONFIG_FEATURE_HTTPD_PROXY is not set +CONFIG_IFCONFIG=y +CONFIG_FEATURE_IFCONFIG_STATUS=y +# CONFIG_FEATURE_IFCONFIG_SLIP is not set +# CONFIG_FEATURE_IFCONFIG_MEMSTART_IOADDR_IRQ is not set +CONFIG_FEATURE_IFCONFIG_HW=y +# CONFIG_FEATURE_IFCONFIG_BROADCAST_PLUS is not set +# CONFIG_IFENSLAVE is not set +CONFIG_IFUPDOWN=y +CONFIG_IFUPDOWN_IFSTATE_PATH="/var/run/ifstate" +# CONFIG_FEATURE_IFUPDOWN_IP is not set +# CONFIG_FEATURE_IFUPDOWN_IP_BUILTIN is not set +CONFIG_FEATURE_IFUPDOWN_IFCONFIG_BUILTIN=y +CONFIG_FEATURE_IFUPDOWN_IPV4=y +CONFIG_FEATURE_IFUPDOWN_IPV6=y +CONFIG_FEATURE_IFUPDOWN_MAPPING=y +# CONFIG_FEATURE_IFUPDOWN_EXTERNAL_DHCP is not set +# CONFIG_INETD is not set +# CONFIG_FEATURE_INETD_SUPPORT_BUILTIN_ECHO is not set +# CONFIG_FEATURE_INETD_SUPPORT_BUILTIN_DISCARD is not set +# CONFIG_FEATURE_INETD_SUPPORT_BUILTIN_TIME is not set +# CONFIG_FEATURE_INETD_SUPPORT_BUILTIN_DAYTIME is not set +# CONFIG_FEATURE_INETD_SUPPORT_BUILTIN_CHARGEN is not set +# CONFIG_FEATURE_INETD_RPC is not set +CONFIG_IP=y +CONFIG_FEATURE_IP_ADDRESS=y +CONFIG_FEATURE_IP_LINK=y +CONFIG_FEATURE_IP_ROUTE=y +CONFIG_FEATURE_IP_TUNNEL=y +# CONFIG_FEATURE_IP_RULE is not set +# CONFIG_FEATURE_IP_SHORT_FORMS is not set +# CONFIG_FEATURE_IP_RARE_PROTOCOLS is not set +# CONFIG_IPADDR is not set +# CONFIG_IPLINK is not set +# CONFIG_IPROUTE is not set +# CONFIG_IPTUNNEL is not set +# CONFIG_IPRULE is not set +# CONFIG_IPCALC is not set +# CONFIG_FEATURE_IPCALC_FANCY is not set +# CONFIG_FEATURE_IPCALC_LONG_OPTIONS is not set +# CONFIG_NAMEIF is not set +# CONFIG_FEATURE_NAMEIF_EXTENDED is not set +CONFIG_NC=y +CONFIG_NC_SERVER=y +CONFIG_NC_EXTRA=y +CONFIG_NETSTAT=y +# CONFIG_FEATURE_NETSTAT_WIDE is not set +CONFIG_NSLOOKUP=y +CONFIG_PING=y +CONFIG_PING6=y +CONFIG_FEATURE_FANCY_PING=y +# CONFIG_PSCAN is not set +CONFIG_ROUTE=y +# CONFIG_SENDMAIL is not set +# CONFIG_FETCHMAIL is not set +# CONFIG_SLATTACH is not set +CONFIG_TELNET=y +# CONFIG_FEATURE_TELNET_TTYPE is not set +CONFIG_FEATURE_TELNET_AUTOLOGIN=y +CONFIG_TELNETD=y +# CONFIG_FEATURE_TELNETD_STANDALONE is not set +CONFIG_TFTP=y +# CONFIG_TFTPD is not set +CONFIG_FEATURE_TFTP_GET=y +CONFIG_FEATURE_TFTP_PUT=y +# CONFIG_FEATURE_TFTP_BLOCKSIZE is not set +# CONFIG_DEBUG_TFTP is not set +CONFIG_TRACEROUTE=y +CONFIG_FEATURE_TRACEROUTE_VERBOSE=y +# CONFIG_FEATURE_TRACEROUTE_SOURCE_ROUTE is not set +# CONFIG_FEATURE_TRACEROUTE_USE_ICMP is not set +CONFIG_APP_UDHCPD=y +# CONFIG_APP_DHCPRELAY is not set +CONFIG_APP_DUMPLEASES=y +# CONFIG_FEATURE_UDHCPD_WRITE_LEASES_EARLY is not set +CONFIG_DHCPD_LEASES_FILE="/var/lib/misc/udhcpd.leases" +CONFIG_APP_UDHCPC=y +CONFIG_FEATURE_UDHCPC_ARPING=y +# CONFIG_FEATURE_UDHCP_PORT is not set +# CONFIG_FEATURE_UDHCP_DEBUG is not set +# CONFIG_FEATURE_RFC3397 is not set +CONFIG_DHCPC_DEFAULT_SCRIPT="/usr/share/udhcpc/default.script" +CONFIG_UDHCPC_SLACK_FOR_BUGGY_SERVERS=80 +# CONFIG_VCONFIG is not set +CONFIG_WGET=y +CONFIG_FEATURE_WGET_STATUSBAR=y +CONFIG_FEATURE_WGET_AUTHENTICATION=y +CONFIG_FEATURE_WGET_LONG_OPTIONS=y +# CONFIG_ZCIP is not set +# CONFIG_TCPSVD is not set +# CONFIG_UDPSVD is not set + +# +# Process Utilities +# +CONFIG_FREE=y +CONFIG_FUSER=y +CONFIG_KILL=y +CONFIG_KILLALL=y +# CONFIG_KILLALL5 is not set +# CONFIG_NMETER is not set +# CONFIG_PGREP is not set +CONFIG_PIDOF=y +CONFIG_FEATURE_PIDOF_SINGLE=y +CONFIG_FEATURE_PIDOF_OMIT=y +# CONFIG_PKILL is not set +CONFIG_PS=y +CONFIG_FEATURE_PS_WIDE=y +# CONFIG_FEATURE_PS_TIME is not set +# CONFIG_FEATURE_PS_UNUSUAL_SYSTEMS is not set +CONFIG_RENICE=y +CONFIG_BB_SYSCTL=y +CONFIG_TOP=y +CONFIG_FEATURE_TOP_CPU_USAGE_PERCENTAGE=y +CONFIG_FEATURE_TOP_CPU_GLOBAL_PERCENTS=y +# CONFIG_FEATURE_TOP_DECIMALS is not set +# CONFIG_FEATURE_TOPMEM is not set +CONFIG_UPTIME=y +CONFIG_WATCH=y + +# +# Shells +# +CONFIG_FEATURE_SH_IS_ASH=y +# CONFIG_FEATURE_SH_IS_HUSH is not set +# CONFIG_FEATURE_SH_IS_MSH is not set +# CONFIG_FEATURE_SH_IS_NONE is not set +CONFIG_ASH=y + +# +# Ash Shell Options +# +CONFIG_ASH_BASH_COMPAT=y +CONFIG_ASH_JOB_CONTROL=y +CONFIG_ASH_READ_NCHARS=y +CONFIG_ASH_READ_TIMEOUT=y +CONFIG_ASH_ALIAS=y +CONFIG_ASH_MATH_SUPPORT=y +# CONFIG_ASH_MATH_SUPPORT_64 is not set +CONFIG_ASH_GETOPTS=y +# CONFIG_ASH_BUILTIN_ECHO is not set +CONFIG_ASH_BUILTIN_PRINTF=y +CONFIG_ASH_BUILTIN_TEST=y +# CONFIG_ASH_CMDCMD is not set +# CONFIG_ASH_MAIL is not set +CONFIG_ASH_OPTIMIZE_FOR_SIZE=y +# CONFIG_ASH_RANDOM_SUPPORT is not set +CONFIG_ASH_EXPAND_PRMT=y +# CONFIG_HUSH is not set +# CONFIG_HUSH_HELP is not set +# CONFIG_HUSH_INTERACTIVE is not set +# CONFIG_HUSH_JOB is not set +# CONFIG_HUSH_TICK is not set +# CONFIG_HUSH_IF is not set +# CONFIG_HUSH_LOOPS is not set +# CONFIG_LASH is not set +# CONFIG_MSH is not set + +# +# Bourne Shell Options +# +CONFIG_FEATURE_SH_EXTRA_QUIET=y +# CONFIG_FEATURE_SH_STANDALONE is not set +# CONFIG_FEATURE_SH_NOFORK is not set +# CONFIG_CTTYHACK is not set + +# +# System Logging Utilities +# +CONFIG_SYSLOGD=y +CONFIG_FEATURE_ROTATE_LOGFILE=y +CONFIG_FEATURE_REMOTE_LOG=y +CONFIG_FEATURE_SYSLOGD_DUP=y +CONFIG_FEATURE_IPC_SYSLOG=y +CONFIG_FEATURE_IPC_SYSLOG_BUFFER_SIZE=16 +CONFIG_LOGREAD=y +CONFIG_FEATURE_LOGREAD_REDUCED_LOCKING=y +CONFIG_KLOGD=y +CONFIG_LOGGER=y + +# +# Runit Utilities +# +# CONFIG_RUNSV is not set +# CONFIG_RUNSVDIR is not set +# CONFIG_SV is not set +# CONFIG_SVLOGD is not set +# CONFIG_CHPST is not set +# CONFIG_SETUIDGID is not set +# CONFIG_ENVUIDGID is not set +# CONFIG_ENVDIR is not set +# CONFIG_SOFTLIMIT is not set +# CONFIG_CHCON is not set +# CONFIG_FEATURE_CHCON_LONG_OPTIONS is not set +# CONFIG_GETENFORCE is not set +# CONFIG_GETSEBOOL is not set +# CONFIG_LOAD_POLICY is not set +# CONFIG_MATCHPATHCON is not set +# CONFIG_RESTORECON is not set +# CONFIG_RUNCON is not set +# CONFIG_FEATURE_RUNCON_LONG_OPTIONS is not set +# CONFIG_SELINUXENABLED is not set +# CONFIG_SETENFORCE is not set +# CONFIG_SETFILES is not set +# CONFIG_FEATURE_SETFILES_CHECK_OPTION is not set +# CONFIG_SETSEBOOL is not set +# CONFIG_SESTATUS is not set + +# +# Print Utilities +# +# CONFIG_LPD is not set +# CONFIG_LPR is not set +# CONFIG_LPQ is not set diff --git a/packages/busybox/busybox-1.13.2/slugos/defconfig b/packages/busybox/busybox-1.13.2/slugos/defconfig index 67c7a98aae..fd89ef68b4 100644 --- a/packages/busybox/busybox-1.13.2/slugos/defconfig +++ b/packages/busybox/busybox-1.13.2/slugos/defconfig @@ -1,7 +1,7 @@ # # Automatically generated make config: don't edit # Busybox version: 1.13.2 -# Sun Jan 18 16:45:58 2009 +# Fri Feb 13 21:35:37 2009 # CONFIG_HAVE_DOT_CONFIG=y @@ -101,9 +101,9 @@ CONFIG_IOCTL_HEX2STR_ERROR=y # Archival Utilities # # CONFIG_FEATURE_SEAMLESS_LZMA is not set -# CONFIG_FEATURE_SEAMLESS_BZ2 is not set -# CONFIG_FEATURE_SEAMLESS_GZ is not set -# CONFIG_FEATURE_SEAMLESS_Z is not set +CONFIG_FEATURE_SEAMLESS_BZ2=y +CONFIG_FEATURE_SEAMLESS_GZ=y +CONFIG_FEATURE_SEAMLESS_Z=y CONFIG_AR=y CONFIG_FEATURE_AR_LONG_FILENAMES=y CONFIG_BUNZIP2=y @@ -119,7 +119,7 @@ CONFIG_GZIP=y # CONFIG_RPM is not set CONFIG_TAR=y CONFIG_FEATURE_TAR_CREATE=y -# CONFIG_FEATURE_TAR_AUTODETECT is not set +CONFIG_FEATURE_TAR_AUTODETECT=y CONFIG_FEATURE_TAR_FROM=y CONFIG_FEATURE_TAR_OLDGNU_COMPATIBILITY=y # CONFIG_FEATURE_TAR_OLDSUN_COMPATIBILITY is not set diff --git a/packages/busybox/busybox-static_1.11.3.bb b/packages/busybox/busybox-static_1.11.3.bb index 9313c892f6..cf82921e9b 100644 --- a/packages/busybox/busybox-static_1.11.3.bb +++ b/packages/busybox/busybox-static_1.11.3.bb @@ -1,4 +1,4 @@ require busybox_${PV}.bb -PR = "r2" +PR = "r3" S = "${WORKDIR}/busybox-1.11.3" diff --git a/packages/busybox/busybox.inc b/packages/busybox/busybox.inc index 4b195d5584..cb8eb53216 100644 --- a/packages/busybox/busybox.inc +++ b/packages/busybox/busybox.inc @@ -129,6 +129,10 @@ do_install () { install -m 0755 ${S}/examples/udhcp/simple.script ${D}${sysconfdir}/udhcpc.d/50default install -m 0755 ${WORKDIR}/default.script ${D}${datadir}/udhcpc/default.script fi + if grep "CONFIG_FEATURE_MOUNT_FSTAB=y" ${WORKDIR}/defconfig; then + install -d ${D}${sysconfdir}/default + install -m 644 ${WORKDIR}/mountall ${D}${sysconfdir}/default/ + fi install -m 0644 ${S}/busybox.links ${D}${sysconfdir} } diff --git a/packages/busybox/busybox_1.11.3.bb b/packages/busybox/busybox_1.11.3.bb index b42f8ea998..305a0b6c14 100644 --- a/packages/busybox/busybox_1.11.3.bb +++ b/packages/busybox/busybox_1.11.3.bb @@ -1,5 +1,5 @@ require busybox.inc -PR = "r13" +PR = "r14" SRC_URI = "\ http://www.busybox.net/downloads/busybox-${PV}.tar.gz \ @@ -13,6 +13,7 @@ SRC_URI = "\ file://default.script \ file://hwclock.sh \ file://mount.busybox \ + file://mountall \ file://syslog \ file://syslog.conf \ file://umount.busybox \ diff --git a/packages/busybox/busybox_1.13.2.bb b/packages/busybox/busybox_1.13.2.bb index 5ae76b900d..e8f37a002b 100644 --- a/packages/busybox/busybox_1.13.2.bb +++ b/packages/busybox/busybox_1.13.2.bb @@ -1,5 +1,5 @@ require busybox.inc -PR = "r12" +PR = "r15" SRC_URI = "\ http://www.busybox.net/downloads/busybox-${PV}.tar.gz \ @@ -12,6 +12,7 @@ SRC_URI = "\ file://udhcpscript.patch;patch=1 \ file://udhcpc-fix-nfsroot.patch;patch=1 \ file://B921600.patch;patch=1 \ + file://get_header_tar.patch;patch=1 \ file://find-touchscreen.sh \ file://busybox-cron \ file://busybox-httpd \ @@ -19,6 +20,7 @@ SRC_URI = "\ file://default.script \ file://hwclock.sh \ file://mount.busybox \ + file://mountall \ file://syslog \ file://syslog.conf \ file://umount.busybox \ @@ -31,6 +33,9 @@ EXTRA_OEMAKE += "V=1 ARCH=${TARGET_ARCH} CROSS_COMPILE=${TARGET_PREFIX}" do_configure () { install -m 0644 ${WORKDIR}/defconfig ${S}/.config + if [ "${TARGET_ARCH}" = "avr32" ] ; then + sed -i s:CONFIG_FEATURE_OSF_LABEL=y:CONFIG_FEATURE_OSF_LABEL=n: ${S}/.config + fi cml1_do_configure } diff --git a/packages/busybox/busybox_1.7.2.bb b/packages/busybox/busybox_1.7.2.bb index e98e25eb37..9d6e01c3d0 100644 --- a/packages/busybox/busybox_1.7.2.bb +++ b/packages/busybox/busybox_1.7.2.bb @@ -1,5 +1,5 @@ require busybox.inc -PR = "r11" +PR = "r12" SRC_URI = "http://www.busybox.net/downloads/busybox-${PV}.tar.gz \ file://busybox-cron \ @@ -8,6 +8,7 @@ SRC_URI = "http://www.busybox.net/downloads/busybox-${PV}.tar.gz \ file://default.script \ file://hwclock.sh \ file://mount.busybox \ + file://mountall \ file://syslog \ file://syslog.conf \ file://udhcpscript.patch;patch=1 \ diff --git a/packages/busybox/busybox_1.9.2.bb b/packages/busybox/busybox_1.9.2.bb index 77dd2a905c..eb8d37286f 100644 --- a/packages/busybox/busybox_1.9.2.bb +++ b/packages/busybox/busybox_1.9.2.bb @@ -1,5 +1,5 @@ require busybox.inc -PR = "r4" +PR = "r5" SRC_URI = "http://www.busybox.net/downloads/busybox-${PV}.tar.gz \ file://udhcpscript.patch;patch=1 \ @@ -12,6 +12,7 @@ SRC_URI = "http://www.busybox.net/downloads/busybox-${PV}.tar.gz \ file://default.script \ file://hwclock.sh \ file://mount.busybox \ + file://mountall \ file://syslog \ file://syslog.conf \ file://umount.busybox \ diff --git a/packages/busybox/files/mountall b/packages/busybox/files/mountall new file mode 100644 index 0000000000..d5408b8f8d --- /dev/null +++ b/packages/busybox/files/mountall @@ -0,0 +1 @@ +MOUNTALL="-t nonfs,nosmbfs,noncpfs" diff --git a/packages/busybox/slingbox_1.3.1.bb b/packages/busybox/slingbox_1.3.1.bb index cbcce6c675..0a9051d447 100644 --- a/packages/busybox/slingbox_1.3.1.bb +++ b/packages/busybox/slingbox_1.3.1.bb @@ -4,11 +4,12 @@ HOMEPAGE = "http://www.busybox.net" LICENSE = "GPL" SECTION = "base" PRIORITY = "required" -PR = "r3" +PR = "r4" COMPATIBLE_MACHINE = "nslu2" SRC_URI = "http://www.busybox.net/downloads/busybox-${PV}.tar.gz \ file://defconfig \ + file://mountall \ file://shadow_h_is_required.patch;patch=1 \ file://df_rootfs.patch;patch=1 \ file://lazy_umount.patch;patch=1 \ diff --git a/packages/clutter/aaina_svn.bb b/packages/clutter/aaina_svn.bb index 52a2b3ae0e..862dfd8933 100644 --- a/packages/clutter/aaina_svn.bb +++ b/packages/clutter/aaina_svn.bb @@ -1,5 +1,6 @@ require aaina.inc +SRCREV = "3597" PV = "0.3.0+svnr${SRCREV}" SRC_URI = "svn://svn.o-hand.com/repos/clutter/trunk/toys;module=aaina;proto=http" diff --git a/packages/clutter/clutter_0.8+git.bb b/packages/clutter/clutter_0.8+git.bb new file mode 100644 index 0000000000..b578cbe43d --- /dev/null +++ b/packages/clutter/clutter_0.8+git.bb @@ -0,0 +1,13 @@ +require clutter.inc + +CLUTTER_REV = "7129ee4f1b86bfcb65b5fc39021b05b74168785d" + +PV = "0.8.7+gitr${CLUTTER_REV}" +PR = "r0" +SRC_URI = "git://git.clutter-project.org/clutter.git;protocol=git;branch=clutter-0-8;rev=${CLUTTER_REV} \ + file://enable-tests-r2990.patch;patch=1" + +S = "${WORKDIR}/git" + + + diff --git a/packages/clutter/clutter_0.8+svn.bb b/packages/clutter/clutter_0.8+svn.bb deleted file mode 100644 index a203165ca8..0000000000 --- a/packages/clutter/clutter_0.8+svn.bb +++ /dev/null @@ -1,14 +0,0 @@ -require clutter.inc - -CLUTTER_REV = "3597" - -PV = "0.8.4+svnr${CLUTTER_REV}" -PR = "r0" -SRC_URI = "svn://svn.o-hand.com/repos/clutter/branches;module=clutter-0-8;proto=http;rev=${CLUTTER_REV} \ - file://enable_tests.patch;patch=1;maxrev=2989 \ - file://enable-tests-r2990.patch;patch=1;minrev=2990" - -S = "${WORKDIR}/clutter-0-8" - - - diff --git a/packages/cups/cups-1.3.8/use_echo_only_in_init.patch b/packages/cups/cups-1.3.8/use_echo_only_in_init.patch new file mode 100644 index 0000000000..21ff0e535b --- /dev/null +++ b/packages/cups/cups-1.3.8/use_echo_only_in_init.patch @@ -0,0 +1,11 @@ +--- a/init/cups.sh.in.orig 2008-10-04 16:50:46.000000000 -0300 ++++ b/init/cups.sh.in 2008-10-04 16:51:39.000000000 -0300 +@@ -68,7 +68,7 @@ + ECHO_ERROR=: + ;; + +- Linux*) ++ DISABLELinux*) + IS_ON=/bin/true + if test -f /etc/init.d/functions; then + . /etc/init.d/functions diff --git a/packages/cups/cups_1.3.8.bb b/packages/cups/cups_1.3.8.bb new file mode 100644 index 0000000000..e9fd9850e9 --- /dev/null +++ b/packages/cups/cups_1.3.8.bb @@ -0,0 +1,8 @@ +require cups.inc + +SRC_URI += "file://use_echo_only_in_init.patch;patch=1" +PR = "r1" + +DEFAULT_PREFERENCE = "-1" + +EXTRA_OECONF += " --disable-gssapi " diff --git a/packages/dhcp/dhcp_3.0.2.bb b/packages/dhcp/dhcp_3.0.2.bb index f8d85089fe..faf22b29cf 100644 --- a/packages/dhcp/dhcp_3.0.2.bb +++ b/packages/dhcp/dhcp_3.0.2.bb @@ -2,7 +2,7 @@ SECTION = "console/network" DESCRIPTION = "Internet Software Consortium DHCP package" HOMEPAGE = "http://www.isc.org/" LICENSE = "BSD" -PR = "r7" +PR = "r8" SRC_URI = "ftp://ftp.isc.org/isc/dhcp/dhcp-3.0-history/dhcp-${PV}.tar.gz \ file://noattrmode.patch;patch=1 \ file://fixincludes.patch;patch=1 \ @@ -12,6 +12,13 @@ SRC_URI = "ftp://ftp.isc.org/isc/dhcp/dhcp-3.0-history/dhcp-${PV}.tar.gz \ file://init-server file://default-server \ file://dhclient.conf file://dhcpd.conf" + +inherit update-rc.d + +INITSCRIPT_PACKAGES = "dhcp-server" +INITSCRIPT_NAME_dhcp-server = dhcp-server +INITSCRIPT_PARAMS_dhcp-server = "start 30 2 3 4 5 . stop 30 0 1 6 ." + do_configure() { ./configure } diff --git a/packages/dnsmasq/dnsmasq-dbus_2.46.bb b/packages/dnsmasq/dnsmasq-dbus_2.47.bb index f6070a1987..d03dbdb06e 100644 --- a/packages/dnsmasq/dnsmasq-dbus_2.46.bb +++ b/packages/dnsmasq/dnsmasq-dbus_2.47.bb @@ -2,12 +2,9 @@ require dnsmasq.inc -PR = "r1" DEPENDS = "dbus" EXTRA_OEMAKE = "COPTS=-DHAVE_DBUS" -SRC_URI += "file://dbus_introspection.patch;patch=1" - do_install_append () { install -d ${D}${sysconfdir}/dbus-1/system.d install -m 644 dbus/dnsmasq.conf ${D}${sysconfdir}/dbus-1/system.d/ diff --git a/packages/dnsmasq/dnsmasq_2.46.bb b/packages/dnsmasq/dnsmasq_2.47.bb index 9a79c6e76f..83aea1d299 100644 --- a/packages/dnsmasq/dnsmasq_2.46.bb +++ b/packages/dnsmasq/dnsmasq_2.47.bb @@ -1,3 +1 @@ -PR = "r1" - require dnsmasq.inc diff --git a/packages/dnsmasq/files/dbus_introspection.patch b/packages/dnsmasq/files/dbus_introspection.patch deleted file mode 100644 index 52cbb6e25b..0000000000 --- a/packages/dnsmasq/files/dbus_introspection.patch +++ /dev/null @@ -1,63 +0,0 @@ -diff -urN dnsmasq-2.46.orig/src/dbus.c dnsmasq-2.46/src/dbus.c ---- dnsmasq-2.46.orig/src/dbus.c 2008-11-14 21:02:08.000000000 +0100 -+++ dnsmasq-2.46/src/dbus.c 2008-12-15 10:45:48.000000000 +0100 -@@ -21,6 +21,42 @@ - #define DBUS_API_SUBJECT_TO_CHANGE - #include <dbus/dbus.h> - -+const char* introspection_xml = -+"<!DOCTYPE node PUBLIC \"-//freedesktop//DTD D-BUS Object Introspection 1.0//EN\"\n" -+"\"http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd\">\n" -+"<node name=\"" DNSMASQ_PATH "\">\n" -+" <interface name=\"org.freedesktop.DBus.Introspectable\">\n" -+" <method name=\"Introspect\">\n" -+" <arg name=\"data\" direction=\"out\" type=\"s\"/>\n" -+" </method>\n" -+" </interface>\n" -+" <interface name=\"" DNSMASQ_SERVICE "\">\n" -+" <method name=\"ClearCache\">\n" -+" </method>\n" -+" <method name=\"GetVersion\">\n" -+" <arg name=\"version\" direction=\"out\" type=\"s\"/>\n" -+" </method>\n" -+" <method name=\"SetServers\">\n" -+" <arg name=\"servers\" direction=\"in\" type=\"av\"/>\n" -+" </method>\n" -+" <signal name=\"DhcpLeaseAdded\">\n" -+" <arg name=\"ipaddr\" type=\"s\"/>\n" -+" <arg name=\"hwaddr\" type=\"s\"/>\n" -+" <arg name=\"hostname\" type=\"s\"/>\n" -+" </signal>\n" -+" <signal name=\"DhcpLeaseDeleted\">\n" -+" <arg name=\"ipaddr\" type=\"s\"/>\n" -+" <arg name=\"hwaddr\" type=\"s\"/>\n" -+" <arg name=\"hostname\" type=\"s\"/>\n" -+" </signal>\n" -+" <signal name=\"DhcpLeaseUpdated\">\n" -+" <arg name=\"ipaddr\" type=\"s\"/>\n" -+" <arg name=\"hwaddr\" type=\"s\"/>\n" -+" <arg name=\"hostname\" type=\"s\"/>\n" -+" </signal>\n" -+" </interface>\n" -+"</node>\n"; -+ - struct watch { - DBusWatch *watch; - struct watch *next; -@@ -229,7 +265,15 @@ - { - char *method = (char *)dbus_message_get_member(message); - -- if (strcmp(method, "GetVersion") == 0) -+ if (dbus_message_is_method_call(message, DBUS_INTERFACE_INTROSPECTABLE, "Introspect")) -+ { -+ DBusMessage *reply = dbus_message_new_method_return(message); -+ -+ dbus_message_append_args(reply, DBUS_TYPE_STRING, &introspection_xml, DBUS_TYPE_INVALID); -+ dbus_connection_send (connection, reply, NULL); -+ dbus_message_unref (reply); -+ } -+ else if (strcmp(method, "GetVersion") == 0) - { - char *v = VERSION; - DBusMessage *reply = dbus_message_new_method_return(message); diff --git a/packages/dsplink/codec-engine_2.21.bb b/packages/dsplink/codec-engine_2.21.bb index 1b958bd385..5040867178 100644 --- a/packages/dsplink/codec-engine_2.21.bb +++ b/packages/dsplink/codec-engine_2.21.bb @@ -8,7 +8,7 @@ RDEPENDS = "update-modules" inherit module # tconf from xdctools dislikes '.' in pwd :/ -PR = "r7" +PR = "r8" PV = "221" # Get CE tarball from TI website, place in sources and calculate @@ -16,7 +16,9 @@ PV = "221" # Look for tarball at https://www-a.ti.com/downloads/sds_support/targetcontent/CE/index.html SRC_URI = "http://install.tarball.in.source.dir/codec_engine_2_21.tar.gz \ - file://cmemk-class-device-27.diff \ + file://cmem-class-device-27-and-sched-include-fix.patch;patch=1 \ + file://dsplink-semaphore-27.patch;patch=1 \ + file://lpm-device-create-and-semaphore-include-fix.patch;patch=1 \ file://Makefile.dsplink \ file://Makefile-dsplink-kbuild \ file://Makefile-dsplink-gpp \ @@ -42,8 +44,19 @@ do_compile_append() { -e s:/db/toolsrc/library/tools/vendors/opensource/gcc/4.1.0/Linux/gcc-4.1.0-glibc-2.3.6/i686-unknown-linux-gnu:/usr:g \ -e s:arm-none-linux-gnueabi-:${TARGET_PREFIX}:g \ -e 's:true, // build for uC Linux:false,:g' \ - -e 's:true, // build for PC Linux:false,:g' \ - ${S}/examples/user.bld + -e 's:true, // build for PC Linux:false,:g' \ + ${S}/examples/user.bld + + # For now, remove all targets, except dm6446 and omap3530 + sed -i \ + -e '/evmDM357/d' \ + -e '/evmDM6467/d' \ + -e '/evmDM355/d' \ + -e '/evmDM6437/d' \ + -e '/evmDM648/d' \ + -e '/sdp3430/d' \ + -e '/evm2530/d' \ + ${S}/examples/user.bld # Fix path to c6x codegen sed -i -e s:/db/toolsrc/library/tools/vendors/ti/c6x/6.0.16/Linux:${TITOOLSDIR}/${TICGTOOLSDIR}:g \ diff --git a/packages/dsplink/dmai_1.20.bb b/packages/dsplink/dmai_1.20.bb new file mode 100644 index 0000000000..12cbea4a12 --- /dev/null +++ b/packages/dsplink/dmai_1.20.bb @@ -0,0 +1,44 @@ +DESCRIPTION = "Davinci (and OMAP) Multimedia Application Interface" +DEPENDS = "virtual/kernel codec-engine" +LICENCE = "unknown" + +require ti-paths.inc + +# https://www-a.ti.com/downloads/sds_support/applications_packages/dmai/dmai_1_20_00_06/dmai_setuplinux_1_20_00_06.bin +# Install the above link and put the dmai_1_20_00_06.tar.gz file in the same directory as this recipe +SRC_URI = "file://dmai_1_20_00_06.tar.gz \ + file://update-cpu-name.patch;patch=1 \ + file://update-fb-display.patch;patch=1 \ + file://update-v4l2-display.patch;patch=1 \ + file://do-not-panic-on-mixer-failure.patch;patch=1 \ + file://support-32bit-align.patch;patch=1 \ +# file://resizer-fix.patch;patch=1 \ + file://built-with-angstrom.patch;patch=1 \ + " + +S = "${WORKDIR}/dmai_1_20_00_06" +# Yes, the xdc stuff still breaks with a '.' in PWD +PV = "120" + +PACKAGE_ARCH = "${MACHINE_ARCH}" + +TARGET = "all" +TARGET_neuros-osd2 = " dm6446_al dm6446_db" +TARGET_beagleboard = " o3530_al" + +do_compile() { + cd packages/ti/sdo/dmai + oe_runmake clean + oe_runmake ${TARGET} C_FLAGS="-O2 -I${STAGING_INCDIR}" + cd apps + oe_runmake clean + oe_runmake ${TARGET} +} + +do_install () { + oe_runmake install +} + +do_stage () { + : +} diff --git a/packages/dsplink/dsplink.inc b/packages/dsplink/dsplink.inc index b263be331a..002d08d2a7 100644 --- a/packages/dsplink/dsplink.inc +++ b/packages/dsplink/dsplink.inc @@ -21,11 +21,6 @@ do_configure () { cd ${DSPLINK} perl config/bin/dsplinkcfg.pl --platform=${DSPLINKPLATFORM} --nodsp=1 --dspcfg_0=${DSPCFG} --dspos_0=DSPBIOS5XX --gppos=${GPPOS} --comps=ponslrm ) - - if [ $(echo ${KERNEL_VERSION} | cut -c5,6) -gt 26 ] ; then - sed -i -e s:asm/semaphore:linux/semaphore: ${DSPLINK}/gpp/src/osal/Linux/user.c - sed -i -e s:asm/semaphore:linux/semaphore: ${DSPLINK}/gpp/src/osal/Linux/2.6.18/sync.c - fi } PARALLEL_MAKE = "" @@ -64,7 +59,6 @@ do_compile () { unset CFLAGS CPPFLAGS CXXFLAGS LDFLAGS export KDIR=${STAGING_KERNEL_DIR} make -e all - make -e -f ${WORKDIR}/Makefile-dsplink-dsp #lpm bits @@ -97,13 +91,8 @@ do_compile () { # Build the cmem kernel module # We unset CFLAGS because kernel modules need different ones, this is basically a verbatim copy of kernel.bbclass and module-base.bbclass unset CFLAGS CPPFLAGS CXXFLAGS LDFLAGS - cd ${S}/cetools/packages/ti/sdo/linuxutils/cmem - - # This sadly breaks doing -c compile more than once, but I don't have a better solution - if [ $(echo ${KERNEL_VERSION} | cut -c5,6) -gt 26 ] ; then - patch -p0 < ${WORKDIR}/cmemk-class-device-27.diff - fi + cd ${S}/cetools/packages/ti/sdo/linuxutils/cmem oe_runmake clean oe_runmake KERNEL_PATH=${STAGING_KERNEL_DIR} \ KERNEL_SRC=${STAGING_KERNEL_DIR} \ diff --git a/packages/dsplink/dsplink_1.60.bb b/packages/dsplink/dsplink_1.60.bb index 7474e8542c..3814f6353e 100644 --- a/packages/dsplink/dsplink_1.60.bb +++ b/packages/dsplink/dsplink_1.60.bb @@ -1,7 +1,7 @@ require dsplink.inc # The tconf tool breaks if there is a '.' in your pwd -PR = "r7" +PR = "r8" PE = "1" PV = "160" @@ -10,6 +10,7 @@ PV = "160" # Look for tarball at https://www-a.ti.com/downloads/sds_support/targetcontent/link/link_1_60/index.html SRC_URI = "http://install.tarball.in.source.dir/dsplink_1_60.tar.gz \ + file://dsplink-semaphore-27.patch;patch=1;pnum=4 \ file://Makefile-dsplink-gpp \ file://Makefile-dsplink-dsp \ " diff --git a/packages/dsplink/files/built-with-angstrom.patch b/packages/dsplink/files/built-with-angstrom.patch new file mode 100644 index 0000000000..fc49789718 --- /dev/null +++ b/packages/dsplink/files/built-with-angstrom.patch @@ -0,0 +1,48 @@ +Index: dmai_1_20_00_06/packages/config.bld +=================================================================== +--- dmai_1_20_00_06.orig/packages/config.bld 2009-02-11 19:38:51.000000000 -0600 ++++ dmai_1_20_00_06/packages/config.bld 2009-02-11 19:39:23.000000000 -0600 +@@ -42,7 +42,7 @@ + + /* location of the Codec Sourcery Arm9 tools */ + var GCArmv5T = xdc.useModule('gnu.targets.arm.GCArmv5T'); +-GCArmv5T.LONGNAME = 'bin/arm-none-linux-gnueabi-gcc'; ++GCArmv5T.LONGNAME = 'bin/arm-angstrom-linux-gnueabi-gcc'; + GCArmv5T.platform = "ti.platforms.evm3530"; + GCArmv5T.rootDir = java.lang.System.getenv("CSTOOL_DIR"); + +Index: dmai_1_20_00_06/packages/ti/sdo/dmai/Makefile +=================================================================== +--- dmai_1_20_00_06.orig/packages/ti/sdo/dmai/Makefile 2009-02-11 19:39:57.000000000 -0600 ++++ dmai_1_20_00_06/packages/ti/sdo/dmai/Makefile 2009-02-11 19:58:05.000000000 -0600 +@@ -33,7 +33,7 @@ + DMAI_INSTALL_DIR = ../../../.. + TARGET = dmai + +-include $(DMAI_INSTALL_DIR)/Rules.make ++#include $(DMAI_INSTALL_DIR)/Rules.make + + # Should the full command be echoed to the console during build? + VERBOSE=false +@@ -64,7 +64,7 @@ + MVL_CPP_FLAGS = $(GNU_CPP_FLAGS) -Dxdc_target_name__=MVArm9 + CS_CPP_FLAGS = $(GNU_CPP_FLAGS) -Dxdc_target_name__=codesourcery/GCArmv5T + +-GNU_C_FLAGS = $(C_FLAGS) -Wall -Werror ++GNU_C_FLAGS = $(C_FLAGS) -Wall + C64P_C_FLAGS = $(C_FLAGS) + + GNU_AR_FLAGS = $(AR_FLAGS) +Index: dmai_1_20_00_06/packages/ti/sdo/dmai/apps/Makefile.app +=================================================================== +--- dmai_1_20_00_06.orig/packages/ti/sdo/dmai/apps/Makefile.app 2009-02-11 19:58:44.000000000 -0600 ++++ dmai_1_20_00_06/packages/ti/sdo/dmai/apps/Makefile.app 2009-02-11 19:59:01.000000000 -0600 +@@ -34,7 +34,7 @@ + ifndef DMAI_INSTALL_DIR + DMAI_INSTALL_DIR = ../../../../../.. + endif +-include $(DMAI_INSTALL_DIR)/Rules.make ++#include $(DMAI_INSTALL_DIR)/Rules.make + + # Should the full command be echoed to the console during build? + VERBOSE=false diff --git a/packages/dsplink/files/cmem-class-device-27-and-sched-include-fix.patch b/packages/dsplink/files/cmem-class-device-27-and-sched-include-fix.patch new file mode 100644 index 0000000000..8eb3210bb1 --- /dev/null +++ b/packages/dsplink/files/cmem-class-device-27-and-sched-include-fix.patch @@ -0,0 +1,23 @@ +diff -uNr codec_engine_2_21/cetools/packages/ti/sdo/linuxutils/cmem/src/module/cmemk.c codec_engine_2_21_fix/cetools/packages/ti/sdo/linuxutils/cmem/src/module/cmemk.c +--- codec_engine_2_21/cetools/packages/ti/sdo/linuxutils/cmem/src/module/cmemk.c 2009-02-12 22:02:15.000000000 +0000 ++++ codec_engine_2_21_fix/cetools/packages/ti/sdo/linuxutils/cmem/src/module/cmemk.c 2009-02-12 22:08:49.000000000 +0000 +@@ -29,6 +29,7 @@ + #include <linux/mm.h> + #include <linux/seq_file.h> + #include <linux/vmalloc.h> ++#include <linux/sched.h> + #include <asm/cacheflush.h> + #include <asm/uaccess.h> + #include <asm/pgtable.h> +@@ -1710,7 +1711,11 @@ + #ifdef USE_CLASS_DEVICE + class_device_create(cmem_class, NULL, MKDEV(cmem_major, 0), NULL, "cmem"); + #else ++#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,27) ++ device_create(cmem_class, NULL, MKDEV(cmem_major, 0), NULL, "cmem"); ++#else + device_create(cmem_class, NULL, MKDEV(cmem_major, 0), "cmem"); ++#endif // LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,27) + #endif // USE_CLASS_DEVICE + #endif // USE_CLASS_SIMPLE + #endif // USE_UDEV diff --git a/packages/dsplink/files/do-not-panic-on-mixer-failure.patch b/packages/dsplink/files/do-not-panic-on-mixer-failure.patch new file mode 100644 index 0000000000..20e1aece72 --- /dev/null +++ b/packages/dsplink/files/do-not-panic-on-mixer-failure.patch @@ -0,0 +1,31 @@ +Index: dmai_1_20_00_06/packages/ti/sdo/dmai/linux/Sound_alsa.c +=================================================================== +--- dmai_1_20_00_06.orig/packages/ti/sdo/dmai/linux/Sound_alsa.c 2009-02-11 19:19:23.000000000 -0600 ++++ dmai_1_20_00_06/packages/ti/sdo/dmai/linux/Sound_alsa.c 2009-02-11 19:19:25.000000000 -0600 +@@ -139,7 +139,7 @@ + + snd_mixer_selem_id_free (sid); + snd_mixer_close (rcMixer); +- ++ + return Dmai_EOK; + } + +@@ -431,14 +431,13 @@ + Sound_alsa_delete(hSound); + return NULL; + } +- ++ + if (setMixerVolume (attrs) <0) { +- Sound_alsa_delete (hSound); +- return NULL; ++ Dmai_dbg2("Failed to set the mixer volume on %s (%s)\n", ++ AUDIO_DEVICE, snd_strerror(status)); + } + } + +- + return hSound; + } + diff --git a/packages/dsplink/files/dsplink-semaphore-27.patch b/packages/dsplink/files/dsplink-semaphore-27.patch new file mode 100644 index 0000000000..b2f71169fd --- /dev/null +++ b/packages/dsplink/files/dsplink-semaphore-27.patch @@ -0,0 +1,36 @@ +diff -uNr codec_engine_2_21/cetools/packages/dsplink/gpp/src/osal/Linux/2.6.18/sync.c codec_engine_2_21_fix/cetools/packages/dsplink/gpp/src/osal/Linux/2.6.18/sync.c +--- codec_engine_2_21/cetools/packages/dsplink/gpp/src/osal/Linux/2.6.18/sync.c 2008-12-19 16:27:19.000000000 +0530 ++++ codec_engine_2_21_mod/cetools/packages/dsplink/gpp/src/osal/Linux/2.6.18/sync.c 2009-02-12 10:08:48.000000000 +0530 +@@ -30,9 +30,14 @@ +
+
+ /* ----------------------------------- OS Specific Headers */
++#include <linux/version.h>
+ #include <linux/autoconf.h>
+ #include <linux/spinlock.h>
++#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,27)
+ #include <asm/semaphore.h>
++#else
++#include <linux/semaphore.h>
++#endif
+ #include <linux/timer.h>
+ #include <linux/sched.h>
+ #include <linux/delay.h>
+diff -uNr codec_engine_2_21/cetools/packages/dsplink/gpp/src/osal/Linux/user.c codec_engine_2_21_fix/cetools/packages/dsplink_mod/gpp/src/osal/Linux/user.c +--- codec_engine_2_21/cetools/packages/dsplink/gpp/src/osal/Linux/user.c 2008-12-19 16:27:19.000000000 +0530 ++++ codec_engine_2_21_fix/cetools/packages/dsplink_mod/gpp/src/osal/Linux/user.c 2009-02-12 10:08:05.000000000 +0530 +@@ -30,9 +30,14 @@ +
+
+ /* ----------------------------------- OS Specific Headers */
++#include <linux/version.h>
+ #include <linux/autoconf.h>
+ #include <linux/spinlock.h>
++#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,27)
+ #include <asm/semaphore.h>
++#else
++#include <linux/semaphore.h>
++#endif
+ #include <linux/timer.h>
+ #include <linux/sched.h>
+ #include <linux/delay.h>
diff --git a/packages/dsplink/files/lpm-device-create-and-semaphore-include-fix.patch b/packages/dsplink/files/lpm-device-create-and-semaphore-include-fix.patch new file mode 100644 index 0000000000..a3bc2b14a6 --- /dev/null +++ b/packages/dsplink/files/lpm-device-create-and-semaphore-include-fix.patch @@ -0,0 +1,121 @@ +diff -uNr codec_engine_2_21/cetools/packages/ti/bios/power/modules/omap3530/lpm/lpm_driver.c codec_engine_2_21_fix/cetools/packages/ti/bios/power/modules/omap3530/lpm/lpm_driver.c +--- codec_engine_2_21/cetools/packages/ti/bios/power/modules/omap3530/lpm/lpm_driver.c 2008-11-05 00:18:39.000000000 +0000 ++++ codec_engine_2_21_fix/cetools/packages/ti/bios/power/modules/omap3530/lpm/lpm_driver.c 2009-02-13 00:16:50.000000000 +0000 +@@ -225,6 +225,9 @@ + .os_wait = lpm_os_wait, + .os_trace = lpm_os_trace, + }; ++#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,27) ++ char lpm_tempDeviceCreateName[50]; ++#endif + + TRACE(KERN_ALERT "lpm.ko: + lpm_init\n"); + +@@ -286,9 +289,16 @@ + MKDEV(lpm->inst[i].major, lpm->inst[i].minor), + NULL, "lpm%d", lpm->inst[i].minor); + #else ++#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,27) ++ sprintf(lpm_tempDeviceCreateName, "lpm%d", lpm->inst[i].minor); ++ device_create(lpm->lpm_class, NULL, ++ MKDEV(lpm->inst[i].major, lpm->inst[i].minor), ++ NULL, lpm_tempDeviceCreateName); ++#else + device_create(lpm->lpm_class, NULL, + MKDEV(lpm->inst[i].major, lpm->inst[i].minor), + "lpm%d", lpm->inst[i].minor); ++#endif /* LINUX_VERSION */ + #endif + } + +diff -uNr codec_engine_2_21/cetools/packages/ti/bios/power/modules/omap2530/lpm/lpm_driver.c codec_engine_2_21_fix/cetools/packages/ti/bios/power/modules/omap2530/lpm/lpm_driver.c +--- codec_engine_2_21/cetools/packages/ti/bios/power/modules/omap2530/lpm/lpm_driver.c 2008-11-05 00:18:39.000000000 +0000 ++++ codec_engine_2_21_fix/cetools/packages/ti/bios/power/modules/omap2530/lpm/lpm_driver.c 2009-02-13 00:16:50.000000000 +0000 +@@ -225,6 +225,9 @@ + .os_wait = lpm_os_wait, + .os_trace = lpm_os_trace, + }; ++#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,27) ++ char lpm_tempDeviceCreateName[50]; ++#endif + + TRACE(KERN_ALERT "lpm.ko: + lpm_init\n"); + +@@ -286,9 +289,16 @@ + MKDEV(lpm->inst[i].major, lpm->inst[i].minor), + NULL, "lpm%d", lpm->inst[i].minor); + #else ++#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,27) ++ sprintf(lpm_tempDeviceCreateName, "lpm%d", lpm->inst[i].minor); ++ device_create(lpm->lpm_class, NULL, ++ MKDEV(lpm->inst[i].major, lpm->inst[i].minor), ++ NULL, lpm_tempDeviceCreateName); ++#else + device_create(lpm->lpm_class, NULL, + MKDEV(lpm->inst[i].major, lpm->inst[i].minor), + "lpm%d", lpm->inst[i].minor); ++#endif /* LINUX_VERSION */ + #endif + } + +diff -uNr codec_engine_2_21/cetools/packages/ti/bios/power/modules/dm357/lpm/lpm_driver.c codec_engine_2_21_fix/cetools/packages/ti/bios/power/modules/dm357/lpm/lpm_driver.c +--- codec_engine_2_21/cetools/packages/ti/bios/power/modules/dm357/lpm/lpm_driver.c 2008-11-05 00:18:39.000000000 +0000 ++++ codec_engine_2_21_fix/cetools/packages/ti/bios/power/modules/dm357/lpm/lpm_driver.c 2009-02-13 00:16:50.000000000 +0000 +@@ -225,6 +225,9 @@ + .os_wait = lpm_os_wait, + .os_trace = lpm_os_trace, + }; ++#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,27) ++ char lpm_tempDeviceCreateName[50]; ++#endif + + TRACE(KERN_ALERT "lpm.ko: + lpm_init\n"); + +@@ -286,9 +289,16 @@ + MKDEV(lpm->inst[i].major, lpm->inst[i].minor), + NULL, "lpm%d", lpm->inst[i].minor); + #else ++#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,27) ++ sprintf(lpm_tempDeviceCreateName, "lpm%d", lpm->inst[i].minor); ++ device_create(lpm->lpm_class, NULL, ++ MKDEV(lpm->inst[i].major, lpm->inst[i].minor), ++ NULL, lpm_tempDeviceCreateName); ++#else + device_create(lpm->lpm_class, NULL, + MKDEV(lpm->inst[i].major, lpm->inst[i].minor), + "lpm%d", lpm->inst[i].minor); ++#endif /* LINUX_VERSION */ + #endif + } + +diff -uNr codec_engine_2_21/cetools/packages/ti/bios/power/modules/dm6446/lpm/lpm_driver.c codec_engine_2_21_fix/cetools/packages/ti/bios/power/modules/dm6446/lpm/lpm_driver.c +--- codec_engine_2_21/cetools/packages/ti/bios/power/modules/dm6446/lpm/lpm_driver.c 2008-11-05 00:18:39.000000000 +0000 ++++ codec_engine_2_21_fix/cetools/packages/ti/bios/power/modules/dm6446/lpm/lpm_driver.c 2009-02-13 00:16:50.000000000 +0000 +@@ -225,6 +225,9 @@ + .os_wait = lpm_os_wait, + .os_trace = lpm_os_trace, + }; ++#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,27) ++ char lpm_tempDeviceCreateName[50]; ++#endif + + TRACE(KERN_ALERT "lpm.ko: + lpm_init\n"); + +@@ -286,9 +289,16 @@ + MKDEV(lpm->inst[i].major, lpm->inst[i].minor), + NULL, "lpm%d", lpm->inst[i].minor); + #else ++#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,27) ++ sprintf(lpm_tempDeviceCreateName, "lpm%d", lpm->inst[i].minor); ++ device_create(lpm->lpm_class, NULL, ++ MKDEV(lpm->inst[i].major, lpm->inst[i].minor), ++ NULL, lpm_tempDeviceCreateName); ++#else + device_create(lpm->lpm_class, NULL, + MKDEV(lpm->inst[i].major, lpm->inst[i].minor), + "lpm%d", lpm->inst[i].minor); ++#endif /* LINUX_VERSION */ + #endif + } + + diff --git a/packages/dsplink/files/support-32bit-align.patch b/packages/dsplink/files/support-32bit-align.patch new file mode 100644 index 0000000000..0ee817d9d9 --- /dev/null +++ b/packages/dsplink/files/support-32bit-align.patch @@ -0,0 +1,17 @@ +Index: dmai_1_20_00_06/packages/ti/sdo/dmai/linux/omap3530/Resize.c +=================================================================== +--- dmai_1_20_00_06.orig/packages/ti/sdo/dmai/linux/omap3530/Resize.c 2009-02-11 19:20:45.000000000 -0600 ++++ dmai_1_20_00_06/packages/ti/sdo/dmai/linux/omap3530/Resize.c 2009-02-11 19:21:09.000000000 -0600 +@@ -557,9 +557,9 @@ + srcOffset = srcDim.y * srcDim.lineLength + srcDim.x * 2; + dstOffset = dstDim.y * dstDim.lineLength + dstDim.x * 2; + +- /* Input and output buffers must be 4096 bytes aligned */ +- assert(((Buffer_getPhysicalPtr(hDstBuf) + srcOffset) & 0xFFF) == 0); +- assert(((Buffer_getPhysicalPtr(hSrcBuf) + dstOffset) & 0xFFF) == 0); ++ /* Pointers must be a multiple of 32 bytes */ ++ assert((Buffer_getPhysicalPtr(hDstBuf) & 0x1F) == 0); ++ assert((Buffer_getPhysicalPtr(hSrcBuf) & 0x1F) == 0); + + /* Queue the resizer buffers */ + for (i=0; i < 2; i++) { diff --git a/packages/dsplink/files/update-cpu-name.patch b/packages/dsplink/files/update-cpu-name.patch new file mode 100644 index 0000000000..052a8e3236 --- /dev/null +++ b/packages/dsplink/files/update-cpu-name.patch @@ -0,0 +1,16 @@ +Index: dmai_1_20_00_06/packages/ti/sdo/dmai/linux/Cpu.c +=================================================================== +--- dmai_1_20_00_06.orig/packages/ti/sdo/dmai/linux/Cpu.c 2009-02-12 09:34:22.000000000 -0600 ++++ dmai_1_20_00_06/packages/ti/sdo/dmai/linux/Cpu.c 2009-02-12 09:34:51.000000000 -0600 +@@ -103,7 +103,10 @@ + else if (strcmp(valBuf, "DM357 EVM") == 0) { + *device = Cpu_Device_DM6446; + } +- else if (strcmp(valBuf, "OMAP3EVM Board") == 0) { ++ else if ((strcmp(valBuf, "OMAP3EVM Board") == 0) || ++ (strcmp(valBuf, "OMAP3 EVM") == 0) || ++ (strcmp(valBuf, "OMAP3 Beagle Board") == 0) ++ ){ + *device = Cpu_Device_OMAP3530; + } + else { diff --git a/packages/dsplink/files/update-fb-display.patch b/packages/dsplink/files/update-fb-display.patch new file mode 100644 index 0000000000..91c1dd15aa --- /dev/null +++ b/packages/dsplink/files/update-fb-display.patch @@ -0,0 +1,77 @@ +Index: dmai_1_20_00_06/packages/ti/sdo/dmai/linux/Display_fbdev.c +=================================================================== +--- dmai_1_20_00_06.orig/packages/ti/sdo/dmai/linux/Display_fbdev.c 2009-02-11 19:59:57.000000000 -0600 ++++ dmai_1_20_00_06/packages/ti/sdo/dmai/linux/Display_fbdev.c 2009-02-11 20:02:46.000000000 -0600 +@@ -41,10 +41,7 @@ + #include <sys/ioctl.h> + #include <linux/fb.h> + +-#ifdef Dmai_Device_omap3530 +-/* OMAP specific kernel headers */ +-#include <video/omapfbdev.h> +-#else ++#ifndef Dmai_Device_omap3530 + /* Davinci specific kernel headers */ + #include <video/davincifb_ioctl.h> + #endif +@@ -184,11 +181,13 @@ + } + #endif + ++#if 0 + /* Set up the sysfs variables before opening the display device */ + if (_Display_sysfsSetup(attrs, channel) < 0) { + cleanup(hDisplay); + return NULL; + } ++#endif + + /* Open video display device */ + hDisplay->fd = open(attrs->displayDevice, O_RDWR); +@@ -423,6 +422,7 @@ + ******************************************************************************/ + Int Display_fbdev_get(Display_Handle hDisplay, Buffer_Handle *hBufPtr) + { ++#if defined (FBIO_WAITFORVSYNC) + BufTab_Handle hBufTab = hDisplay->hBufTab; + int dummy; + +@@ -436,7 +436,8 @@ + } + + *hBufPtr = BufTab_getBuf(hBufTab, hDisplay->workingIdx); +- ++ ++#endif + return Dmai_EOK; + } + +Index: dmai_1_20_00_06/packages/ti/sdo/dmai/linux/Display.c +=================================================================== +--- dmai_1_20_00_06.orig/packages/ti/sdo/dmai/linux/Display.c 2009-02-11 20:00:10.000000000 -0600 ++++ dmai_1_20_00_06/packages/ti/sdo/dmai/linux/Display.c 2009-02-11 20:02:07.000000000 -0600 +@@ -80,18 +80,18 @@ + + const Display_Attrs Display_Attrs_O3530_VID_DEFAULT = { + 3, +- Display_Std_V4L2, +- VideoStd_VGA, +- Display_Output_LCD, +- "/dev/video1", ++ Display_Std_FBDEV, ++ VideoStd_D1_NTSC, ++ Display_Output_DVI, ++ "/dev/fb2", + 0 + }; + + const Display_Attrs Display_Attrs_O3530_OSD_DEFAULT = { + 1, + Display_Std_FBDEV, +- VideoStd_VGA, +- Display_Output_LCD, ++ VideoStd_D1_NTSC, ++ Display_Output_DVI, + "/dev/fb0", + 0 + }; diff --git a/packages/dsplink/files/update-v4l2-display.patch b/packages/dsplink/files/update-v4l2-display.patch new file mode 100644 index 0000000000..8bb77d8473 --- /dev/null +++ b/packages/dsplink/files/update-v4l2-display.patch @@ -0,0 +1,127 @@ +Index: dmai_1_20_00_06/packages/ti/sdo/dmai/linux/Display_v4l2.c +=================================================================== +--- dmai_1_20_00_06.orig/packages/ti/sdo/dmai/linux/Display_v4l2.c 2009-02-11 19:22:51.000000000 -0600 ++++ dmai_1_20_00_06/packages/ti/sdo/dmai/linux/Display_v4l2.c 2009-02-11 19:27:02.000000000 -0600 +@@ -120,7 +120,9 @@ + struct v4l2_format fmt; + enum v4l2_buf_type type; + Display_Handle hDisplay; +- Int channel; ++#if defined(Dmai_Device_omap3530) && defined(V4L2_CID_ROTATION) ++ struct v4l2_control control; ++#endif + + assert(attrs); + +@@ -134,44 +136,6 @@ + + hDisplay->userAlloc = TRUE; + +-#ifdef Dmai_Device_omap3530 +- /* channel = 0 - digital video path +- * channel = 1 - analog video path +- */ +- switch (attrs->videoOutput) { +- case Display_Output_SVIDEO: +- case Display_Output_COMPOSITE: +- channel = 1; +- break; +- case Display_Output_DVI: +- case Display_Output_LCD: +- case Display_Output_SYSTEM: +- channel = 0; +- break; +- default: +- /* do nothing */ +- break; +- } +-#else +- if (strcmp(attrs->displayDevice, "/dev/video2") == 0) { +- channel = 0; +- } +- else if (strcmp(attrs->displayDevice, "/dev/video3") == 0) { +- channel = 1; +- } +- else { +- Dmai_err1("%s not a display device\n", attrs->displayDevice); +- cleanup(hDisplay); +- return NULL; +- } +-#endif +- +- /* Set up the sysfs variables before opening the display device */ +- if (_Display_sysfsSetup(attrs, channel) < 0) { +- cleanup(hDisplay); +- return NULL; +- } +- + /* Open video capture device */ + hDisplay->fd = open(attrs->displayDevice, O_RDWR, 0); + +@@ -182,9 +146,8 @@ + return NULL; + } + +-#ifdef Dmai_Device_omap3530 +-#define VIDIOC_S_OMAP2_ROTATION _IOW ('V', 3, int) +- ++ ++#if defined(Dmai_Device_omap3530) && defined(V4L2_CID_ROTATION) + if (attrs->rotation != 0 && attrs->rotation != 90 && + attrs->rotation != 180 && attrs->rotation != 270) { + +@@ -193,49 +156,16 @@ + return NULL; + } + +- if (ioctl(hDisplay->fd, VIDIOC_S_OMAP2_ROTATION, &attrs->rotation) < 0) { +- Dmai_err2("Failed VIDIOC_S_OMAP2_ROTATION on %s (%s)\n", ++ control.id = V4L2_CID_ROTATION; ++ control.value = attrs->rotation; ++ ++ if (ioctl(hDisplay->fd, VIDIOC_S_CTRL, &control) < 0) { ++ Dmai_err2("Failed VIDIOC_S_CTRL on %s (%s)\n", + attrs->displayDevice, strerror(errno)); + cleanup(hDisplay); + return NULL; + } + +- switch (attrs->videoStd) { +- case VideoStd_D1_NTSC: +- fmt.fmt.pix.width = VideoStd_D1_WIDTH; +- fmt.fmt.pix.height = VideoStd_D1_NTSC_HEIGHT; +- break; +- case VideoStd_D1_PAL: +- fmt.fmt.pix.width = VideoStd_D1_WIDTH; +- fmt.fmt.pix.height = VideoStd_D1_PAL_HEIGHT; +- break; +- case VideoStd_VGA: +- fmt.fmt.pix.width = VideoStd_VGA_WIDTH; +- fmt.fmt.pix.height = VideoStd_VGA_HEIGHT; +- break; +- case VideoStd_480P: +- fmt.fmt.pix.width = VideoStd_480P_WIDTH; +- fmt.fmt.pix.height = VideoStd_480P_HEIGHT; +- break; +- case VideoStd_720P_60: +- fmt.fmt.pix.width = VideoStd_480P_WIDTH; +- fmt.fmt.pix.height = VideoStd_480P_HEIGHT; +- break; +- default: +- Dmai_err1("Unknown video standard %d\n", attrs->videoStd); +- cleanup(hDisplay); +- return NULL; +- } +- +- fmt.fmt.pix.pixelformat = V4L2_PIX_FMT_UYVY; +- fmt.type = V4L2_BUF_TYPE_VIDEO_OUTPUT; +- +- if (ioctl(hDisplay->fd, VIDIOC_S_FMT, &fmt) == -1) { +- Dmai_err2("Failed VIDIOC_S_FMT on %s (%s)\n", attrs->displayDevice, +- strerror(errno)); +- cleanup(hDisplay); +- return NULL; +- } + #endif /* Dmai_Device_omap3530 */ + + /* Determine the video image dimensions */ diff --git a/packages/dsplink/gstreamer-ti_svn.bb b/packages/dsplink/gstreamer-ti_svn.bb index 9c22734dd5..c4be68c6b4 100644 --- a/packages/dsplink/gstreamer-ti_svn.bb +++ b/packages/dsplink/gstreamer-ti_svn.bb @@ -1,7 +1,7 @@ DEPENDS = "codec-engine dmai gstreamer gst-plugins-base gst-plugins-good gst-plugins-ugly libid3tag liboil libmad" SRC_URI = "svn://omapzoom.org/svn/gstreamer_ti/trunk;module=gstreamer_ti;proto=https" -SRCREV = "43" +SRCREV = "87" # Again, no '.' in PWD allowed :( PV = "0+svnr${SRCREV}" diff --git a/packages/dsplink/readme.txt b/packages/dsplink/readme.txt new file mode 100644 index 0000000000..f20be41d04 --- /dev/null +++ b/packages/dsplink/readme.txt @@ -0,0 +1,10 @@ +placeholder for readme + +todo with this package +- rename top level dsplink directory +- repartion code into different recipes - create codecengine-examples package +- fix lpm build to pick up Module.symversion +- cleanup device selection script - not good to just /d the targets - need cleaner solution +- staging needs work + +- add ce 2.22 diff --git a/packages/dsplink/ti-paths.inc b/packages/dsplink/ti-paths.inc index 188dd54072..eec3602ba5 100644 --- a/packages/dsplink/ti-paths.inc +++ b/packages/dsplink/ti-paths.inc @@ -22,6 +22,19 @@ export BIOS_INSTALL_DIR=${TITOOLSDIR}/${TIBIOSDIR} export CGTOOLS_V5T="${CROSS_DIR}" export CC_V5T="bin/${TARGET_PREFIX}gcc" export MVTOOL_PREFIX="${TARGET_PREFIX}" +export CE_INSTALL_DIR="${STAGING_DIR}/${MULTIMACH_TARGET_SYS}/codecengine/cetools" +export MVTOOL_DIR="${CROSS_DIR}" +export CSTOOL_DIR="${CROSS_DIR}" +export LINUXKERNEL_INSTALL_DIR=${STAGING_KERNEL_DIR} + + +# This tells codec engine which targets to build +DEVICES ?= "DM6446" +DEVICES_omap5912osk = "fixme-ti-paths.inc" +DEVICES_omap3evm = "OMAP3530" +DEVICES_beagleboard = "OMAP3530" +DEVICES_davinci-sffsdr = "DM6446" +DEVICES_davinci-dvevm = "DM6446" DSPLINKPLATFORM ?= "DAVINCI" DSPLINKPLATFORM_omap5912osk = "OMAP" @@ -51,6 +64,7 @@ GPPOS ?= "MVL5G" GPPOS_beagleboard = "OMAPLSP" GPPOS_omap3evm = "OMAPLSP" +export DEVICES export DSPLINKPLATFORM export DSPLINKDSP export DSPLINKSOC diff --git a/packages/euphony/euphony_0.1.2.bb b/packages/euphony/euphony_0.1.3.bb index 134a39dc5e..134a39dc5e 100644 --- a/packages/euphony/euphony_0.1.2.bb +++ b/packages/euphony/euphony_0.1.3.bb diff --git a/packages/evtest/evtest_1.23.bb b/packages/evtest/evtest_1.23.bb new file mode 100644 index 0000000000..4c5d195277 --- /dev/null +++ b/packages/evtest/evtest_1.23.bb @@ -0,0 +1,21 @@ +# Copyright (C) 2009 Khem Raj <raj.khem@gmail.com> +# Released under the MIT license (see COPYING.MIT for the terms) + +DESCRIPTION = "Event device test program" +AUTHOR = "Vojtech Pavlik <vojtech@suse.cz>" +SECTION = "console/utils" +PRIORITY = "optional" +LICENSE = "GPLv2" +PR = "r0" + +SRC_URI = "http://beagleboard.googlecode.com/files/evtest.c" +S = "${WORKDIR}" + +do_compile() { + ${CC} evtest.c -o evtest -I${STAGING_INCDIR} -L${STAGING_LIBDIR} +} + +do_install() { + install -d ${D}${bindir} + install -m 0755 evtest ${D}${bindir} +} diff --git a/packages/ezx/ezx-gen-blob_svn.bb b/packages/ezx/ezx-gen-blob_svn.bb new file mode 100644 index 0000000000..fb0def2c20 --- /dev/null +++ b/packages/ezx/ezx-gen-blob_svn.bb @@ -0,0 +1,37 @@ +DESCRIPTION = "Generic Blob [Bootloader] for the Motorola EZX platform" +SECTION = "bootloaders" +AUTHOR = "Daniel Riberio" +HOMEPAGE = "http://people.openezx.org/wyrm/gen-blob" +PRIORITY = "optional" +LICENSE = "GPL" +PROVIDES = "virtual/bootloader" +PV = "0.1.0+${SRCREV}" +PR = "r0" + +DEFAULT_PREFERENCE = "-1" + +inherit autotools + +SRC_URI = "svn://svn.openezx.org/trunk/src/blob/;module=gen-blob;proto=http" +S = "${WORKDIR}/gen-blob" + +do_deploy() { + dd if=${WORKDIR}/gen-blob bs=1k seek=2 conv=sync of=${WORKDIR}/gen-blob-a1200 + + install -d ${DEPLOY_DIR_IMAGE} + install -m 0644 gen-blob ${DEPLOY_DIR_IMAGE}/gen-blob-for-1stgen.${SRCDATE} + install -m 0644 gen-blob-a1200 ${DEPLOY_DIR_IMAGE}/gen-blob-for-2ndgen.${SRCDATE} +} + +do_install() { + dd if=${WORKDIR}/gen-blob bs=1k seek=2 conv=sync of=${WORKDIR}/gen-blob-a1200 + + install -d ${D}/${datadir}/openezx + install -m 0644 gen-blob ${D}${datadir}/openezx/gen-blob-for-1stgen.${SRCDATE} + install -m 0644 gen-blob-a1200 ${D}${datadir}/openezx/gen-blob-for-2ndgen.${SRCDATE} +} + +addtask deploy before do_build after do_compile + +PACKAGE_ARCH = "${MACHINE_ARCH}" +FILES_${PN} = "${datadir}" diff --git a/packages/freesmartphone/fso-abyss/abyss.conf b/packages/freesmartphone/fso-abyss/abyss.conf new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/packages/freesmartphone/fso-abyss/abyss.conf diff --git a/packages/freesmartphone/fso-abyss/om-gta01/abyss.conf b/packages/freesmartphone/fso-abyss/om-gta01/abyss.conf new file mode 100644 index 0000000000..2ff579d730 --- /dev/null +++ b/packages/freesmartphone/fso-abyss/om-gta01/abyss.conf @@ -0,0 +1,16 @@ +[omuxerd] +# set to 1, when the first AllocChannel request opens a session +autoopen = 1 +# set to 1, when the last ReleaseChannel closes the session +autoclose = 1 +# set to 1, when closing the session should close the program +autoexit = 1 + +[session] +# set 0 for 07.10 basic multiplexing, 1 for advanced +mode = 1 +# set maximum 07.10 frame size +framesize = 98 +# configure modem port +port = /dev/ttySAC0 +speed = 115200 diff --git a/packages/freesmartphone/fso-abyss/om-gta02/abyss.conf b/packages/freesmartphone/fso-abyss/om-gta02/abyss.conf new file mode 100644 index 0000000000..2ff579d730 --- /dev/null +++ b/packages/freesmartphone/fso-abyss/om-gta02/abyss.conf @@ -0,0 +1,16 @@ +[omuxerd] +# set to 1, when the first AllocChannel request opens a session +autoopen = 1 +# set to 1, when the last ReleaseChannel closes the session +autoclose = 1 +# set to 1, when closing the session should close the program +autoexit = 1 + +[session] +# set 0 for 07.10 basic multiplexing, 1 for advanced +mode = 1 +# set maximum 07.10 frame size +framesize = 98 +# configure modem port +port = /dev/ttySAC0 +speed = 115200 diff --git a/packages/freesmartphone/fso-abyss/om-gta03/abyss.conf b/packages/freesmartphone/fso-abyss/om-gta03/abyss.conf new file mode 100644 index 0000000000..1764c5b798 --- /dev/null +++ b/packages/freesmartphone/fso-abyss/om-gta03/abyss.conf @@ -0,0 +1,16 @@ +[omuxerd] +# set to 1, when the first AllocChannel request opens a session +autoopen = 1 +# set to 1, when the last ReleaseChannel closes the session +autoclose = 1 +# set to 1, when closing the session should close the program +autoexit = 1 + +[session] +# set 0 for 07.10 basic multiplexing, 1 for advanced +mode = 0 +# set maximum 07.10 frame size +framesize = 98 +# configure modem port +port = /dev/ttySAC0 +speed = 115200 diff --git a/packages/freesmartphone/fso-abyss_git.bb b/packages/freesmartphone/fso-abyss_git.bb index 471f404fc1..3cfff7dc9a 100644 --- a/packages/freesmartphone/fso-abyss_git.bb +++ b/packages/freesmartphone/fso-abyss_git.bb @@ -2,17 +2,35 @@ DESCRIPTION = "Abyss is a GSM 07.10 muxer userspace daemon" HOMEPAGE = "http://www.freesmartphone.org/mediawiki/index.php/Implementations/Abyss" AUTHOR = "Michael 'Mickey' Lauer <mlauer@vanille-media.de>" SECTION = "console/network" -DEPENDS = "vala-native dbus dbus-glib libgee" +DEPENDS = "vala-native dbus dbus-glib libgsm0710" LICENSE = "GPL" -PV = "0.2.0+gitr${SRCREV}" +PV = "0.3.0+gitr${SRCREV}" PR = "r0" -SRC_URI = "${FREESMARTPHONE_GIT}/fso-abyss.git;protocol=git;branch=master" +SRC_URI = "\ + ${FREESMARTPHONE_GIT}/fso-abyss.git;protocol=git;branch=master \ + file://abyss.conf \ +" S = "${WORKDIR}/git" inherit autotools -RDEPENDS = "dbus dbus-glib" -RCONFLICTS = "gsm0710muxd fso-gsm0710muxd" +do_install_append() { + install -d ${D}${sysconfdir} + install -m 0644 ${WORKDIR}/abyss.conf ${D}${sysconfdir}/ +} -FILES_${PN} += "${datadir} ${sysconfdir}" +PACKAGES =+ "${PN}-config" + +FILES_${PN} += "${sysconfdir} ${datadir}" +RRECOMMENDS_${PN} = "${PN}-config" + +FILES_${PN}-config = "\ + ${sysconfdir}/abyss.conf \ +" + +CONFFILES_${PN}-config = "\ + ${sysconfdir}/abyss.conf \ +" + +PACKAGE_ARCH_${PN} = "${BASE_PACKAGE_ARCH}" diff --git a/packages/freesmartphone/libframeworkd-glib_git.bb b/packages/freesmartphone/libframeworkd-glib_git.bb index bce8312fcb..79e040ed35 100644 --- a/packages/freesmartphone/libframeworkd-glib_git.bb +++ b/packages/freesmartphone/libframeworkd-glib_git.bb @@ -2,15 +2,10 @@ DESCRIPTION = "freesmartphone.org API glib wrapper" LICENSE = "LGPL" SECTION = "devel" DEPENDS = "dbus-glib" -PV = "0.0.1+gitr${SRCREV}" +PV = "0.0.2+gitr${SRCREV}" PR = "r0" SRC_URI = "${FREESMARTPHONE_GIT}/libframeworkd-glib.git;protocol=git;branch=master" S = "${WORKDIR}/git" -inherit autotools pkgconfig - -do_stage() { - autotools_stage_all -} - +inherit autotools autotools_stage pkgconfig diff --git a/packages/freesmartphone/libgsm0710_git.bb b/packages/freesmartphone/libgsm0710_git.bb new file mode 100644 index 0000000000..bc4e59ea34 --- /dev/null +++ b/packages/freesmartphone/libgsm0710_git.bb @@ -0,0 +1,14 @@ +DESCRIPTION = "A GSM 07.10 Protocol Engine" +LICENSE = "GPL" +SECTION = "devel" +PV = "1.0.0+gitr${SRCREV}" +PR = "r0" + +SRC_URI = "${FREESMARTPHONE_GIT}/libgsm0710.git;protocol=git;branch=master" +S = "${WORKDIR}/git" + +inherit autotools autotools_stage pkgconfig + +# ship vapi file +FILES_${PN}-dev += "${datadir}/vala" + diff --git a/packages/fuse/sshfs-fuse_2.2.bb b/packages/fuse/sshfs-fuse_2.2.bb new file mode 100644 index 0000000000..0ca2e132bc --- /dev/null +++ b/packages/fuse/sshfs-fuse_2.2.bb @@ -0,0 +1,15 @@ +DESCRIPTION = "This is a filesystem client based on the SSH File Transfer Protocol using FUSE." +AUTHOR = "Miklos Szeredi <miklos@szeredi.hu>" +HOMEPAGE = "http://fuse.sourceforge.net/sshfs.html" +SECTION = "console/network" +PRIORITY = "optional" +LICENSE = "GPLv2" +DEPENDS = "glib-2.0 fuse" +PR = "r0" + +SRC_URI = "${SOURCEFORGE_MIRROR}/fuse/${P}.tar.gz" +S = "${WORKDIR}/${P}" + +inherit autotools + +FILES_${PN} += "${libdir}/sshnodelay.so" diff --git a/packages/gcc/gcc-common.inc b/packages/gcc/gcc-common.inc index 73bc327507..9e70af71a5 100644 --- a/packages/gcc/gcc-common.inc +++ b/packages/gcc/gcc-common.inc @@ -7,8 +7,11 @@ inherit autotools gettext FILESDIR = "${@os.path.dirname(bb.data.getVar('FILE',d,1))}/gcc-${PV}" +# When making a Canadian SDK, we use these files too to make the compiler +# for building for the new host part. So only obey TARGET_FPU for the +# real target. def get_gcc_fpu_setting(bb, d): - if bb.data.getVar('TARGET_FPU', d, 1) in [ 'soft' ]: + if bb.data.getVar('TARGET_FPU', d, 1) in [ 'soft' ] and bb.data.getVar('TARGET_OS', d, 1) in [ 'linux' ]: return "--with-float=soft" return "" diff --git a/packages/glibc/glibc-initial.inc b/packages/glibc/glibc-initial.inc index 143a662d52..5528cf8edb 100644 --- a/packages/glibc/glibc-initial.inc +++ b/packages/glibc/glibc-initial.inc @@ -1,7 +1,7 @@ SECTION = "libs" DEPENDS = "virtual/${TARGET_PREFIX}gcc-initial linux-libc-headers" PROVIDES = "virtual/${TARGET_PREFIX}libc-initial" -FILESPATH = "${@base_set_filespath([ '${FILE_DIRNAME}/glibc-2.4', '${FILE_DIRNAME}/glibc', '${FILE_DIRNAME}/files', '${FILE_DIRNAME}' ], d)}" +FILESPATH = "${@base_set_filespath([ '${FILE_DIRNAME}/glibc-2.4', '${FILE_DIRNAME}/glibc-${PV}', '${FILE_DIRNAME}/glibc', '${FILE_DIRNAME}/files', '${FILE_DIRNAME}' ], d)}" PACKAGES = "" PACKAGES_DYNAMIC = "" diff --git a/packages/glibc/glibc-initial_2.7.bb b/packages/glibc/glibc-initial_2.7.bb new file mode 100644 index 0000000000..d66297090f --- /dev/null +++ b/packages/glibc/glibc-initial_2.7.bb @@ -0,0 +1,6 @@ +require glibc_${PV}.bb +require glibc-initial.inc + +do_configure_prepend () { + unset CFLAGS +} diff --git a/packages/glibc/glibc_2.7.bb b/packages/glibc/glibc_2.7.bb index 3349ce5eef..ec4b347713 100644 --- a/packages/glibc/glibc_2.7.bb +++ b/packages/glibc/glibc_2.7.bb @@ -5,7 +5,7 @@ ARM_INSTRUCTION_SET = "arm" PACKAGES_DYNAMIC = "libc6*" RPROVIDES_${PN}-dev = "libc6-dev virtual-libc-dev" -PR = "r8" +PR = "r9" # the -isystem in bitbake.conf screws up glibc do_stage BUILD_CPPFLAGS = "-I${STAGING_INCDIR_NATIVE}" @@ -60,12 +60,14 @@ SRC_URI = "ftp://ftp.gnu.org/pub/gnu/glibc/glibc-${PV}.tar.bz2 \ file://glibc-arm-IO-acquire-lock-fix.diff;patch=1 \ file://all_glibc-i586-chk.patch;patch=1 \ file://glibc-2.6.1-use-short-for-fnstsw.patch;patch=1 \ + file://glibc-use-isystem-include-fixed.patch;patch=1 \ file://generic-bits_select.h \ file://generic-bits_types.h \ file://generic-bits_typesizes.h \ file://generic-bits_time.h \ file://etc/ld.so.conf \ - file://generate-supported.mk" + file://generate-supported.mk \ + " # Build fails on sh3 and sh4 without additional patches diff --git a/packages/images/jlime-opie.bb b/packages/images/jlime-opie.bb index 7d98f98a32..bb9ad73f20 100644 --- a/packages/images/jlime-opie.bb +++ b/packages/images/jlime-opie.bb @@ -1,10 +1,11 @@ +PR = "r1" IMAGE_LINGUAS = "" -DEPENDS = "task-bootstrap task-opie" +DEPENDS = "task-base task-opie" extra_stuff = '${@base_conditional("ROOT_FLASH_SIZE", "24", "", "task-opie-extra-games task-opie-extra-apps task-opie-extra-styles konqueror-embedded",d)}' -IMAGE_INSTALL = "task-bootstrap task-opie-base task-opie-base-applets \ +IMAGE_INSTALL = "task-base task-opie-base task-opie-base-applets \ task-opie-base-inputmethods task-opie-base-apps \ task-opie-base-settings task-opie-base-decorations \ task-opie-base-styles task-opie-base-pim \ diff --git a/packages/images/x11-gpe-image.bb b/packages/images/x11-gpe-image.bb index 86f4cd838c..7b272f60a1 100644 --- a/packages/images/x11-gpe-image.bb +++ b/packages/images/x11-gpe-image.bb @@ -1,7 +1,6 @@ #Angstrom X11 image, with apps and kernel modules included ANGSTROM_EXTRA_INSTALL += " \ - ${@base_contains("MACHINE_FEATURES", "phone", "openmoko-dialer2", "",d)} \ " XSERVER ?= "xserver-kdrive-fbdev" diff --git a/packages/images/x11-gpe-java-image.bb b/packages/images/x11-gpe-java-image.bb index 72b04ec2bc..fcc022c7a0 100644 --- a/packages/images/x11-gpe-java-image.bb +++ b/packages/images/x11-gpe-java-image.bb @@ -1,7 +1,6 @@ #Angstrom X11 image, with apps and kernel modules included ANGSTROM_EXTRA_INSTALL += " \ - ${@base_contains("MACHINE_FEATURES", "phone", "openmoko-dialer2", "",d)} \ " XSERVER ?= "xserver-kdrive-fbdev" diff --git a/packages/images/x11-office-image.bb b/packages/images/x11-office-image.bb index 47a8fae71f..48799d8998 100644 --- a/packages/images/x11-office-image.bb +++ b/packages/images/x11-office-image.bb @@ -1,7 +1,6 @@ #Angstrom X11 image, with apps and kernel modules included ANGSTROM_EXTRA_INSTALL += " \ - ${@base_contains("MACHINE_FEATURES", "phone", "openmoko-dialer2", "",d)} \ " XSERVER ?= "xserver-kdrive-fbdev" diff --git a/packages/images/x11-pimlico-image.bb b/packages/images/x11-pimlico-image.bb index 3c93bfbd1b..79dcacce6e 100644 --- a/packages/images/x11-pimlico-image.bb +++ b/packages/images/x11-pimlico-image.bb @@ -1,7 +1,6 @@ #Angstrom X11 image, with apps and kernel modules included ANGSTROM_EXTRA_INSTALL += " \ - ${@base_contains("MACHINE_FEATURES", "phone", "openmoko-dialer2", "",d)} \ " XSERVER ?= "xserver-kdrive-fbdev" diff --git a/packages/iscsi-target/files/2.6.29.patch b/packages/iscsi-target/files/2.6.29.patch new file mode 100644 index 0000000000..24c1afbdd1 --- /dev/null +++ b/packages/iscsi-target/files/2.6.29.patch @@ -0,0 +1,72 @@ +Index: iscsitarget-0.4.17/kernel/block-io.c +=================================================================== +--- iscsitarget-0.4.17/kernel/block-io.c (revision 198) ++++ iscsitarget-0.4.17/kernel/block-io.c (working copy) +@@ -13,6 +13,7 @@ + #include <linux/blkdev.h> + #include <linux/parser.h> + #include <linux/buffer_head.h> ++#include <linux/version.h> + + #include "iscsi.h" + #include "iscsi_dbg.h" +@@ -154,14 +155,22 @@ + { + struct blockio_data *bio_data = volume->private; + struct block_device *bdev; ++#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,29) + int flags = LUReadonly(volume) ? MS_RDONLY : 0; ++#else ++ fmode_t flags = LUReadonly(volume) ? FMODE_READ : (FMODE_READ | FMODE_WRITE); ++#endif + int err = 0; + + bio_data->path = kstrdup(path, GFP_KERNEL); + if (!bio_data->path) + return -ENOMEM; + ++#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,29) + bdev = open_bdev_excl(path, flags, THIS_MODULE); ++#else ++ bdev = open_bdev_exclusive(path, flags, THIS_MODULE); ++#endif + if (IS_ERR(bdev)) { + err = PTR_ERR(bdev); + eprintk("Can't open device %s, error %d\n", path, err); +@@ -324,8 +333,17 @@ + { + struct blockio_data *bio_data = volume->private; + +- if (bio_data->bdev) ++ if (bio_data->bdev) { ++#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,29) + close_bdev_excl(bio_data->bdev); ++#else ++ if (LUReadonly(volume)) { ++ close_bdev_exclusive(bio_data->bdev, FMODE_READ); ++ } else { ++ close_bdev_exclusive(bio_data->bdev, FMODE_READ|FMODE_WRITE); ++ } ++#endif ++ } + kfree(bio_data->path); + + kfree(volume->private); +Index: iscsitarget-0.4.17/kernel/conn.c +=================================================================== +--- iscsitarget-0.4.17/kernel/conn.c (revision 198) ++++ iscsitarget-0.4.17/kernel/conn.c (working copy) +@@ -46,9 +46,13 @@ + "%u.%u.%u.%u", NIPQUAD(inet_sk(sk)->daddr)); + break; + case AF_INET6: ++#ifdef NIP6 + snprintf(buf, sizeof(buf), + "[%04x:%04x:%04x:%04x:%04x:%04x:%04x:%04x]", + NIP6(inet6_sk(sk)->daddr)); ++#else ++ snprintf(buf, sizeof(buf), "[%p6]", &inet6_sk(sk)->daddr); ++#endif + break; + default: + break; diff --git a/packages/iscsi-target/iscsi-target_0.4.17.bb b/packages/iscsi-target/iscsi-target_0.4.17.bb index deb09022d4..07cbee90df 100644 --- a/packages/iscsi-target/iscsi-target_0.4.17.bb +++ b/packages/iscsi-target/iscsi-target_0.4.17.bb @@ -1,10 +1,11 @@ DESCRIPTION = "iSCSI Enterprise Target is for building an iSCSI storage system on Linux" HOMEPAGE = "http://iscsitarget.sourceforge.net/" LICENSE = "GPL" -PR = "r1" +PR = "r2" SRC_URI = "${SOURCEFORGE_MIRROR}/iscsitarget/iscsitarget-${PV}.tar.gz \ file://libs.patch;patch=1 \ + file://2.6.29.patch;patch=1 \ file://ietd.conf \ file://init" S = "${WORKDIR}/iscsitarget-${PV}" diff --git a/packages/kaeilos/kaeilos-version.bb b/packages/kaeilos/kaeilos-version.bb new file mode 100644 index 0000000000..4600c41d4e --- /dev/null +++ b/packages/kaeilos/kaeilos-version.bb @@ -0,0 +1,18 @@ +LICENSE = "MIT" + +PV = "${DISTRO_VERSION}" +PR = "r2" +PE = "1" + +PACKAGES = "${PN}" +PACKAGE_ARCH = "${MACHINE_ARCH}" + +export METADATA_REVISION +export METADATA_BRANCH + +do_install() { + mkdir -p ${D}${sysconfdir} + echo "KaeilOS ${DISTRO_VERSION}" > ${D}${sysconfdir}/kaeilos-version + echo "Built from branch: ${METADATA_BRANCH}" >> ${D}${sysconfdir}/kaeilos-version + echo "Revision: ${METADATA_REVISION}" >> ${D}${sysconfdir}/kaeilos-version +} diff --git a/packages/kexecboot/kexecboot-cfg_0.1.bb b/packages/kexecboot/kexecboot-cfg_0.1.bb index 394e531760..d83f6529df 100644 --- a/packages/kexecboot/kexecboot-cfg_0.1.bb +++ b/packages/kexecboot/kexecboot-cfg_0.1.bb @@ -2,7 +2,7 @@ LICENSE = "GPL" SECTION = "base" DESCRIPTION = "Configuration file for kexecboot" -PR = "r1" +PR = "r2" PACKAGE_ARCH = "${MACHINE_ARCH}" CMDLINE_CON = "console=ttyS0,115200n8 console=tty1 noinitrd" @@ -11,7 +11,7 @@ CMDLINE_CON_qemuarm = "console=ttyAMA0,115200n8 console=tty1 noinitrd" CMDLINE_DEBUG = '${@base_conditional("DISTRO_TYPE", "release", "quiet", "debug",d)}' -CMDLINE_MEM_collie = "mem=${mem}M" +CMDLINE_MEM_collie = "mem=64M" CMDLINE_ROTATE_spitz = "fbcon=rotate:1" CMDLINE_ROTATE_akita = "fbcon=rotate:1" diff --git a/packages/libsmi/libsmi_0.4.8.bb b/packages/libsmi/libsmi_0.4.8.bb new file mode 100644 index 0000000000..6c832f3724 --- /dev/null +++ b/packages/libsmi/libsmi_0.4.8.bb @@ -0,0 +1,15 @@ +DESCRIPTION = "A Library to Access SMI MIB Information" +LICENSE = "BSD" +SRC_URI = "ftp://ftp.ibr.cs.tu-bs.de/pub/local/libsmi/libsmi-0.4.8.tar.gz" +PR = "r1" + +inherit autotools + +PACKAGES += "${PN}-mibs ${PN}-pibs" +FILES_${PN}-mibs += "${datadir}/mibs" +FILES_${PN}-pibs += "${datadir}/pibs" + +do_stage() { + autotools_stage_all +} + diff --git a/packages/libssh/files/libssh_libdir_fix.patch b/packages/libssh/files/libssh_libdir_fix.patch new file mode 100644 index 0000000000..a9fcce79e3 --- /dev/null +++ b/packages/libssh/files/libssh_libdir_fix.patch @@ -0,0 +1,13 @@ +diff -NurpP --minimal libssh-0.2/libssh/Makefile.in libssh-0.2-libdir/libssh/Makefile.in +--- libssh-0.2/libssh/Makefile.in 2006-12-29 23:03:59.000000000 +0800 ++++ libssh-0.2-libdir/libssh/Makefile.in 2008-10-13 10:04:13.000000000 +0800 +@@ -15,7 +15,7 @@ exec_prefix = @exec_prefix@ + bindir = $(exec_prefix)/bin + incldir= $(prefix)/include + infodir = $(prefix)/info +-libdir = $(prefix)/lib/ ++libdir = $(prefix)/lib + mandir = $(prefix)/man/man1 + + CC = @CC@ + diff --git a/packages/libssh/libssh_0.11.bb b/packages/libssh/libssh_0.11.bb index ab6949f409..833567ebb0 100644 --- a/packages/libssh/libssh_0.11.bb +++ b/packages/libssh/libssh_0.11.bb @@ -6,6 +6,8 @@ includes SFTP support, and a sample SSH client is provided." DEPENDS = "openssl" LICENSE = "LGPL" +DEFAULT_PREFERENCE="-1" + SRC_URI = "http://www.0xbadc0de.be/libssh/libssh-${PV}.tgz" inherit autotools diff --git a/packages/libssh/libssh_0.2.bb b/packages/libssh/libssh_0.2.bb new file mode 100644 index 0000000000..b776094018 --- /dev/null +++ b/packages/libssh/libssh_0.2.bb @@ -0,0 +1,28 @@ +# Released under the MIT license (see COPYING.MIT for the terms) + +DESCRIPTION = "The SSH library is a C library to authenticate in a \ +simple manner to one or more SSH servers. The goal of this project \ +is to provide a library much simpler to use than OpenSSHs one. It \ +includes SFTP support, and a sample SSH client is provided." + +HOMEPAGE = "http://0xbadc0de.be/wiki/libssh:libssh" +LICENSE = "LGPL" +SECTION = "libs" +DEPENDS = "openssl" +SRC_URI = "http://www.0xbadc0de.be/libssh/libssh-${PV}.tgz \ + file://libssh_libdir_fix.patch;patch=1 \ + " +inherit autotools + +EXTRA_OECONF = "--cache-file=${S}/config.cache" +do_compile () { + oenote make "$@" + make "$@" || die "oe_runmake failed" +} +do_stage () { + install -d ${STAGING_INCDIR}/libssh + for i in crypto.h libssh.h sftp.h ssh2.h; do + install -m 0644 ${S}/include/libssh/$i ${STAGING_INCDIR}/libssh/ + done + oe_libinstall -so -C libssh libssh ${STAGING_LIBDIR} +} diff --git a/packages/linux/at91_2.6.28.bb b/packages/linux/at91_2.6.28.bb deleted file mode 100644 index a24dad3ee5..0000000000 --- a/packages/linux/at91_2.6.28.bb +++ /dev/null @@ -1,36 +0,0 @@ -require linux.inc - -KERNEL_RELEASE = "2.6.28" -PV = "2.6.28" -PR = "r0" - -DEPENDS += "u-boot-utils-native" -DEPENDS += "ipkg-utils-native" - -S = "${WORKDIR}/linux-${KERNEL_RELEASE}" - -# Mark archs/machines that this kernel supports -DEFAULT_PREFERENCE = "-1" - -DEFAULT_PREFERENCE_at91sam9260ek = "1" -CMDLINE_at91sam9260ek = "mem=64M console=ttyS0,115200 root=/dev/mtdblock0 rw rootfstype=jffs2" -FILES_kernel-image_at91sam9260ek = "" - -DEFAULT_PREFERENCE_at91sam9261ek = "1" -CMDLINE_at91sam9261ek = "mem=64M console=ttyS0,115200 root=/dev/mtdblock0 rw rootfstype=jffs2" -FILES_kernel-image_at91sam9261ek = "" - -DEFAULT_PREFERENCE_at91sam9263ek = "1" -CMDLINE_at91sam9263ek = "mem=64M console=ttyS0,115200 root=/dev/mtdblock0 rw rootfstype=jffs2" -FILES_kernel-image_at91sam9263ek = "" - -DEFAULT_PREFERENCE_at91sam9g20ek = "1" -CMDLINE_at91sam9g20ek = "mem=64M console=ttyS0,115200 root=/dev/mtdblock0 rw rootfstype=jffs2" -FILES_kernel-image_at91sam9g20ek = "" - - -SRC_URI = "${KERNELORG_MIRROR}/pub/linux/kernel/v2.6/linux-${KERNEL_RELEASE}.tar.bz2 \ - file://linux-2.6.28-at91.patch.bz2;patch=1 \ - file://linux-2.6.28-exp.patch.bz2;patch=1 \ - file://defconfig \ - " diff --git a/packages/linux/linux-2.6.25.20/ronetix-pm9261/defconfig b/packages/linux/linux-2.6.25.20/ronetix-pm9261/defconfig new file mode 100644 index 0000000000..77cb9fafe5 --- /dev/null +++ b/packages/linux/linux-2.6.25.20/ronetix-pm9261/defconfig @@ -0,0 +1,1346 @@ +# +# Automatically generated make config: don't edit +# Linux kernel version: 2.6.25.20 +# Fri Jan 2 12:42:20 2009 +# +CONFIG_ARM=y +CONFIG_SYS_SUPPORTS_APM_EMULATION=y +CONFIG_GENERIC_GPIO=y +CONFIG_GENERIC_TIME=y +CONFIG_GENERIC_CLOCKEVENTS=y +CONFIG_MMU=y +# CONFIG_NO_IOPORT is not set +CONFIG_GENERIC_HARDIRQS=y +CONFIG_STACKTRACE_SUPPORT=y +CONFIG_LOCKDEP_SUPPORT=y +CONFIG_TRACE_IRQFLAGS_SUPPORT=y +CONFIG_HARDIRQS_SW_RESEND=y +CONFIG_GENERIC_IRQ_PROBE=y +CONFIG_RWSEM_GENERIC_SPINLOCK=y +# CONFIG_ARCH_HAS_ILOG2_U32 is not set +# CONFIG_ARCH_HAS_ILOG2_U64 is not set +CONFIG_GENERIC_HWEIGHT=y +CONFIG_GENERIC_CALIBRATE_DELAY=y +CONFIG_ARCH_SUPPORTS_AOUT=y +CONFIG_ZONE_DMA=y +CONFIG_VECTORS_BASE=0xffff0000 +CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" + +# +# General setup +# +CONFIG_EXPERIMENTAL=y +CONFIG_BROKEN_ON_SMP=y +CONFIG_INIT_ENV_ARG_LIMIT=32 +CONFIG_LOCALVERSION="-KaeilOS-PM9261" +# CONFIG_LOCALVERSION_AUTO is not set +# CONFIG_SWAP is not set +CONFIG_SYSVIPC=y +CONFIG_SYSVIPC_SYSCTL=y +# CONFIG_POSIX_MQUEUE is not set +# CONFIG_BSD_PROCESS_ACCT is not set +# CONFIG_TASKSTATS is not set +# CONFIG_AUDIT is not set +# CONFIG_IKCONFIG is not set +CONFIG_LOG_BUF_SHIFT=14 +# CONFIG_CGROUPS is not set +CONFIG_GROUP_SCHED=y +CONFIG_FAIR_GROUP_SCHED=y +# CONFIG_RT_GROUP_SCHED is not set +CONFIG_USER_SCHED=y +# CONFIG_CGROUP_SCHED is not set +CONFIG_SYSFS_DEPRECATED=y +CONFIG_SYSFS_DEPRECATED_V2=y +# CONFIG_RELAY is not set +CONFIG_NAMESPACES=y +# CONFIG_UTS_NS is not set +# CONFIG_IPC_NS is not set +# CONFIG_USER_NS is not set +# CONFIG_PID_NS is not set +CONFIG_BLK_DEV_INITRD=y +CONFIG_INITRAMFS_SOURCE="" +CONFIG_CC_OPTIMIZE_FOR_SIZE=y +CONFIG_SYSCTL=y +# CONFIG_EMBEDDED is not set +CONFIG_UID16=y +CONFIG_SYSCTL_SYSCALL=y +CONFIG_KALLSYMS=y +# CONFIG_KALLSYMS_ALL is not set +# CONFIG_KALLSYMS_EXTRA_PASS is not set +CONFIG_HOTPLUG=y +CONFIG_PRINTK=y +CONFIG_BUG=y +CONFIG_ELF_CORE=y +CONFIG_COMPAT_BRK=y +CONFIG_BASE_FULL=y +CONFIG_FUTEX=y +CONFIG_ANON_INODES=y +CONFIG_EPOLL=y +CONFIG_SIGNALFD=y +CONFIG_TIMERFD=y +CONFIG_EVENTFD=y +CONFIG_SHMEM=y +CONFIG_VM_EVENT_COUNTERS=y +CONFIG_SLAB=y +# CONFIG_SLUB is not set +# CONFIG_SLOB is not set +# CONFIG_PROFILING is not set +# CONFIG_MARKERS is not set +CONFIG_HAVE_OPROFILE=y +# CONFIG_KPROBES is not set +CONFIG_HAVE_KPROBES=y +CONFIG_HAVE_KRETPROBES=y +CONFIG_PROC_PAGE_MONITOR=y +CONFIG_SLABINFO=y +CONFIG_RT_MUTEXES=y +# CONFIG_TINY_SHMEM is not set +CONFIG_BASE_SMALL=0 +CONFIG_MODULES=y +CONFIG_MODULE_UNLOAD=y +# CONFIG_MODULE_FORCE_UNLOAD is not set +# CONFIG_MODVERSIONS is not set +# CONFIG_MODULE_SRCVERSION_ALL is not set +CONFIG_KMOD=y +CONFIG_BLOCK=y +# CONFIG_LBD is not set +# CONFIG_BLK_DEV_IO_TRACE is not set +# CONFIG_LSF is not set +# CONFIG_BLK_DEV_BSG is not set + +# +# IO Schedulers +# +CONFIG_IOSCHED_NOOP=y +CONFIG_IOSCHED_AS=y +# CONFIG_IOSCHED_DEADLINE is not set +# CONFIG_IOSCHED_CFQ is not set +CONFIG_DEFAULT_AS=y +# CONFIG_DEFAULT_DEADLINE is not set +# CONFIG_DEFAULT_CFQ is not set +# CONFIG_DEFAULT_NOOP is not set +CONFIG_DEFAULT_IOSCHED="anticipatory" +CONFIG_CLASSIC_RCU=y + +# +# System Type +# +# CONFIG_ARCH_AAEC2000 is not set +# CONFIG_ARCH_INTEGRATOR is not set +# CONFIG_ARCH_REALVIEW is not set +# CONFIG_ARCH_VERSATILE is not set +CONFIG_ARCH_AT91=y +# CONFIG_ARCH_CLPS7500 is not set +# CONFIG_ARCH_CLPS711X is not set +# CONFIG_ARCH_CO285 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_H720X is not set +# CONFIG_ARCH_IMX is not set +# CONFIG_ARCH_IOP13XX is not set +# CONFIG_ARCH_IOP32X is not set +# CONFIG_ARCH_IOP33X is not set +# CONFIG_ARCH_IXP23XX is not set +# CONFIG_ARCH_IXP2000 is not set +# CONFIG_ARCH_IXP4XX is not set +# CONFIG_ARCH_L7200 is not set +# CONFIG_ARCH_KS8695 is not set +# CONFIG_ARCH_NS9XXX is not set +# CONFIG_ARCH_MXC is not set +# CONFIG_ARCH_ORION is not set +# CONFIG_ARCH_PNX4008 is not set +# CONFIG_ARCH_PXA is not set +# CONFIG_ARCH_RPC is not set +# CONFIG_ARCH_SA1100 is not set +# CONFIG_ARCH_S3C2410 is not set +# CONFIG_ARCH_SHARK is not set +# CONFIG_ARCH_LH7A40X is not set +# CONFIG_ARCH_DAVINCI is not set +# CONFIG_ARCH_OMAP is not set +# CONFIG_ARCH_MSM7X00A is not set + +# +# Boot options +# + +# +# Power management +# + +# +# Atmel AT91 System-on-Chip +# +# CONFIG_ARCH_AT91RM9200 is not set +# CONFIG_ARCH_AT91SAM9260 is not set +CONFIG_ARCH_AT91SAM9261=y +# CONFIG_ARCH_AT91SAM9263 is not set +# CONFIG_ARCH_AT91SAM9RL is not set +# CONFIG_ARCH_AT91CAP9 is not set +# CONFIG_ARCH_AT91X40 is not set +CONFIG_AT91_PMC_UNIT=y + +# +# AT91SAM9261 Board Type +# +# CONFIG_MACH_AT91SAM9261EK is not set +CONFIG_MACH_PM9261=y + +# +# AT91 Board Options +# +# CONFIG_MTD_NAND_AT91_BUSWIDTH_16 is not set + +# +# AT91 Feature Selections +# +CONFIG_AT91_PROGRAMMABLE_CLOCKS=y +CONFIG_AT91_TIMER_HZ=100 +CONFIG_AT91_EARLY_DBGU=y +# CONFIG_AT91_EARLY_USART0 is not set +# CONFIG_AT91_EARLY_USART1 is not set +# CONFIG_AT91_EARLY_USART2 is not set +# CONFIG_AT91_EARLY_USART3 is not set +# CONFIG_AT91_EARLY_USART4 is not set +# CONFIG_AT91_EARLY_USART5 is not set + +# +# Processor Type +# +CONFIG_CPU_32=y +CONFIG_CPU_ARM926T=y +CONFIG_CPU_32v5=y +CONFIG_CPU_ABRT_EV5TJ=y +CONFIG_CPU_CACHE_VIVT=y +CONFIG_CPU_COPY_V4WB=y +CONFIG_CPU_TLB_V4WBI=y +CONFIG_CPU_CP15=y +CONFIG_CPU_CP15_MMU=y + +# +# Processor Features +# +CONFIG_ARM_THUMB=y +# CONFIG_CPU_ICACHE_DISABLE is not set +# CONFIG_CPU_DCACHE_DISABLE is not set +# CONFIG_CPU_DCACHE_WRITETHROUGH is not set +# CONFIG_CPU_CACHE_ROUND_ROBIN is not set +# CONFIG_OUTER_CACHE is not set + +# +# Bus support +# +# CONFIG_PCI_SYSCALL is not set +# CONFIG_ARCH_SUPPORTS_MSI is not set +CONFIG_PCCARD=y +# CONFIG_PCMCIA_DEBUG is not set +CONFIG_PCMCIA=y +CONFIG_PCMCIA_LOAD_CIS=y +CONFIG_PCMCIA_IOCTL=y + +# +# PC-card bridges +# +CONFIG_AT91_CF=y + +# +# Kernel Features +# +# CONFIG_TICK_ONESHOT is not set +# CONFIG_NO_HZ is not set +# CONFIG_HIGH_RES_TIMERS is not set +CONFIG_GENERIC_CLOCKEVENTS_BUILD=y +# CONFIG_PREEMPT is not set +CONFIG_HZ=100 +CONFIG_AEABI=y +# CONFIG_OABI_COMPAT is not set +# CONFIG_ARCH_DISCONTIGMEM_ENABLE is not set +CONFIG_SELECT_MEMORY_MODEL=y +CONFIG_FLATMEM_MANUAL=y +# CONFIG_DISCONTIGMEM_MANUAL is not set +# CONFIG_SPARSEMEM_MANUAL is not set +CONFIG_FLATMEM=y +CONFIG_FLAT_NODE_MEM_MAP=y +# CONFIG_SPARSEMEM_STATIC is not set +# CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set +CONFIG_SPLIT_PTLOCK_CPUS=4096 +# CONFIG_RESOURCES_64BIT is not set +CONFIG_ZONE_DMA_FLAG=1 +CONFIG_BOUNCE=y +CONFIG_VIRT_TO_BUS=y +# CONFIG_LEDS is not set +CONFIG_ALIGNMENT_TRAP=y + +# +# Boot options +# +CONFIG_ZBOOT_ROM_TEXT=0x0 +CONFIG_ZBOOT_ROM_BSS=0x0 +CONFIG_CMDLINE=" debug " +# CONFIG_XIP_KERNEL is not set +# CONFIG_KEXEC is not set + +# +# Floating point emulation +# + +# +# At least one emulation must be selected +# +# CONFIG_VFP is not set + +# +# Userspace binary formats +# +CONFIG_BINFMT_ELF=y +# CONFIG_BINFMT_AOUT is not set +# CONFIG_BINFMT_MISC is not set + +# +# Power management options +# +# CONFIG_PM is not set +CONFIG_ARCH_SUSPEND_POSSIBLE=y + +# +# Networking +# +CONFIG_NET=y + +# +# Networking options +# +CONFIG_PACKET=y +# CONFIG_PACKET_MMAP is not set +CONFIG_UNIX=y +# CONFIG_NET_KEY is not set +CONFIG_INET=y +# CONFIG_IP_MULTICAST is not set +# CONFIG_IP_ADVANCED_ROUTER is not set +CONFIG_IP_FIB_HASH=y +CONFIG_IP_PNP=y +# CONFIG_IP_PNP_DHCP is not set +CONFIG_IP_PNP_BOOTP=y +CONFIG_IP_PNP_RARP=y +# CONFIG_NET_IPIP is not set +# CONFIG_NET_IPGRE is not set +# CONFIG_ARPD is not set +# CONFIG_SYN_COOKIES is not set +# CONFIG_INET_AH is not set +# CONFIG_INET_ESP is not set +# CONFIG_INET_IPCOMP is not set +# CONFIG_INET_XFRM_TUNNEL is not set +# CONFIG_INET_TUNNEL is not set +# CONFIG_INET_XFRM_MODE_TRANSPORT is not set +# CONFIG_INET_XFRM_MODE_TUNNEL is not set +# CONFIG_INET_XFRM_MODE_BEET is not set +# CONFIG_INET_LRO is not set +# CONFIG_INET_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 is not set +# CONFIG_INET6_XFRM_TUNNEL is not set +# CONFIG_INET6_TUNNEL is not set +# CONFIG_NETWORK_SECMARK is not set +# CONFIG_NETFILTER is not set +# CONFIG_IP_DCCP is not set +# CONFIG_IP_SCTP is not set +# CONFIG_TIPC is not set +# CONFIG_ATM is not set +# CONFIG_BRIDGE is not set +# CONFIG_VLAN_8021Q is not set +# CONFIG_DECNET is not set +# 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_ECONET is not set +# CONFIG_WAN_ROUTER is not set +# CONFIG_NET_SCHED is not set + +# +# Network testing +# +# CONFIG_NET_PKTGEN 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 + +# +# Wireless +# +# CONFIG_CFG80211 is not set +# CONFIG_WIRELESS_EXT is not set +# CONFIG_MAC80211 is not set +# CONFIG_IEEE80211 is not set +# CONFIG_RFKILL is not set +# CONFIG_NET_9P is not set + +# +# Device Drivers +# + +# +# Generic Driver Options +# +CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" +CONFIG_STANDALONE=y +CONFIG_PREVENT_FIRMWARE_BUILD=y +CONFIG_FW_LOADER=y +# CONFIG_DEBUG_DRIVER is not set +# CONFIG_DEBUG_DEVRES is not set +# CONFIG_SYS_HYPERVISOR is not set +# CONFIG_CONNECTOR is not set +CONFIG_MTD=y +# CONFIG_MTD_DEBUG is not set +# CONFIG_MTD_CONCAT is not set +CONFIG_MTD_PARTITIONS=y +# CONFIG_MTD_REDBOOT_PARTS is not set +CONFIG_MTD_CMDLINE_PARTS=y +# CONFIG_MTD_AFS_PARTS is not set + +# +# User Modules And Translation Layers +# +CONFIG_MTD_CHAR=y +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_MTD_OOPS is not set + +# +# RAM/ROM/Flash chip drivers +# +CONFIG_MTD_CFI=y +CONFIG_MTD_JEDECPROBE=y +CONFIG_MTD_GEN_PROBE=y +# CONFIG_MTD_CFI_ADV_OPTIONS 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_CFI_INTELEXT=y +CONFIG_MTD_CFI_AMDSTD=y +CONFIG_MTD_CFI_STAA=y +CONFIG_MTD_CFI_UTIL=y +CONFIG_MTD_RAM=y +CONFIG_MTD_ROM=y +CONFIG_MTD_ABSENT=y + +# +# Mapping drivers for chip access +# +CONFIG_MTD_COMPLEX_MAPPINGS=y +CONFIG_MTD_PHYSMAP=y +CONFIG_MTD_PHYSMAP_START=0x10000000 +CONFIG_MTD_PHYSMAP_LEN=0x400000 +CONFIG_MTD_PHYSMAP_BANKWIDTH=2 +# CONFIG_MTD_ARM_INTEGRATOR is not set +# CONFIG_MTD_IMPA7 is not set +# CONFIG_MTD_PLATRAM is not set + +# +# Self-contained MTD device drivers +# +CONFIG_MTD_DATAFLASH=y +# CONFIG_MTD_M25P80 is not set +# CONFIG_MTD_SLRAM is not set +# CONFIG_MTD_PHRAM is not set +# CONFIG_MTD_MTDRAM is not set +# CONFIG_MTD_BLOCK2MTD is not set + +# +# Disk-On-Chip Device Drivers +# +# CONFIG_MTD_DOC2000 is not set +# CONFIG_MTD_DOC2001 is not set +# CONFIG_MTD_DOC2001PLUS is not set +CONFIG_MTD_NAND=y +CONFIG_MTD_NAND_VERIFY_WRITE=y +# CONFIG_MTD_NAND_ECC_SMC is not set +# CONFIG_MTD_NAND_MUSEUM_IDS is not set +CONFIG_MTD_NAND_IDS=y +# CONFIG_MTD_NAND_DISKONCHIP is not set +CONFIG_MTD_NAND_AT91=y +CONFIG_MTD_NAND_AT91_ECC_SOFT=y +# CONFIG_MTD_NAND_AT91_ECC_HW is not set +# CONFIG_MTD_NAND_AT91_ECC_NONE is not set +# CONFIG_MTD_NAND_NANDSIM is not set +# CONFIG_MTD_NAND_PLATFORM is not set +# CONFIG_MTD_ALAUDA is not set +# CONFIG_MTD_ONENAND is not set + +# +# UBI - Unsorted block images +# +# CONFIG_MTD_UBI is not set +# CONFIG_PARPORT is not set +CONFIG_BLK_DEV=y +# CONFIG_BLK_DEV_COW_COMMON is not set +CONFIG_BLK_DEV_LOOP=y +# CONFIG_BLK_DEV_CRYPTOLOOP is not set +# CONFIG_BLK_DEV_NBD is not set +# CONFIG_BLK_DEV_UB is not set +CONFIG_BLK_DEV_RAM=y +CONFIG_BLK_DEV_RAM_COUNT=16 +CONFIG_BLK_DEV_RAM_SIZE=8192 +# CONFIG_BLK_DEV_XIP is not set +# CONFIG_CDROM_PKTCDVD is not set +# CONFIG_ATA_OVER_ETH is not set +CONFIG_MISC_DEVICES=y +# CONFIG_ATMEL_PWM is not set +# CONFIG_EEPROM_93CX6 is not set +CONFIG_ATMEL_SSC=y +# CONFIG_ENCLOSURE_SERVICES is not set +CONFIG_HAVE_IDE=y +CONFIG_IDE=y +CONFIG_BLK_DEV_IDE=y + +# +# Please see Documentation/ide/ide.txt for help/info on IDE drives +# +# CONFIG_BLK_DEV_IDE_SATA is not set +CONFIG_BLK_DEV_IDEDISK=y +CONFIG_IDEDISK_MULTI_MODE=y +CONFIG_BLK_DEV_IDECS=y +# CONFIG_BLK_DEV_IDECD is not set +# CONFIG_BLK_DEV_IDETAPE is not set +# CONFIG_BLK_DEV_IDEFLOPPY is not set +# CONFIG_BLK_DEV_IDESCSI is not set +# CONFIG_IDE_TASK_IOCTL is not set +CONFIG_IDE_PROC_FS=y + +# +# IDE chipset support/bugfixes +# +# CONFIG_IDE_GENERIC is not set +# CONFIG_BLK_DEV_PLATFORM is not set +# CONFIG_BLK_DEV_IDEDMA is not set +CONFIG_IDE_ARCH_OBSOLETE_INIT=y +# CONFIG_BLK_DEV_HD is not set + +# +# SCSI device support +# +# CONFIG_RAID_ATTRS is not set +CONFIG_SCSI=m +CONFIG_SCSI_DMA=y +# CONFIG_SCSI_TGT is not set +# CONFIG_SCSI_NETLINK is not set +CONFIG_SCSI_PROC_FS=y + +# +# SCSI support type (disk, tape, CD-ROM) +# +CONFIG_BLK_DEV_SD=m +# 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 + +# +# Some SCSI devices (e.g. CD jukebox) support multiple LUNs +# +CONFIG_SCSI_MULTI_LUN=y +# CONFIG_SCSI_CONSTANTS is not set +# CONFIG_SCSI_LOGGING is not set +# CONFIG_SCSI_SCAN_ASYNC is not set +CONFIG_SCSI_WAIT_SCAN=m + +# +# 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_LIBSAS is not set +# CONFIG_SCSI_SRP_ATTRS is not set +# CONFIG_SCSI_LOWLEVEL is not set +# CONFIG_SCSI_LOWLEVEL_PCMCIA is not set +# CONFIG_ATA is not set +# CONFIG_MD is not set +CONFIG_NETDEVICES=y +# CONFIG_NETDEVICES_MULTIQUEUE is not set +# CONFIG_DUMMY is not set +# CONFIG_BONDING is not set +# CONFIG_MACVLAN is not set +# CONFIG_EQUALIZER is not set +# CONFIG_TUN is not set +# CONFIG_VETH is not set +CONFIG_PHYLIB=y + +# +# MII PHY device drivers +# +# 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_ICPLUS_PHY is not set +# CONFIG_REALTEK_PHY is not set +# CONFIG_FIXED_PHY is not set +# CONFIG_MDIO_BITBANG is not set +CONFIG_NET_ETHERNET=y +CONFIG_MII=y +# CONFIG_AX88796 is not set +# CONFIG_SMC91X is not set +CONFIG_DM9000=y +# CONFIG_ENC28J60 is not set +CONFIG_DM9000_DEBUGLEVEL=4 +# CONFIG_IBM_NEW_EMAC_ZMII is not set +# CONFIG_IBM_NEW_EMAC_RGMII is not set +# CONFIG_IBM_NEW_EMAC_TAH is not set +# CONFIG_IBM_NEW_EMAC_EMAC4 is not set +# CONFIG_B44 is not set +# CONFIG_NETDEV_1000 is not set +# CONFIG_NETDEV_10000 is not set + +# +# Wireless LAN +# +# CONFIG_WLAN_PRE80211 is not set +# CONFIG_WLAN_80211 is not set + +# +# 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_USBNET is not set +# CONFIG_NET_PCMCIA is not set +# CONFIG_WAN is not set +# CONFIG_PPP is not set +# CONFIG_SLIP is not set +# CONFIG_NETCONSOLE is not set +# CONFIG_NETPOLL is not set +# CONFIG_NET_POLL_CONTROLLER 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 + +# +# Userland interfaces +# +CONFIG_INPUT_MOUSEDEV=y +# CONFIG_INPUT_MOUSEDEV_PSAUX is not set +CONFIG_INPUT_MOUSEDEV_SCREEN_X=320 +CONFIG_INPUT_MOUSEDEV_SCREEN_Y=240 +# CONFIG_INPUT_JOYDEV is not set +CONFIG_INPUT_EVDEV=y +# CONFIG_INPUT_EVBUG is not set + +# +# Input Device Drivers +# +CONFIG_INPUT_KEYBOARD=y +# CONFIG_KEYBOARD_ATKBD is not set +# CONFIG_KEYBOARD_SUNKBD is not set +# CONFIG_KEYBOARD_LKKBD is not set +# CONFIG_KEYBOARD_XTKBD is not set +# CONFIG_KEYBOARD_NEWTON is not set +# CONFIG_KEYBOARD_STOWAWAY is not set +CONFIG_KEYBOARD_GPIO=y +# CONFIG_INPUT_MOUSE is not set +# CONFIG_INPUT_JOYSTICK is not set +# CONFIG_INPUT_TABLET is not set +CONFIG_INPUT_TOUCHSCREEN=y +# CONFIG_TOUCHSCREEN_ADS7846 is not set +# CONFIG_TOUCHSCREEN_FUJITSU is not set +# CONFIG_TOUCHSCREEN_GUNZE is not set +# CONFIG_TOUCHSCREEN_ELO is not set +# CONFIG_TOUCHSCREEN_MTOUCH is not set +# CONFIG_TOUCHSCREEN_MK712 is not set +# CONFIG_TOUCHSCREEN_PENMOUNT is not set +# CONFIG_TOUCHSCREEN_TOUCHRIGHT is not set +# CONFIG_TOUCHSCREEN_TOUCHWIN is not set +# CONFIG_TOUCHSCREEN_UCB1400 is not set +# CONFIG_TOUCHSCREEN_USB_COMPOSITE is not set +CONFIG_TOUCHSCREEN_TSC2301=y +# CONFIG_TSC2301_XY_SWAP is not set +# CONFIG_TSC2301_X_INVERSE is not set +# CONFIG_TSC2301_Y_INVERSE is not set +# CONFIG_INPUT_MISC is not set + +# +# Hardware I/O ports +# +# CONFIG_SERIO is not set +# CONFIG_GAMEPORT is not set + +# +# Character devices +# +CONFIG_VT=y +CONFIG_VT_CONSOLE=y +CONFIG_HW_CONSOLE=y +# CONFIG_VT_HW_CONSOLE_BINDING is not set +# CONFIG_SERIAL_NONSTANDARD is not set + +# +# Serial drivers +# +# CONFIG_SERIAL_8250 is not set + +# +# Non-8250 serial port support +# +CONFIG_SERIAL_ATMEL=y +CONFIG_SERIAL_ATMEL_CONSOLE=y +CONFIG_SERIAL_ATMEL_PDC=y +# CONFIG_SERIAL_ATMEL_TTYAT is not set +CONFIG_SERIAL_CORE=y +CONFIG_SERIAL_CORE_CONSOLE=y +CONFIG_UNIX98_PTYS=y +# CONFIG_LEGACY_PTYS is not set +# CONFIG_IPMI_HANDLER is not set +CONFIG_HW_RANDOM=y +# CONFIG_NVRAM is not set +# CONFIG_R3964 is not set + +# +# PCMCIA character devices +# +# CONFIG_SYNCLINK_CS is not set +# CONFIG_CARDMAN_4000 is not set +# CONFIG_CARDMAN_4040 is not set +# CONFIG_IPWIRELESS is not set +# CONFIG_RAW_DRIVER is not set +# CONFIG_TCG_TPM is not set +# CONFIG_I2C is not set + +# +# SPI support +# +CONFIG_SPI=y +# CONFIG_SPI_DEBUG is not set +CONFIG_SPI_MASTER=y + +# +# SPI Master Controller Drivers +# +CONFIG_SPI_ATMEL=y +# CONFIG_SPI_BITBANG is not set + +# +# SPI Protocol Masters +# +# CONFIG_SPI_AT25 is not set +# CONFIG_SPI_SPIDEV is not set +# CONFIG_SPI_TLE62X0 is not set +CONFIG_SPI_TSC2301=y +CONFIG_W1=y + +# +# 1-wire Bus Masters +# +# CONFIG_W1_MASTER_DS2490 is not set +# CONFIG_W1_MASTER_DS1WM is not set +CONFIG_W1_MASTER_GPIO=y + +# +# 1-wire Slaves +# +# CONFIG_W1_SLAVE_THERM is not set +CONFIG_W1_SLAVE_SMEM=y +# CONFIG_W1_SLAVE_DS2433 is not set +# CONFIG_W1_SLAVE_DS2760 is not set +# CONFIG_POWER_SUPPLY is not set +# CONFIG_HWMON is not set +CONFIG_WATCHDOG=y +CONFIG_WATCHDOG_NOWAYOUT=y + +# +# Watchdog Device Drivers +# +# CONFIG_SOFT_WATCHDOG is not set +CONFIG_AT91SAM9_WATCHDOG=y + +# +# USB-based Watchdog Cards +# +# CONFIG_USBPCWATCHDOG is not set + +# +# Sonics Silicon Backplane +# +CONFIG_SSB_POSSIBLE=y +# CONFIG_SSB is not set + +# +# Multifunction device drivers +# +# CONFIG_MFD_SM501 is not set +# CONFIG_MFD_ASIC3 is not set + +# +# Multimedia devices +# +# CONFIG_VIDEO_DEV is not set +# CONFIG_DVB_CORE is not set +# CONFIG_DAB is not set + +# +# Graphics support +# +# 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_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_SYS_FOPS is not set +CONFIG_FB_DEFERRED_IO=y +# CONFIG_FB_SVGALIB is not set +# CONFIG_FB_MACMODES is not set +# CONFIG_FB_BACKLIGHT is not set +# CONFIG_FB_MODE_HELPERS is not set +# CONFIG_FB_TILEBLITTING is not set + +# +# Frame buffer hardware drivers +# +# CONFIG_FB_S1D15605 is not set +# CONFIG_FB_S1D13XXX is not set +CONFIG_FB_ATMEL=y +# CONFIG_FB_VIRTUAL is not set +# CONFIG_BACKLIGHT_LCD_SUPPORT is not set + +# +# Display device support +# +# CONFIG_DISPLAY_SUPPORT is not set + +# +# Console display driver support +# +# CONFIG_VGA_CONSOLE is not set +CONFIG_DUMMY_CONSOLE=y +CONFIG_FRAMEBUFFER_CONSOLE=y +# CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY is not set +CONFIG_FRAMEBUFFER_CONSOLE_ROTATION=y +# CONFIG_FONTS is not set +CONFIG_FONT_8x8=y +CONFIG_FONT_8x16=y +CONFIG_LOGO=y +CONFIG_LOGO_LINUX_MONO=y +CONFIG_LOGO_LINUX_VGA16=y +CONFIG_LOGO_LINUX_CLUT224=y + +# +# Sound +# +CONFIG_SOUND=y + +# +# Advanced Linux Sound Architecture +# +CONFIG_SND=y +CONFIG_SND_TIMER=y +CONFIG_SND_PCM=y +# CONFIG_SND_SEQUENCER is not set +CONFIG_SND_OSSEMUL=y +CONFIG_SND_MIXER_OSS=y +CONFIG_SND_PCM_OSS=y +CONFIG_SND_PCM_OSS_PLUGINS=y +# CONFIG_SND_DYNAMIC_MINORS is not set +CONFIG_SND_SUPPORT_OLD_API=y +CONFIG_SND_VERBOSE_PROCFS=y +CONFIG_SND_VERBOSE_PRINTK=y +# CONFIG_SND_DEBUG is not set + +# +# Generic devices +# +# CONFIG_SND_DUMMY is not set +# CONFIG_SND_MTPAV is not set +# CONFIG_SND_SERIAL_U16550 is not set +# CONFIG_SND_MPU401 is not set + +# +# ALSA ARM devices +# + +# +# SPI devices +# +# CONFIG_SND_AT73C213 is not set + +# +# USB devices +# +# CONFIG_SND_USB_AUDIO is not set +# CONFIG_SND_USB_CAIAQ is not set + +# +# PCMCIA devices +# +# CONFIG_SND_VXPOCKET is not set +# CONFIG_SND_PDAUDIOCF is not set + +# +# System on Chip audio support +# +CONFIG_SND_SOC=y +CONFIG_SND_AT91_SOC=y +CONFIG_SND_AT91_SOC_SSC=y +CONFIG_SND_AT91_SOC_PM9261_TSC2301=y + +# +# SoC Audio support for SuperH +# + +# +# ALSA SoC audio for Freescale SOCs +# +CONFIG_SND_SOC_TSC2301=y + +# +# Open Sound System +# +# CONFIG_SOUND_PRIME is not set +CONFIG_HID_SUPPORT=y +CONFIG_HID=y +CONFIG_HID_DEBUG=y +# CONFIG_HIDRAW is not set + +# +# USB Input Devices +# +CONFIG_USB_HID=y +# CONFIG_USB_HIDINPUT_POWERBOOK is not set +# CONFIG_HID_FF is not set +# CONFIG_USB_HIDDEV is not set +CONFIG_USB_SUPPORT=y +CONFIG_USB_ARCH_HAS_HCD=y +CONFIG_USB_ARCH_HAS_OHCI=y +# CONFIG_USB_ARCH_HAS_EHCI is not set +CONFIG_USB=y +# CONFIG_USB_DEBUG is not set +# CONFIG_USB_ANNOUNCE_NEW_DEVICES is not set + +# +# Miscellaneous USB options +# +CONFIG_USB_DEVICEFS=y +CONFIG_USB_DEVICE_CLASS=y +# CONFIG_USB_DYNAMIC_MINORS is not set +# CONFIG_USB_OTG is not set + +# +# USB Host Controller Drivers +# +# CONFIG_USB_ISP116X_HCD is not set +CONFIG_USB_OHCI_HCD=y +# CONFIG_USB_OHCI_BIG_ENDIAN_DESC is not set +# CONFIG_USB_OHCI_BIG_ENDIAN_MMIO is not set +CONFIG_USB_OHCI_LITTLE_ENDIAN=y +# CONFIG_USB_SL811_HCD is not set +# CONFIG_USB_R8A66597_HCD is not set + +# +# USB Device Class drivers +# +# CONFIG_USB_ACM is not set +# CONFIG_USB_PRINTER is not set + +# +# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support' +# + +# +# may also be needed; see USB_STORAGE Help for more information +# +CONFIG_USB_STORAGE=m +# CONFIG_USB_STORAGE_DEBUG is not set +CONFIG_USB_STORAGE_DATAFAB=y +CONFIG_USB_STORAGE_FREECOM=y +CONFIG_USB_STORAGE_ISD200=y +CONFIG_USB_STORAGE_DPCM=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 is not set +# CONFIG_USB_STORAGE_KARMA is not set +# CONFIG_USB_LIBUSUAL is not set + +# +# USB Imaging devices +# +# CONFIG_USB_MDC800 is not set +# CONFIG_USB_MICROTEK is not set +CONFIG_USB_MON=y + +# +# USB port drivers +# +# CONFIG_USB_SERIAL 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_AUERSWALD is not set +# CONFIG_USB_RIO500 is not set +# CONFIG_USB_LEGOTOWER is not set +# CONFIG_USB_LCD is not set +# CONFIG_USB_BERRY_CHARGE is not set +# CONFIG_USB_LED is not set +# CONFIG_USB_CYPRESS_CY7C63 is not set +# CONFIG_USB_CYTHERM is not set +# CONFIG_USB_PHIDGET 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 is not set +# CONFIG_USB_IOWARRIOR is not set +# CONFIG_USB_TEST is not set +CONFIG_USB_GADGET=m +# CONFIG_USB_GADGET_DEBUG is not set +# CONFIG_USB_GADGET_DEBUG_FILES is not set +CONFIG_USB_GADGET_SELECTED=y +# CONFIG_USB_GADGET_AMD5536UDC is not set +# CONFIG_USB_GADGET_ATMEL_USBA is not set +# CONFIG_USB_GADGET_FSL_USB2 is not set +# CONFIG_USB_GADGET_NET2280 is not set +# CONFIG_USB_GADGET_PXA2XX is not set +# CONFIG_USB_GADGET_M66592 is not set +# CONFIG_USB_GADGET_GOKU is not set +# CONFIG_USB_GADGET_LH7A40X is not set +# CONFIG_USB_GADGET_OMAP is not set +# CONFIG_USB_GADGET_S3C2410 is not set +CONFIG_USB_GADGET_AT91=y +CONFIG_USB_AT91=m +# CONFIG_USB_GADGET_DUMMY_HCD is not set +# CONFIG_USB_GADGET_DUALSPEED is not set +CONFIG_USB_ZERO=m +# CONFIG_USB_ETH is not set +CONFIG_USB_GADGETFS=m +CONFIG_USB_FILE_STORAGE=m +# CONFIG_USB_FILE_STORAGE_TEST is not set +CONFIG_USB_G_SERIAL=m +# CONFIG_USB_MIDI_GADGET is not set +# CONFIG_USB_G_PRINTER is not set +CONFIG_MMC=y +# CONFIG_MMC_DEBUG is not set +# CONFIG_MMC_UNSAFE_RESUME is not set + +# +# MMC/SD Card Drivers +# +CONFIG_MMC_BLOCK=y +CONFIG_MMC_BLOCK_BOUNCE=y +# CONFIG_SDIO_UART is not set + +# +# MMC/SD Host Controller Drivers +# +# CONFIG_MMC_AT91 is not set +CONFIG_MMC_SPI=y +CONFIG_NEW_LEDS=y +CONFIG_LEDS_CLASS=y + +# +# LED drivers +# +CONFIG_LEDS_GPIO=y + +# +# LED Triggers +# +CONFIG_LEDS_TRIGGERS=y +CONFIG_LEDS_TRIGGER_TIMER=y +CONFIG_LEDS_TRIGGER_IDE_DISK=y +CONFIG_LEDS_TRIGGER_HEARTBEAT=y +CONFIG_RTC_LIB=y +CONFIG_RTC_CLASS=y +CONFIG_RTC_HCTOSYS=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=y +# CONFIG_RTC_DRV_TEST is not set + +# +# SPI RTC drivers +# +# CONFIG_RTC_DRV_MAX6902 is not set +# CONFIG_RTC_DRV_R9701 is not set +# CONFIG_RTC_DRV_RS5C348 is not set + +# +# Platform RTC drivers +# +# CONFIG_RTC_DRV_CMOS 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_M48T59 is not set +# CONFIG_RTC_DRV_V3020 is not set + +# +# on-CPU RTC drivers +# +CONFIG_RTC_DRV_AT91SAM9=y +CONFIG_RTC_DRV_AT91SAM9_RTT=0 +CONFIG_RTC_DRV_AT91SAM9_GPBR=0 + +# +# File systems +# +CONFIG_EXT2_FS=y +# CONFIG_EXT2_FS_XATTR is not set +# CONFIG_EXT2_FS_XIP is not set +CONFIG_EXT3_FS=y +# CONFIG_EXT3_FS_XATTR is not set +# CONFIG_EXT4DEV_FS is not set +CONFIG_JBD=y +# CONFIG_REISERFS_FS is not set +# CONFIG_JFS_FS is not set +# CONFIG_FS_POSIX_ACL is not set +# CONFIG_XFS_FS is not set +# CONFIG_GFS2_FS is not set +# CONFIG_OCFS2_FS is not set +CONFIG_DNOTIFY=y +CONFIG_INOTIFY=y +CONFIG_INOTIFY_USER=y +# CONFIG_QUOTA is not set +# CONFIG_AUTOFS_FS is not set +# CONFIG_AUTOFS4_FS is not set +# CONFIG_FUSE_FS is not set + +# +# CD-ROM/DVD Filesystems +# +# CONFIG_ISO9660_FS is not set +# CONFIG_UDF_FS is not set + +# +# DOS/FAT/NT Filesystems +# +CONFIG_FAT_FS=m +# CONFIG_MSDOS_FS is not set +CONFIG_VFAT_FS=m +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_SYSFS=y +CONFIG_TMPFS=y +# CONFIG_TMPFS_POSIX_ACL is not set +# CONFIG_HUGETLB_PAGE is not set +# CONFIG_CONFIGFS_FS is not set + +# +# Miscellaneous filesystems +# +# 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=y +CONFIG_JFFS2_FS_DEBUG=0 +CONFIG_JFFS2_FS_WRITEBUFFER=y +# CONFIG_JFFS2_FS_WBUF_VERIFY is not set +# CONFIG_JFFS2_SUMMARY is not set +# CONFIG_JFFS2_FS_XATTR is not set +# CONFIG_JFFS2_COMPRESSION_OPTIONS is not set +CONFIG_JFFS2_ZLIB=y +# CONFIG_JFFS2_LZO is not set +CONFIG_JFFS2_RTIME=y +# CONFIG_JFFS2_RUBIN is not set +# CONFIG_CRAMFS is not set +# CONFIG_VXFS_FS is not set +# CONFIG_MINIX_FS is not set +# CONFIG_HPFS_FS is not set +# CONFIG_QNX4FS_FS is not set +# CONFIG_ROMFS_FS is not set +# CONFIG_SYSV_FS is not set +# CONFIG_UFS_FS is not set +CONFIG_NETWORK_FILESYSTEMS=y +CONFIG_NFS_FS=y +# CONFIG_NFS_V3 is not set +# CONFIG_NFS_V4 is not set +# CONFIG_NFS_DIRECTIO is not set +# CONFIG_NFSD is not set +CONFIG_ROOT_NFS=y +CONFIG_LOCKD=y +CONFIG_NFS_COMMON=y +CONFIG_SUNRPC=y +CONFIG_SUNRPC_BIND34=y +# CONFIG_RPCSEC_GSS_KRB5 is not set +# CONFIG_RPCSEC_GSS_SPKM3 is not set +# CONFIG_SMB_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 + +# +# Partition Types +# +# CONFIG_PARTITION_ADVANCED is not set +CONFIG_MSDOS_PARTITION=y +CONFIG_NLS=y +CONFIG_NLS_DEFAULT="iso8859-1" +CONFIG_NLS_CODEPAGE_437=m +# 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 is not set +# 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 is not set +CONFIG_NLS_ISO8859_1=m +# 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_UTF8 is not set +# CONFIG_DLM is not set + +# +# Kernel hacking +# +# CONFIG_PRINTK_TIME is not set +CONFIG_ENABLE_WARN_DEPRECATED=y +CONFIG_ENABLE_MUST_CHECK=y +# CONFIG_MAGIC_SYSRQ is not set +# CONFIG_UNUSED_SYMBOLS is not set +# CONFIG_DEBUG_FS is not set +# CONFIG_HEADERS_CHECK is not set +CONFIG_DEBUG_KERNEL=y +# CONFIG_DEBUG_SHIRQ is not set +CONFIG_DETECT_SOFTLOCKUP=y +CONFIG_SCHED_DEBUG=y +# CONFIG_SCHEDSTATS is not set +CONFIG_TIMER_STATS=y +# CONFIG_DEBUG_SLAB is not set +# 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_SPINLOCK_SLEEP is not set +# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set +# CONFIG_DEBUG_KOBJECT is not set +CONFIG_DEBUG_BUGVERBOSE=y +# CONFIG_DEBUG_INFO is not set +# CONFIG_DEBUG_VM is not set +# CONFIG_DEBUG_LIST is not set +# CONFIG_DEBUG_SG is not set +CONFIG_FRAME_POINTER=y +# CONFIG_BOOT_PRINTK_DELAY is not set +# CONFIG_RCU_TORTURE_TEST is not set +# CONFIG_BACKTRACE_SELF_TEST is not set +# CONFIG_FAULT_INJECTION is not set +# CONFIG_SAMPLES is not set +CONFIG_DEBUG_USER=y +# CONFIG_DEBUG_ERRORS is not set +# CONFIG_DEBUG_STACK_USAGE is not set +CONFIG_DEBUG_LL=y +# CONFIG_DEBUG_ICEDCC is not set + +# +# Security options +# +# CONFIG_KEYS is not set +# CONFIG_SECURITY is not set +# CONFIG_SECURITY_FILE_CAPABILITIES is not set +# CONFIG_CRYPTO is not set + +# +# Library routines +# +CONFIG_BITREVERSE=y +# CONFIG_CRC_CCITT is not set +# CONFIG_CRC16 is not set +CONFIG_CRC_ITU_T=y +CONFIG_CRC32=y +CONFIG_CRC7=y +# CONFIG_LIBCRC32C is not set +CONFIG_ZLIB_INFLATE=y +CONFIG_ZLIB_DEFLATE=y +CONFIG_PLIST=y +CONFIG_HAS_IOMEM=y +CONFIG_HAS_IOPORT=y +CONFIG_HAS_DMA=y diff --git a/packages/linux/linux-2.6.25.20/ronetix-pm9263/defconfig b/packages/linux/linux-2.6.25.20/ronetix-pm9263/defconfig new file mode 100644 index 0000000000..c7171cd4ae --- /dev/null +++ b/packages/linux/linux-2.6.25.20/ronetix-pm9263/defconfig @@ -0,0 +1,1344 @@ +# +# Automatically generated make config: don't edit +# Linux kernel version: 2.6.25.20 +# Fri Jan 2 12:48:49 2009 +# +CONFIG_ARM=y +CONFIG_SYS_SUPPORTS_APM_EMULATION=y +CONFIG_GENERIC_GPIO=y +CONFIG_GENERIC_TIME=y +CONFIG_GENERIC_CLOCKEVENTS=y +CONFIG_MMU=y +# CONFIG_NO_IOPORT is not set +CONFIG_GENERIC_HARDIRQS=y +CONFIG_STACKTRACE_SUPPORT=y +CONFIG_LOCKDEP_SUPPORT=y +CONFIG_TRACE_IRQFLAGS_SUPPORT=y +CONFIG_HARDIRQS_SW_RESEND=y +CONFIG_GENERIC_IRQ_PROBE=y +CONFIG_RWSEM_GENERIC_SPINLOCK=y +# CONFIG_ARCH_HAS_ILOG2_U32 is not set +# CONFIG_ARCH_HAS_ILOG2_U64 is not set +CONFIG_GENERIC_HWEIGHT=y +CONFIG_GENERIC_CALIBRATE_DELAY=y +CONFIG_ARCH_SUPPORTS_AOUT=y +CONFIG_ZONE_DMA=y +CONFIG_VECTORS_BASE=0xffff0000 +CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" + +# +# General setup +# +CONFIG_EXPERIMENTAL=y +CONFIG_BROKEN_ON_SMP=y +CONFIG_INIT_ENV_ARG_LIMIT=32 +CONFIG_LOCALVERSION="-KaeilOS-PM9263" +# CONFIG_LOCALVERSION_AUTO is not set +# CONFIG_SWAP is not set +CONFIG_SYSVIPC=y +CONFIG_SYSVIPC_SYSCTL=y +# CONFIG_POSIX_MQUEUE is not set +# CONFIG_BSD_PROCESS_ACCT is not set +# CONFIG_TASKSTATS is not set +# CONFIG_AUDIT is not set +# CONFIG_IKCONFIG is not set +CONFIG_LOG_BUF_SHIFT=14 +# CONFIG_CGROUPS is not set +CONFIG_GROUP_SCHED=y +CONFIG_FAIR_GROUP_SCHED=y +# CONFIG_RT_GROUP_SCHED is not set +CONFIG_USER_SCHED=y +# CONFIG_CGROUP_SCHED is not set +CONFIG_SYSFS_DEPRECATED=y +CONFIG_SYSFS_DEPRECATED_V2=y +# CONFIG_RELAY is not set +CONFIG_NAMESPACES=y +# CONFIG_UTS_NS is not set +# CONFIG_IPC_NS is not set +# CONFIG_USER_NS is not set +# CONFIG_PID_NS is not set +CONFIG_BLK_DEV_INITRD=y +CONFIG_INITRAMFS_SOURCE="" +CONFIG_CC_OPTIMIZE_FOR_SIZE=y +CONFIG_SYSCTL=y +# CONFIG_EMBEDDED is not set +CONFIG_UID16=y +CONFIG_SYSCTL_SYSCALL=y +CONFIG_KALLSYMS=y +# CONFIG_KALLSYMS_ALL is not set +# CONFIG_KALLSYMS_EXTRA_PASS is not set +CONFIG_HOTPLUG=y +CONFIG_PRINTK=y +CONFIG_BUG=y +CONFIG_ELF_CORE=y +CONFIG_COMPAT_BRK=y +CONFIG_BASE_FULL=y +CONFIG_FUTEX=y +CONFIG_ANON_INODES=y +CONFIG_EPOLL=y +CONFIG_SIGNALFD=y +CONFIG_TIMERFD=y +CONFIG_EVENTFD=y +CONFIG_SHMEM=y +CONFIG_VM_EVENT_COUNTERS=y +CONFIG_SLAB=y +# CONFIG_SLUB is not set +# CONFIG_SLOB is not set +# CONFIG_PROFILING is not set +# CONFIG_MARKERS is not set +CONFIG_HAVE_OPROFILE=y +# CONFIG_KPROBES is not set +CONFIG_HAVE_KPROBES=y +CONFIG_HAVE_KRETPROBES=y +CONFIG_PROC_PAGE_MONITOR=y +CONFIG_SLABINFO=y +CONFIG_RT_MUTEXES=y +# CONFIG_TINY_SHMEM is not set +CONFIG_BASE_SMALL=0 +CONFIG_MODULES=y +CONFIG_MODULE_UNLOAD=y +# CONFIG_MODULE_FORCE_UNLOAD is not set +# CONFIG_MODVERSIONS is not set +# CONFIG_MODULE_SRCVERSION_ALL is not set +CONFIG_KMOD=y +CONFIG_BLOCK=y +# CONFIG_LBD is not set +# CONFIG_BLK_DEV_IO_TRACE is not set +# CONFIG_LSF is not set +# CONFIG_BLK_DEV_BSG is not set + +# +# IO Schedulers +# +CONFIG_IOSCHED_NOOP=y +CONFIG_IOSCHED_AS=y +# CONFIG_IOSCHED_DEADLINE is not set +# CONFIG_IOSCHED_CFQ is not set +CONFIG_DEFAULT_AS=y +# CONFIG_DEFAULT_DEADLINE is not set +# CONFIG_DEFAULT_CFQ is not set +# CONFIG_DEFAULT_NOOP is not set +CONFIG_DEFAULT_IOSCHED="anticipatory" +CONFIG_CLASSIC_RCU=y + +# +# System Type +# +# CONFIG_ARCH_AAEC2000 is not set +# CONFIG_ARCH_INTEGRATOR is not set +# CONFIG_ARCH_REALVIEW is not set +# CONFIG_ARCH_VERSATILE is not set +CONFIG_ARCH_AT91=y +# CONFIG_ARCH_CLPS7500 is not set +# CONFIG_ARCH_CLPS711X is not set +# CONFIG_ARCH_CO285 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_H720X is not set +# CONFIG_ARCH_IMX is not set +# CONFIG_ARCH_IOP13XX is not set +# CONFIG_ARCH_IOP32X is not set +# CONFIG_ARCH_IOP33X is not set +# CONFIG_ARCH_IXP23XX is not set +# CONFIG_ARCH_IXP2000 is not set +# CONFIG_ARCH_IXP4XX is not set +# CONFIG_ARCH_L7200 is not set +# CONFIG_ARCH_KS8695 is not set +# CONFIG_ARCH_NS9XXX is not set +# CONFIG_ARCH_MXC is not set +# CONFIG_ARCH_ORION is not set +# CONFIG_ARCH_PNX4008 is not set +# CONFIG_ARCH_PXA is not set +# CONFIG_ARCH_RPC is not set +# CONFIG_ARCH_SA1100 is not set +# CONFIG_ARCH_S3C2410 is not set +# CONFIG_ARCH_SHARK is not set +# CONFIG_ARCH_LH7A40X is not set +# CONFIG_ARCH_DAVINCI is not set +# CONFIG_ARCH_OMAP is not set +# CONFIG_ARCH_MSM7X00A is not set + +# +# Boot options +# + +# +# Power management +# + +# +# Atmel AT91 System-on-Chip +# +# CONFIG_ARCH_AT91RM9200 is not set +# CONFIG_ARCH_AT91SAM9260 is not set +# CONFIG_ARCH_AT91SAM9261 is not set +CONFIG_ARCH_AT91SAM9263=y +# CONFIG_ARCH_AT91SAM9RL is not set +# CONFIG_ARCH_AT91CAP9 is not set +# CONFIG_ARCH_AT91X40 is not set +CONFIG_AT91_PMC_UNIT=y + +# +# AT91SAM9263 Board Type +# +# CONFIG_MACH_AT91SAM9263EK is not set +# CONFIG_MACH_USB_A9263 is not set +CONFIG_MACH_PM9263=y +CONFIG_PM9263_LCD_TX09D70=y +# CONFIG_PM9263_LCD_TCG057VGLAC is not set + +# +# AT91 Board Options +# +# CONFIG_MTD_NAND_AT91_BUSWIDTH_16 is not set + +# +# AT91 Feature Selections +# +# CONFIG_AT91_PROGRAMMABLE_CLOCKS is not set +CONFIG_AT91_TIMER_HZ=100 +CONFIG_AT91_EARLY_DBGU=y +# CONFIG_AT91_EARLY_USART0 is not set +# CONFIG_AT91_EARLY_USART1 is not set +# CONFIG_AT91_EARLY_USART2 is not set +# CONFIG_AT91_EARLY_USART3 is not set +# CONFIG_AT91_EARLY_USART4 is not set +# CONFIG_AT91_EARLY_USART5 is not set + +# +# Processor Type +# +CONFIG_CPU_32=y +CONFIG_CPU_ARM926T=y +CONFIG_CPU_32v5=y +CONFIG_CPU_ABRT_EV5TJ=y +CONFIG_CPU_CACHE_VIVT=y +CONFIG_CPU_COPY_V4WB=y +CONFIG_CPU_TLB_V4WBI=y +CONFIG_CPU_CP15=y +CONFIG_CPU_CP15_MMU=y + +# +# Processor Features +# +CONFIG_ARM_THUMB=y +# CONFIG_CPU_ICACHE_DISABLE is not set +# CONFIG_CPU_DCACHE_DISABLE is not set +# CONFIG_CPU_DCACHE_WRITETHROUGH is not set +# CONFIG_CPU_CACHE_ROUND_ROBIN is not set +# CONFIG_OUTER_CACHE is not set + +# +# Bus support +# +# CONFIG_PCI_SYSCALL is not set +# CONFIG_ARCH_SUPPORTS_MSI is not set +CONFIG_PCCARD=y +# CONFIG_PCMCIA_DEBUG is not set +CONFIG_PCMCIA=y +CONFIG_PCMCIA_LOAD_CIS=y +CONFIG_PCMCIA_IOCTL=y + +# +# PC-card bridges +# +CONFIG_AT91_CF=y + +# +# Kernel Features +# +# CONFIG_TICK_ONESHOT is not set +# CONFIG_NO_HZ is not set +# CONFIG_HIGH_RES_TIMERS is not set +CONFIG_GENERIC_CLOCKEVENTS_BUILD=y +# CONFIG_PREEMPT is not set +CONFIG_HZ=100 +CONFIG_AEABI=y +# CONFIG_OABI_COMPAT is not set +# CONFIG_ARCH_DISCONTIGMEM_ENABLE is not set +CONFIG_SELECT_MEMORY_MODEL=y +CONFIG_FLATMEM_MANUAL=y +# CONFIG_DISCONTIGMEM_MANUAL is not set +# CONFIG_SPARSEMEM_MANUAL is not set +CONFIG_FLATMEM=y +CONFIG_FLAT_NODE_MEM_MAP=y +# CONFIG_SPARSEMEM_STATIC is not set +# CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set +CONFIG_SPLIT_PTLOCK_CPUS=4096 +# CONFIG_RESOURCES_64BIT is not set +CONFIG_ZONE_DMA_FLAG=1 +CONFIG_BOUNCE=y +CONFIG_VIRT_TO_BUS=y +# CONFIG_LEDS is not set +CONFIG_ALIGNMENT_TRAP=y + +# +# Boot options +# +CONFIG_ZBOOT_ROM_TEXT=0x0 +CONFIG_ZBOOT_ROM_BSS=0x0 +CONFIG_CMDLINE=" debug " +# CONFIG_XIP_KERNEL is not set +# CONFIG_KEXEC is not set + +# +# Floating point emulation +# + +# +# At least one emulation must be selected +# +# CONFIG_VFP is not set + +# +# Userspace binary formats +# +CONFIG_BINFMT_ELF=y +# CONFIG_BINFMT_AOUT is not set +# CONFIG_BINFMT_MISC is not set + +# +# Power management options +# +# CONFIG_PM is not set +CONFIG_ARCH_SUSPEND_POSSIBLE=y + +# +# Networking +# +CONFIG_NET=y + +# +# Networking options +# +CONFIG_PACKET=y +# CONFIG_PACKET_MMAP is not set +CONFIG_UNIX=y +# CONFIG_NET_KEY is not set +CONFIG_INET=y +# CONFIG_IP_MULTICAST is not set +# CONFIG_IP_ADVANCED_ROUTER is not set +CONFIG_IP_FIB_HASH=y +CONFIG_IP_PNP=y +# CONFIG_IP_PNP_DHCP is not set +CONFIG_IP_PNP_BOOTP=y +CONFIG_IP_PNP_RARP=y +# CONFIG_NET_IPIP is not set +# CONFIG_NET_IPGRE is not set +# CONFIG_ARPD is not set +# CONFIG_SYN_COOKIES is not set +# CONFIG_INET_AH is not set +# CONFIG_INET_ESP is not set +# CONFIG_INET_IPCOMP is not set +# CONFIG_INET_XFRM_TUNNEL is not set +# CONFIG_INET_TUNNEL is not set +# CONFIG_INET_XFRM_MODE_TRANSPORT is not set +# CONFIG_INET_XFRM_MODE_TUNNEL is not set +# CONFIG_INET_XFRM_MODE_BEET is not set +# CONFIG_INET_LRO is not set +# CONFIG_INET_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 is not set +# CONFIG_INET6_XFRM_TUNNEL is not set +# CONFIG_INET6_TUNNEL is not set +# CONFIG_NETWORK_SECMARK is not set +# CONFIG_NETFILTER is not set +# CONFIG_IP_DCCP is not set +# CONFIG_IP_SCTP is not set +# CONFIG_TIPC is not set +# CONFIG_ATM is not set +# CONFIG_BRIDGE is not set +# CONFIG_VLAN_8021Q is not set +# CONFIG_DECNET is not set +# 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_ECONET is not set +# CONFIG_WAN_ROUTER is not set +# CONFIG_NET_SCHED is not set + +# +# Network testing +# +# CONFIG_NET_PKTGEN 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 + +# +# Wireless +# +# CONFIG_CFG80211 is not set +# CONFIG_WIRELESS_EXT is not set +# CONFIG_MAC80211 is not set +# CONFIG_IEEE80211 is not set +# CONFIG_RFKILL is not set +# CONFIG_NET_9P is not set + +# +# Device Drivers +# + +# +# Generic Driver Options +# +CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" +CONFIG_STANDALONE=y +CONFIG_PREVENT_FIRMWARE_BUILD=y +CONFIG_FW_LOADER=y +# CONFIG_DEBUG_DRIVER is not set +# CONFIG_DEBUG_DEVRES is not set +# CONFIG_SYS_HYPERVISOR is not set +# CONFIG_CONNECTOR is not set +CONFIG_MTD=y +# CONFIG_MTD_DEBUG is not set +# CONFIG_MTD_CONCAT is not set +CONFIG_MTD_PARTITIONS=y +# CONFIG_MTD_REDBOOT_PARTS is not set +CONFIG_MTD_CMDLINE_PARTS=y +# CONFIG_MTD_AFS_PARTS is not set + +# +# User Modules And Translation Layers +# +CONFIG_MTD_CHAR=y +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_MTD_OOPS is not set + +# +# RAM/ROM/Flash chip drivers +# +CONFIG_MTD_CFI=y +CONFIG_MTD_JEDECPROBE=y +CONFIG_MTD_GEN_PROBE=y +# CONFIG_MTD_CFI_ADV_OPTIONS 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_CFI_INTELEXT=y +CONFIG_MTD_CFI_AMDSTD=y +CONFIG_MTD_CFI_STAA=y +CONFIG_MTD_CFI_UTIL=y +CONFIG_MTD_RAM=y +CONFIG_MTD_ROM=y +CONFIG_MTD_ABSENT=y + +# +# Mapping drivers for chip access +# +CONFIG_MTD_COMPLEX_MAPPINGS=y +CONFIG_MTD_PHYSMAP=y +CONFIG_MTD_PHYSMAP_START=0x10000000 +CONFIG_MTD_PHYSMAP_LEN=0x400000 +CONFIG_MTD_PHYSMAP_BANKWIDTH=2 +# CONFIG_MTD_ARM_INTEGRATOR is not set +# CONFIG_MTD_IMPA7 is not set +# CONFIG_MTD_PLATRAM is not set + +# +# Self-contained MTD device drivers +# +CONFIG_MTD_DATAFLASH=y +# CONFIG_MTD_M25P80 is not set +# CONFIG_MTD_SLRAM is not set +# CONFIG_MTD_PHRAM is not set +# CONFIG_MTD_MTDRAM is not set +# CONFIG_MTD_BLOCK2MTD is not set + +# +# Disk-On-Chip Device Drivers +# +# CONFIG_MTD_DOC2000 is not set +# CONFIG_MTD_DOC2001 is not set +# CONFIG_MTD_DOC2001PLUS is not set +CONFIG_MTD_NAND=y +CONFIG_MTD_NAND_VERIFY_WRITE=y +# CONFIG_MTD_NAND_ECC_SMC is not set +# CONFIG_MTD_NAND_MUSEUM_IDS is not set +CONFIG_MTD_NAND_IDS=y +# CONFIG_MTD_NAND_DISKONCHIP is not set +CONFIG_MTD_NAND_AT91=y +CONFIG_MTD_NAND_AT91_ECC_SOFT=y +# CONFIG_MTD_NAND_AT91_ECC_HW is not set +# CONFIG_MTD_NAND_AT91_ECC_NONE is not set +# CONFIG_MTD_NAND_NANDSIM is not set +# CONFIG_MTD_NAND_PLATFORM is not set +# CONFIG_MTD_ALAUDA is not set +# CONFIG_MTD_ONENAND is not set + +# +# UBI - Unsorted block images +# +# CONFIG_MTD_UBI is not set +# CONFIG_PARPORT is not set +CONFIG_BLK_DEV=y +# CONFIG_BLK_DEV_COW_COMMON is not set +CONFIG_BLK_DEV_LOOP=y +# CONFIG_BLK_DEV_CRYPTOLOOP is not set +# CONFIG_BLK_DEV_NBD is not set +# CONFIG_BLK_DEV_UB is not set +CONFIG_BLK_DEV_RAM=y +CONFIG_BLK_DEV_RAM_COUNT=16 +CONFIG_BLK_DEV_RAM_SIZE=8192 +# CONFIG_BLK_DEV_XIP is not set +# CONFIG_CDROM_PKTCDVD is not set +# CONFIG_ATA_OVER_ETH is not set +CONFIG_MISC_DEVICES=y +# CONFIG_ATMEL_PWM is not set +# CONFIG_EEPROM_93CX6 is not set +CONFIG_ATMEL_SSC=y +# CONFIG_ENCLOSURE_SERVICES is not set +CONFIG_HAVE_IDE=y +CONFIG_IDE=y +CONFIG_BLK_DEV_IDE=y + +# +# Please see Documentation/ide/ide.txt for help/info on IDE drives +# +# CONFIG_BLK_DEV_IDE_SATA is not set +CONFIG_BLK_DEV_IDEDISK=y +CONFIG_IDEDISK_MULTI_MODE=y +CONFIG_BLK_DEV_IDECS=y +# CONFIG_BLK_DEV_IDECD is not set +# CONFIG_BLK_DEV_IDETAPE is not set +# CONFIG_BLK_DEV_IDEFLOPPY is not set +# CONFIG_BLK_DEV_IDESCSI is not set +# CONFIG_IDE_TASK_IOCTL is not set +CONFIG_IDE_PROC_FS=y + +# +# IDE chipset support/bugfixes +# +# CONFIG_IDE_GENERIC is not set +# CONFIG_BLK_DEV_PLATFORM is not set +# CONFIG_BLK_DEV_IDEDMA is not set +CONFIG_IDE_ARCH_OBSOLETE_INIT=y +# CONFIG_BLK_DEV_HD is not set + +# +# SCSI device support +# +# CONFIG_RAID_ATTRS is not set +CONFIG_SCSI=m +CONFIG_SCSI_DMA=y +# CONFIG_SCSI_TGT is not set +# CONFIG_SCSI_NETLINK is not set +CONFIG_SCSI_PROC_FS=y + +# +# SCSI support type (disk, tape, CD-ROM) +# +CONFIG_BLK_DEV_SD=m +# 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 + +# +# Some SCSI devices (e.g. CD jukebox) support multiple LUNs +# +CONFIG_SCSI_MULTI_LUN=y +# CONFIG_SCSI_CONSTANTS is not set +# CONFIG_SCSI_LOGGING is not set +# CONFIG_SCSI_SCAN_ASYNC is not set +CONFIG_SCSI_WAIT_SCAN=m + +# +# 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_LIBSAS is not set +# CONFIG_SCSI_SRP_ATTRS is not set +# CONFIG_SCSI_LOWLEVEL is not set +# CONFIG_SCSI_LOWLEVEL_PCMCIA is not set +# CONFIG_ATA is not set +# CONFIG_MD is not set +CONFIG_NETDEVICES=y +# CONFIG_NETDEVICES_MULTIQUEUE is not set +# CONFIG_DUMMY is not set +# CONFIG_BONDING is not set +# CONFIG_MACVLAN is not set +# CONFIG_EQUALIZER is not set +# CONFIG_TUN is not set +# CONFIG_VETH is not set +CONFIG_PHYLIB=y + +# +# MII PHY device drivers +# +# 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_ICPLUS_PHY is not set +# CONFIG_REALTEK_PHY is not set +# CONFIG_FIXED_PHY is not set +# CONFIG_MDIO_BITBANG is not set +CONFIG_NET_ETHERNET=y +CONFIG_MII=y +CONFIG_MACB=y +# CONFIG_AX88796 is not set +# CONFIG_SMC91X is not set +# CONFIG_DM9000 is not set +# CONFIG_ENC28J60 is not set +# CONFIG_IBM_NEW_EMAC_ZMII is not set +# CONFIG_IBM_NEW_EMAC_RGMII is not set +# CONFIG_IBM_NEW_EMAC_TAH is not set +# CONFIG_IBM_NEW_EMAC_EMAC4 is not set +# CONFIG_B44 is not set +# CONFIG_NETDEV_1000 is not set +# CONFIG_NETDEV_10000 is not set + +# +# Wireless LAN +# +# CONFIG_WLAN_PRE80211 is not set +# CONFIG_WLAN_80211 is not set + +# +# 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_USBNET is not set +# CONFIG_NET_PCMCIA is not set +# CONFIG_WAN is not set +# CONFIG_PPP is not set +# CONFIG_SLIP is not set +# CONFIG_NETCONSOLE is not set +# CONFIG_NETPOLL is not set +# CONFIG_NET_POLL_CONTROLLER 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 + +# +# Userland interfaces +# +CONFIG_INPUT_MOUSEDEV=y +# CONFIG_INPUT_MOUSEDEV_PSAUX is not set +CONFIG_INPUT_MOUSEDEV_SCREEN_X=320 +CONFIG_INPUT_MOUSEDEV_SCREEN_Y=240 +# CONFIG_INPUT_JOYDEV is not set +CONFIG_INPUT_EVDEV=y +# CONFIG_INPUT_EVBUG is not set + +# +# Input Device Drivers +# +CONFIG_INPUT_KEYBOARD=y +# CONFIG_KEYBOARD_ATKBD is not set +# CONFIG_KEYBOARD_SUNKBD is not set +# CONFIG_KEYBOARD_LKKBD is not set +# CONFIG_KEYBOARD_XTKBD is not set +# CONFIG_KEYBOARD_NEWTON is not set +# CONFIG_KEYBOARD_STOWAWAY is not set +CONFIG_KEYBOARD_GPIO=y +# CONFIG_INPUT_MOUSE is not set +# CONFIG_INPUT_JOYSTICK is not set +# CONFIG_INPUT_TABLET is not set +CONFIG_INPUT_TOUCHSCREEN=y +CONFIG_TOUCHSCREEN_ADS7846=y +# CONFIG_TOUCHSCREEN_FUJITSU is not set +# CONFIG_TOUCHSCREEN_GUNZE is not set +# CONFIG_TOUCHSCREEN_ELO is not set +# CONFIG_TOUCHSCREEN_MTOUCH is not set +# CONFIG_TOUCHSCREEN_MK712 is not set +# CONFIG_TOUCHSCREEN_PENMOUNT is not set +# CONFIG_TOUCHSCREEN_TOUCHRIGHT is not set +# CONFIG_TOUCHSCREEN_TOUCHWIN is not set +# CONFIG_TOUCHSCREEN_UCB1400 is not set +# CONFIG_TOUCHSCREEN_USB_COMPOSITE is not set +# CONFIG_INPUT_MISC is not set + +# +# Hardware I/O ports +# +# CONFIG_SERIO is not set +# CONFIG_GAMEPORT is not set + +# +# Character devices +# +CONFIG_VT=y +CONFIG_VT_CONSOLE=y +CONFIG_HW_CONSOLE=y +# CONFIG_VT_HW_CONSOLE_BINDING is not set +# CONFIG_SERIAL_NONSTANDARD is not set + +# +# Serial drivers +# +# CONFIG_SERIAL_8250 is not set + +# +# Non-8250 serial port support +# +CONFIG_SERIAL_ATMEL=y +CONFIG_SERIAL_ATMEL_CONSOLE=y +CONFIG_SERIAL_ATMEL_PDC=y +# CONFIG_SERIAL_ATMEL_TTYAT is not set +CONFIG_SERIAL_CORE=y +CONFIG_SERIAL_CORE_CONSOLE=y +CONFIG_UNIX98_PTYS=y +# CONFIG_LEGACY_PTYS is not set +# CONFIG_IPMI_HANDLER is not set +CONFIG_HW_RANDOM=y +# CONFIG_NVRAM is not set +# CONFIG_R3964 is not set + +# +# PCMCIA character devices +# +# CONFIG_SYNCLINK_CS is not set +# CONFIG_CARDMAN_4000 is not set +# CONFIG_CARDMAN_4040 is not set +# CONFIG_IPWIRELESS is not set +# CONFIG_RAW_DRIVER is not set +# CONFIG_TCG_TPM is not set +# CONFIG_I2C is not set + +# +# SPI support +# +CONFIG_SPI=y +# CONFIG_SPI_DEBUG is not set +CONFIG_SPI_MASTER=y + +# +# SPI Master Controller Drivers +# +CONFIG_SPI_ATMEL=y +# CONFIG_SPI_BITBANG is not set + +# +# SPI Protocol Masters +# +# CONFIG_SPI_AT25 is not set +# CONFIG_SPI_SPIDEV is not set +# CONFIG_SPI_TLE62X0 is not set +# CONFIG_SPI_TSC2301 is not set +CONFIG_W1=y + +# +# 1-wire Bus Masters +# +# CONFIG_W1_MASTER_DS2490 is not set +# CONFIG_W1_MASTER_DS1WM is not set +CONFIG_W1_MASTER_GPIO=y + +# +# 1-wire Slaves +# +# CONFIG_W1_SLAVE_THERM is not set +CONFIG_W1_SLAVE_SMEM=y +# CONFIG_W1_SLAVE_DS2433 is not set +# CONFIG_W1_SLAVE_DS2760 is not set +# CONFIG_POWER_SUPPLY is not set +# CONFIG_HWMON is not set +CONFIG_WATCHDOG=y +CONFIG_WATCHDOG_NOWAYOUT=y + +# +# Watchdog Device Drivers +# +# CONFIG_SOFT_WATCHDOG is not set +CONFIG_AT91SAM9_WATCHDOG=y + +# +# USB-based Watchdog Cards +# +# CONFIG_USBPCWATCHDOG is not set + +# +# Sonics Silicon Backplane +# +CONFIG_SSB_POSSIBLE=y +# CONFIG_SSB is not set + +# +# Multifunction device drivers +# +# CONFIG_MFD_SM501 is not set +# CONFIG_MFD_ASIC3 is not set + +# +# Multimedia devices +# +# CONFIG_VIDEO_DEV is not set +# CONFIG_DVB_CORE is not set +# CONFIG_DAB is not set + +# +# Graphics support +# +# 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_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_SYS_FOPS is not set +CONFIG_FB_DEFERRED_IO=y +# CONFIG_FB_SVGALIB is not set +# CONFIG_FB_MACMODES is not set +# CONFIG_FB_BACKLIGHT is not set +# CONFIG_FB_MODE_HELPERS is not set +# CONFIG_FB_TILEBLITTING is not set + +# +# Frame buffer hardware drivers +# +# CONFIG_FB_S1D15605 is not set +# CONFIG_FB_S1D13XXX is not set +CONFIG_FB_ATMEL=y +# CONFIG_FB_VIRTUAL is not set +# CONFIG_BACKLIGHT_LCD_SUPPORT is not set + +# +# Display device support +# +# CONFIG_DISPLAY_SUPPORT is not set + +# +# Console display driver support +# +# CONFIG_VGA_CONSOLE is not set +CONFIG_DUMMY_CONSOLE=y +CONFIG_FRAMEBUFFER_CONSOLE=y +# CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY is not set +CONFIG_FRAMEBUFFER_CONSOLE_ROTATION=y +# CONFIG_FONTS is not set +CONFIG_FONT_8x8=y +CONFIG_FONT_8x16=y +CONFIG_LOGO=y +CONFIG_LOGO_LINUX_MONO=y +CONFIG_LOGO_LINUX_VGA16=y +CONFIG_LOGO_LINUX_CLUT224=y + +# +# Sound +# +CONFIG_SOUND=y + +# +# Advanced Linux Sound Architecture +# +CONFIG_SND=y +CONFIG_SND_TIMER=y +CONFIG_SND_PCM=y +# CONFIG_SND_SEQUENCER is not set +CONFIG_SND_OSSEMUL=y +CONFIG_SND_MIXER_OSS=y +CONFIG_SND_PCM_OSS=y +CONFIG_SND_PCM_OSS_PLUGINS=y +# CONFIG_SND_DYNAMIC_MINORS is not set +CONFIG_SND_SUPPORT_OLD_API=y +CONFIG_SND_VERBOSE_PROCFS=y +CONFIG_SND_VERBOSE_PRINTK=y +# CONFIG_SND_DEBUG is not set + +# +# Generic devices +# +CONFIG_SND_AC97_CODEC=y +# CONFIG_SND_DUMMY is not set +# CONFIG_SND_MTPAV is not set +# CONFIG_SND_SERIAL_U16550 is not set +# CONFIG_SND_MPU401 is not set + +# +# ALSA ARM devices +# +CONFIG_SND_AT91_AC97=y + +# +# SPI devices +# +# CONFIG_SND_AT73C213 is not set + +# +# USB devices +# +# CONFIG_SND_USB_AUDIO is not set +# CONFIG_SND_USB_CAIAQ is not set + +# +# PCMCIA devices +# +# CONFIG_SND_VXPOCKET is not set +# CONFIG_SND_PDAUDIOCF is not set + +# +# System on Chip audio support +# +# CONFIG_SND_SOC is not set + +# +# SoC Audio support for SuperH +# + +# +# ALSA SoC audio for Freescale SOCs +# + +# +# Open Sound System +# +# CONFIG_SOUND_PRIME is not set +CONFIG_AC97_BUS=y +CONFIG_HID_SUPPORT=y +CONFIG_HID=y +CONFIG_HID_DEBUG=y +# CONFIG_HIDRAW is not set + +# +# USB Input Devices +# +CONFIG_USB_HID=y +# CONFIG_USB_HIDINPUT_POWERBOOK is not set +# CONFIG_HID_FF is not set +# CONFIG_USB_HIDDEV is not set +CONFIG_USB_SUPPORT=y +CONFIG_USB_ARCH_HAS_HCD=y +CONFIG_USB_ARCH_HAS_OHCI=y +# CONFIG_USB_ARCH_HAS_EHCI is not set +CONFIG_USB=y +# CONFIG_USB_DEBUG is not set +# CONFIG_USB_ANNOUNCE_NEW_DEVICES is not set + +# +# Miscellaneous USB options +# +CONFIG_USB_DEVICEFS=y +CONFIG_USB_DEVICE_CLASS=y +# CONFIG_USB_DYNAMIC_MINORS is not set +# CONFIG_USB_OTG is not set + +# +# USB Host Controller Drivers +# +# CONFIG_USB_ISP116X_HCD is not set +CONFIG_USB_OHCI_HCD=y +# CONFIG_USB_OHCI_BIG_ENDIAN_DESC is not set +# CONFIG_USB_OHCI_BIG_ENDIAN_MMIO is not set +CONFIG_USB_OHCI_LITTLE_ENDIAN=y +# CONFIG_USB_SL811_HCD is not set +# CONFIG_USB_R8A66597_HCD is not set + +# +# USB Device Class drivers +# +# CONFIG_USB_ACM is not set +# CONFIG_USB_PRINTER is not set + +# +# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support' +# + +# +# may also be needed; see USB_STORAGE Help for more information +# +CONFIG_USB_STORAGE=m +# CONFIG_USB_STORAGE_DEBUG is not set +CONFIG_USB_STORAGE_DATAFAB=y +CONFIG_USB_STORAGE_FREECOM=y +CONFIG_USB_STORAGE_ISD200=y +CONFIG_USB_STORAGE_DPCM=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 is not set +# CONFIG_USB_STORAGE_KARMA is not set +# CONFIG_USB_LIBUSUAL is not set + +# +# USB Imaging devices +# +# CONFIG_USB_MDC800 is not set +# CONFIG_USB_MICROTEK is not set +CONFIG_USB_MON=y + +# +# USB port drivers +# +# CONFIG_USB_SERIAL 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_AUERSWALD is not set +# CONFIG_USB_RIO500 is not set +# CONFIG_USB_LEGOTOWER is not set +# CONFIG_USB_LCD is not set +# CONFIG_USB_BERRY_CHARGE is not set +# CONFIG_USB_LED is not set +# CONFIG_USB_CYPRESS_CY7C63 is not set +# CONFIG_USB_CYTHERM is not set +# CONFIG_USB_PHIDGET 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 is not set +# CONFIG_USB_IOWARRIOR is not set +# CONFIG_USB_TEST is not set +CONFIG_USB_GADGET=m +# CONFIG_USB_GADGET_DEBUG is not set +# CONFIG_USB_GADGET_DEBUG_FILES is not set +CONFIG_USB_GADGET_SELECTED=y +# CONFIG_USB_GADGET_AMD5536UDC is not set +# CONFIG_USB_GADGET_ATMEL_USBA is not set +# CONFIG_USB_GADGET_FSL_USB2 is not set +# CONFIG_USB_GADGET_NET2280 is not set +# CONFIG_USB_GADGET_PXA2XX is not set +# CONFIG_USB_GADGET_M66592 is not set +# CONFIG_USB_GADGET_GOKU is not set +# CONFIG_USB_GADGET_LH7A40X is not set +# CONFIG_USB_GADGET_OMAP is not set +# CONFIG_USB_GADGET_S3C2410 is not set +CONFIG_USB_GADGET_AT91=y +CONFIG_USB_AT91=m +# CONFIG_USB_GADGET_DUMMY_HCD is not set +# CONFIG_USB_GADGET_DUALSPEED is not set +CONFIG_USB_ZERO=m +# CONFIG_USB_ETH is not set +CONFIG_USB_GADGETFS=m +CONFIG_USB_FILE_STORAGE=m +# CONFIG_USB_FILE_STORAGE_TEST is not set +CONFIG_USB_G_SERIAL=m +# CONFIG_USB_MIDI_GADGET is not set +# CONFIG_USB_G_PRINTER is not set +CONFIG_MMC=y +# CONFIG_MMC_DEBUG is not set +# CONFIG_MMC_UNSAFE_RESUME is not set + +# +# MMC/SD Card Drivers +# +CONFIG_MMC_BLOCK=y +CONFIG_MMC_BLOCK_BOUNCE=y +# CONFIG_SDIO_UART is not set + +# +# MMC/SD Host Controller Drivers +# +CONFIG_MMC_AT91=y +# CONFIG_MMC_SPI is not set +CONFIG_NEW_LEDS=y +CONFIG_LEDS_CLASS=y + +# +# LED drivers +# +CONFIG_LEDS_GPIO=y + +# +# LED Triggers +# +CONFIG_LEDS_TRIGGERS=y +CONFIG_LEDS_TRIGGER_TIMER=y +CONFIG_LEDS_TRIGGER_IDE_DISK=y +CONFIG_LEDS_TRIGGER_HEARTBEAT=y +CONFIG_RTC_LIB=y +CONFIG_RTC_CLASS=y +CONFIG_RTC_HCTOSYS=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=y +# CONFIG_RTC_DRV_TEST is not set + +# +# SPI RTC drivers +# +# CONFIG_RTC_DRV_MAX6902 is not set +# CONFIG_RTC_DRV_R9701 is not set +# CONFIG_RTC_DRV_RS5C348 is not set + +# +# Platform RTC drivers +# +# CONFIG_RTC_DRV_CMOS 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_M48T59 is not set +# CONFIG_RTC_DRV_V3020 is not set + +# +# on-CPU RTC drivers +# +CONFIG_RTC_DRV_AT91SAM9=y +CONFIG_RTC_DRV_AT91SAM9_RTT=0 +CONFIG_RTC_DRV_AT91SAM9_GPBR=0 + +# +# File systems +# +CONFIG_EXT2_FS=y +# CONFIG_EXT2_FS_XATTR is not set +# CONFIG_EXT2_FS_XIP is not set +CONFIG_EXT3_FS=y +# CONFIG_EXT3_FS_XATTR is not set +# CONFIG_EXT4DEV_FS is not set +CONFIG_JBD=y +# CONFIG_REISERFS_FS is not set +# CONFIG_JFS_FS is not set +# CONFIG_FS_POSIX_ACL is not set +# CONFIG_XFS_FS is not set +# CONFIG_GFS2_FS is not set +# CONFIG_OCFS2_FS is not set +CONFIG_DNOTIFY=y +CONFIG_INOTIFY=y +CONFIG_INOTIFY_USER=y +# CONFIG_QUOTA is not set +# CONFIG_AUTOFS_FS is not set +# CONFIG_AUTOFS4_FS is not set +# CONFIG_FUSE_FS is not set + +# +# CD-ROM/DVD Filesystems +# +# CONFIG_ISO9660_FS is not set +# CONFIG_UDF_FS is not set + +# +# DOS/FAT/NT Filesystems +# +CONFIG_FAT_FS=m +# CONFIG_MSDOS_FS is not set +CONFIG_VFAT_FS=m +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_SYSFS=y +CONFIG_TMPFS=y +# CONFIG_TMPFS_POSIX_ACL is not set +# CONFIG_HUGETLB_PAGE is not set +# CONFIG_CONFIGFS_FS is not set + +# +# Miscellaneous filesystems +# +# 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=y +CONFIG_JFFS2_FS_DEBUG=0 +CONFIG_JFFS2_FS_WRITEBUFFER=y +# CONFIG_JFFS2_FS_WBUF_VERIFY is not set +# CONFIG_JFFS2_SUMMARY is not set +# CONFIG_JFFS2_FS_XATTR is not set +# CONFIG_JFFS2_COMPRESSION_OPTIONS is not set +CONFIG_JFFS2_ZLIB=y +# CONFIG_JFFS2_LZO is not set +CONFIG_JFFS2_RTIME=y +# CONFIG_JFFS2_RUBIN is not set +# CONFIG_CRAMFS is not set +# CONFIG_VXFS_FS is not set +# CONFIG_MINIX_FS is not set +# CONFIG_HPFS_FS is not set +# CONFIG_QNX4FS_FS is not set +# CONFIG_ROMFS_FS is not set +# CONFIG_SYSV_FS is not set +# CONFIG_UFS_FS is not set +CONFIG_NETWORK_FILESYSTEMS=y +CONFIG_NFS_FS=y +# CONFIG_NFS_V3 is not set +# CONFIG_NFS_V4 is not set +# CONFIG_NFS_DIRECTIO is not set +# CONFIG_NFSD is not set +CONFIG_ROOT_NFS=y +CONFIG_LOCKD=y +CONFIG_NFS_COMMON=y +CONFIG_SUNRPC=y +CONFIG_SUNRPC_BIND34=y +# CONFIG_RPCSEC_GSS_KRB5 is not set +# CONFIG_RPCSEC_GSS_SPKM3 is not set +# CONFIG_SMB_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 + +# +# Partition Types +# +# CONFIG_PARTITION_ADVANCED is not set +CONFIG_MSDOS_PARTITION=y +CONFIG_NLS=y +CONFIG_NLS_DEFAULT="iso8859-1" +CONFIG_NLS_CODEPAGE_437=m +# 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 is not set +# 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 is not set +CONFIG_NLS_ISO8859_1=m +# 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_UTF8 is not set +# CONFIG_DLM is not set + +# +# Kernel hacking +# +# CONFIG_PRINTK_TIME is not set +CONFIG_ENABLE_WARN_DEPRECATED=y +CONFIG_ENABLE_MUST_CHECK=y +# CONFIG_MAGIC_SYSRQ is not set +# CONFIG_UNUSED_SYMBOLS is not set +# CONFIG_DEBUG_FS is not set +# CONFIG_HEADERS_CHECK is not set +CONFIG_DEBUG_KERNEL=y +# CONFIG_DEBUG_SHIRQ is not set +CONFIG_DETECT_SOFTLOCKUP=y +CONFIG_SCHED_DEBUG=y +# CONFIG_SCHEDSTATS is not set +CONFIG_TIMER_STATS=y +# CONFIG_DEBUG_SLAB is not set +# 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_SPINLOCK_SLEEP is not set +# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set +# CONFIG_DEBUG_KOBJECT is not set +CONFIG_DEBUG_BUGVERBOSE=y +CONFIG_DEBUG_INFO=y +# CONFIG_DEBUG_VM is not set +# CONFIG_DEBUG_LIST is not set +# CONFIG_DEBUG_SG is not set +CONFIG_FRAME_POINTER=y +# CONFIG_BOOT_PRINTK_DELAY is not set +# CONFIG_RCU_TORTURE_TEST is not set +# CONFIG_BACKTRACE_SELF_TEST is not set +# CONFIG_FAULT_INJECTION is not set +# CONFIG_SAMPLES is not set +CONFIG_DEBUG_USER=y +# CONFIG_DEBUG_ERRORS is not set +# CONFIG_DEBUG_STACK_USAGE is not set +CONFIG_DEBUG_LL=y +# CONFIG_DEBUG_ICEDCC is not set + +# +# Security options +# +# CONFIG_KEYS is not set +# CONFIG_SECURITY is not set +# CONFIG_SECURITY_FILE_CAPABILITIES is not set +# CONFIG_CRYPTO is not set + +# +# Library routines +# +CONFIG_BITREVERSE=y +# CONFIG_CRC_CCITT is not set +# CONFIG_CRC16 is not set +# CONFIG_CRC_ITU_T is not set +CONFIG_CRC32=y +# CONFIG_CRC7 is not set +# CONFIG_LIBCRC32C is not set +CONFIG_ZLIB_INFLATE=y +CONFIG_ZLIB_DEFLATE=y +CONFIG_PLIST=y +CONFIG_HAS_IOMEM=y +CONFIG_HAS_IOPORT=y +CONFIG_HAS_DMA=y diff --git a/packages/linux/linux-2.6.27/boc01/013-090116-lcd.patch b/packages/linux/linux-2.6.27/boc01/013-090209-lcd.patch index 46a7534d2f..c867e2cf3a 100644 --- a/packages/linux/linux-2.6.27/boc01/013-090116-lcd.patch +++ b/packages/linux/linux-2.6.27/boc01/013-090209-lcd.patch @@ -160,7 +160,7 @@ Index: linux-2.6.27/drivers/video/nt7506fb.c +#define LCD_NPAGES (LCD_HEIGHT/8) /* LCD pages of 8 vertical pixels */ + +#define DEFAULT_CONTRAST 20 -+#define DEFAULT_FPS 5 ++#define DEFAULT_FPS 10 + +static struct resource *lcd_mem = NULL; +static void * _lcd_io = NULL; diff --git a/packages/linux/linux-2.6.27/boc01/014-090115-pm-wakeup.patch b/packages/linux/linux-2.6.27/boc01/014-090209-pm-wakeup.patch index 536a788ffc..3acbf40c32 100644 --- a/packages/linux/linux-2.6.27/boc01/014-090115-pm-wakeup.patch +++ b/packages/linux/linux-2.6.27/boc01/014-090209-pm-wakeup.patch @@ -1,8 +1,8 @@ Index: linux-2.6.27/arch/powerpc/platforms/83xx/Kconfig =================================================================== ---- linux-2.6.27.orig/arch/powerpc/platforms/83xx/Kconfig -+++ linux-2.6.27/arch/powerpc/platforms/83xx/Kconfig -@@ -104,6 +104,13 @@ config ASP834x +--- linux-2.6.27.orig/arch/powerpc/platforms/83xx/Kconfig 2008-10-10 00:13:53.000000000 +0200 ++++ linux-2.6.27/arch/powerpc/platforms/83xx/Kconfig 2009-01-23 10:54:03.000000000 +0100 +@@ -104,6 +104,13 @@ endif @@ -18,17 +18,17 @@ Index: linux-2.6.27/arch/powerpc/platforms/83xx/Kconfig bool Index: linux-2.6.27/arch/powerpc/platforms/83xx/Makefile =================================================================== ---- linux-2.6.27.orig/arch/powerpc/platforms/83xx/Makefile -+++ linux-2.6.27/arch/powerpc/platforms/83xx/Makefile -@@ -14,3 +14,4 @@ obj-$(CONFIG_MPC837x_MDS) += mpc837x_mds +--- linux-2.6.27.orig/arch/powerpc/platforms/83xx/Makefile 2008-10-10 00:13:53.000000000 +0200 ++++ linux-2.6.27/arch/powerpc/platforms/83xx/Makefile 2009-01-23 10:54:03.000000000 +0100 +@@ -14,3 +14,4 @@ obj-$(CONFIG_SBC834x) += sbc834x.o obj-$(CONFIG_MPC837x_RDB) += mpc837x_rdb.o obj-$(CONFIG_ASP834x) += asp834x.o +obj-$(CONFIG_WAKEUP_IT) += wakeup-it.o Index: linux-2.6.27/arch/powerpc/platforms/83xx/wakeup-it.c =================================================================== ---- /dev/null -+++ linux-2.6.27/arch/powerpc/platforms/83xx/wakeup-it.c +--- /dev/null 1970-01-01 00:00:00.000000000 +0000 ++++ linux-2.6.27/arch/powerpc/platforms/83xx/wakeup-it.c 2009-01-23 10:49:09.000000000 +0100 @@ -0,0 +1,163 @@ +/* + * This support a driver to be used as a wakeup source on the MPC8313. @@ -77,8 +77,8 @@ Index: linux-2.6.27/arch/powerpc/platforms/83xx/wakeup-it.c +{ + //printk(KERN_INFO "===== WAKEUP INTERRUPT %d !!\n", irq); + -+ if ( suspend ) -+ kernel_restart(NULL); ++// if ( suspend ) ++// kernel_restart(NULL); + return IRQ_HANDLED ; +} + diff --git a/packages/linux/linux-2.6.28/collie/0001-collie-start-scoop-converton-to-new-api.patch b/packages/linux/linux-2.6.28/collie/0001-collie-start-scoop-converton-to-new-api.patch new file mode 100644 index 0000000000..51c161f99d --- /dev/null +++ b/packages/linux/linux-2.6.28/collie/0001-collie-start-scoop-converton-to-new-api.patch @@ -0,0 +1,106 @@ +From 4765c85914d55590c6d17b6cf9e6f7964d1af108 Mon Sep 17 00:00:00 2001 +From: Dmitry Baryshkov <dbaryshkov@gmail.com> +Date: Tue, 28 Oct 2008 21:41:39 +0300 +Subject: [PATCH 01/23] collie: start scoop converton to new api + +Start converting scoop gpio access to new API instead of old +deprecated one. + +Signed-off-by: Dmitry Baryshkov <dbaryshkov@gmail.com> +--- + arch/arm/mach-sa1100/collie.c | 28 +++++++++++++++++++++++----- + arch/arm/mach-sa1100/include/mach/collie.h | 7 ++++--- + 2 files changed, 27 insertions(+), 8 deletions(-) + +diff --git a/arch/arm/mach-sa1100/collie.c b/arch/arm/mach-sa1100/collie.c +index fe28999..8cf267f 100644 +--- a/arch/arm/mach-sa1100/collie.c ++++ b/arch/arm/mach-sa1100/collie.c +@@ -25,6 +25,7 @@ + #include <linux/mtd/mtd.h> + #include <linux/mtd/partitions.h> + #include <linux/timer.h> ++#include <linux/gpio.h> + + #include <mach/hardware.h> + #include <asm/mach-types.h> +@@ -55,6 +56,7 @@ static struct resource collie_scoop_resources[] = { + static struct scoop_config collie_scoop_setup = { + .io_dir = COLLIE_SCOOP_IO_DIR, + .io_out = COLLIE_SCOOP_IO_OUT, ++ .gpio_base = COLLIE_SCOOP_GPIO_BASE, + }; + + struct platform_device colliescoop_device = { +@@ -196,18 +198,34 @@ static struct mtd_partition collie_partitions[] = { + } + }; + ++static int collie_flash_init(void) ++{ ++ int rc; ++ rc = gpio_request(COLLIE_GPIO_VPEN, "flash Vpp enable"); ++ if (rc) ++ return rc; ++ ++ rc = gpio_direction_output(COLLIE_GPIO_VPEN, 1); ++ if (rc) ++ gpio_free(COLLIE_GPIO_VPEN); ++ ++ return rc; ++} ++ + static void collie_set_vpp(int vpp) + { +- write_scoop_reg(&colliescoop_device.dev, SCOOP_GPCR, read_scoop_reg(&colliescoop_device.dev, SCOOP_GPCR) | COLLIE_SCP_VPEN); +- if (vpp) +- write_scoop_reg(&colliescoop_device.dev, SCOOP_GPWR, read_scoop_reg(&colliescoop_device.dev, SCOOP_GPWR) | COLLIE_SCP_VPEN); +- else +- write_scoop_reg(&colliescoop_device.dev, SCOOP_GPWR, read_scoop_reg(&colliescoop_device.dev, SCOOP_GPWR) & ~COLLIE_SCP_VPEN); ++ gpio_set_value(COLLIE_GPIO_VPEN, vpp); + } + ++static void collie_flash_exit(void) ++{ ++ gpio_free(COLLIE_GPIO_VPEN); ++} + static struct flash_platform_data collie_flash_data = { + .map_name = "cfi_probe", ++ .init = collie_flash_init, + .set_vpp = collie_set_vpp, ++ .exit = collie_flash_exit, + .parts = collie_partitions, + .nr_parts = ARRAY_SIZE(collie_partitions), + }; +diff --git a/arch/arm/mach-sa1100/include/mach/collie.h b/arch/arm/mach-sa1100/include/mach/collie.h +index 69e9624..9bc5349 100644 +--- a/arch/arm/mach-sa1100/include/mach/collie.h ++++ b/arch/arm/mach-sa1100/include/mach/collie.h +@@ -14,6 +14,7 @@ + #define __ASM_ARCH_COLLIE_H + + ++#define COLLIE_SCOOP_GPIO_BASE (GPIO_MAX + 1) + #define COLLIE_SCP_CHARGE_ON SCOOP_GPCR_PA11 + #define COLLIE_SCP_DIAG_BOOT1 SCOOP_GPCR_PA12 + #define COLLIE_SCP_DIAG_BOOT2 SCOOP_GPCR_PA13 +@@ -21,13 +22,13 @@ + #define COLLIE_SCP_MUTE_R SCOOP_GPCR_PA15 + #define COLLIE_SCP_5VON SCOOP_GPCR_PA16 + #define COLLIE_SCP_AMP_ON SCOOP_GPCR_PA17 +-#define COLLIE_SCP_VPEN SCOOP_GPCR_PA18 ++#define COLLIE_GPIO_VPEN (COLLIE_SCOOP_GPIO_BASE + 7) + #define COLLIE_SCP_LB_VOL_CHG SCOOP_GPCR_PA19 + + #define COLLIE_SCOOP_IO_DIR ( COLLIE_SCP_CHARGE_ON | COLLIE_SCP_MUTE_L | COLLIE_SCP_MUTE_R | \ +- COLLIE_SCP_5VON | COLLIE_SCP_AMP_ON | COLLIE_SCP_VPEN | \ ++ COLLIE_SCP_5VON | COLLIE_SCP_AMP_ON | \ + COLLIE_SCP_LB_VOL_CHG ) +-#define COLLIE_SCOOP_IO_OUT ( COLLIE_SCP_MUTE_L | COLLIE_SCP_MUTE_R | COLLIE_SCP_VPEN | \ ++#define COLLIE_SCOOP_IO_OUT ( COLLIE_SCP_MUTE_L | COLLIE_SCP_MUTE_R | \ + COLLIE_SCP_CHARGE_ON ) + + /* GPIOs for which the generic definition doesn't say much */ +-- +1.5.6.5 + diff --git a/packages/linux/linux-2.6.28/collie/0002-add-locomo_spi-driver.patch b/packages/linux/linux-2.6.28/collie/0002-add-locomo_spi-driver.patch new file mode 100644 index 0000000000..7530beee2c --- /dev/null +++ b/packages/linux/linux-2.6.28/collie/0002-add-locomo_spi-driver.patch @@ -0,0 +1,1228 @@ +From dae5d7c71ba47bdd0603d5cc3e8a3dfe28d209a0 Mon Sep 17 00:00:00 2001 +From: Thomas Kunze <thommycheck@gmx.de> +Date: Mon, 20 Oct 2008 17:30:32 +0200 +Subject: [PATCH 02/23] add locomo_spi driver + +--- + drivers/spi/Kconfig | 4 + + drivers/spi/Makefile | 1 + + drivers/spi/locomo_spi.c | 1097 ++++++++++++++++++++++++++++++++++++++++++++++ + drivers/spi/locomo_spi.h | 75 ++++ + 4 files changed, 1177 insertions(+), 0 deletions(-) + create mode 100644 drivers/spi/locomo_spi.c + create mode 100644 drivers/spi/locomo_spi.h + +diff --git a/drivers/spi/Kconfig b/drivers/spi/Kconfig +index b9d0efb..aa3c60a 100644 +--- a/drivers/spi/Kconfig ++++ b/drivers/spi/Kconfig +@@ -123,6 +123,10 @@ config SPI_MPC52xx_PSC + This enables using the Freescale MPC52xx Programmable Serial + Controller in master SPI mode. + ++config SPI_LOCOMO ++ tristate "Locomo SPI master" ++ depends on SPI_MASTER && SHARP_LOCOMO && EXPERIMENTAL ++ + config SPI_MPC83xx + tristate "Freescale MPC83xx/QUICC Engine SPI controller" + depends on (PPC_83xx || QUICC_ENGINE) && EXPERIMENTAL +diff --git a/drivers/spi/Makefile b/drivers/spi/Makefile +index ccf18de..794dd45 100644 +--- a/drivers/spi/Makefile ++++ b/drivers/spi/Makefile +@@ -29,6 +29,7 @@ obj-$(CONFIG_SPI_S3C24XX) += spi_s3c24xx.o + obj-$(CONFIG_SPI_TXX9) += spi_txx9.o + obj-$(CONFIG_SPI_XILINX) += xilinx_spi.o + obj-$(CONFIG_SPI_SH_SCI) += spi_sh_sci.o ++obj-$(CONFIG_SPI_LOCOMO) += locomo_spi.o + # ... add above this line ... + + # SPI protocol drivers (device/link on bus) +diff --git a/drivers/spi/locomo_spi.c b/drivers/spi/locomo_spi.c +new file mode 100644 +index 0000000..d3a4bd9 +--- /dev/null ++++ b/drivers/spi/locomo_spi.c +@@ -0,0 +1,1097 @@ ++#include <asm/io.h> ++#include <asm/irq.h> ++#include <linux/module.h> ++#include <linux/init.h> ++#include <linux/device.h> ++#include <linux/stat.h> ++#include <linux/delay.h> ++#include <linux/wait.h> ++#include <linux/interrupt.h> ++#include <asm/hardware/locomo.h> ++#include <asm/errno.h> ++#include <linux/mmc/host.h> ++#include <linux/spi/spi.h> ++#include <linux/spi/mmc_spi.h> ++#include <linux/workqueue.h> ++#include <linux/spinlock.h> ++#include <linux/list.h> ++#include "locomo_spi.h" ++static struct locomospi_dev * spidev; ++static struct work_struct transfer_wq; ++int delay; ++ ++char* transtxbuf=(char*)NULL; ++char* transrxbuf=(char*)NULL; ++int transfercount=0, transfersize=0; ++static DECLARE_WAIT_QUEUE_HEAD(transferqueue); ++/* MMC_SPI functions *********************************************************/ ++ ++static int locomommcspi_init(struct device *dev, irqreturn_t (*isr)(int, void*), void *mmc) ++{ ++ int result; ++ result=request_irq(IRQ_LOCOMO_CARDDETECT, isr, IRQF_TRIGGER_FALLING | IRQF_TRIGGER_RISING, "locomo-spi", mmc); ++ return result; ++} ++ ++static void locomommcspi_exit(struct device *dev, void* mmc) ++{ ++ free_irq(IRQ_LOCOMO_CARDDETECT, mmc); ++} ++ ++static int locomommcspi_getro(struct device *dev) ++{ ++ return locomo_gpio_read_level(spidev->ldev->dev.parent,LOCOMO_GPIO_WRITE_PROT) > 0 ? 1 : 0; ++} ++ ++static void locomommcspi_setpower(struct device *dev, unsigned int mask) ++{ ++ if(!mask && spidev->card_power) ++ locomospi_power(0); ++ else if( !spidev->card_power ) ++ locomospi_power(1); ++ ++} ++ ++ ++static struct mmc_spi_platform_data colliemmc ={ ++ .init = locomommcspi_init, ++ .exit = locomommcspi_exit, ++ .detect_delay = 200, ++ .get_ro = locomommcspi_getro, ++ .ocr_mask = MMC_VDD_32_33 | MMC_VDD_33_34, ++ .setpower = locomommcspi_setpower, ++ .powerup_msecs = 200, ++}; ++ ++/* Utility function **********************************************************/ ++ ++static void locomospi_power(int on) ++{ ++ locomo_gpio_write(spidev->ldev->dev.parent, LOCOMO_GPIO_CARD_POWER, on); ++ spidev->card_power=on; ++ printk(KERN_DEBUG "locomospi: power %d\n",on); ++} ++ ++static void locomospi_setclock(unsigned int div, unsigned int clock) ++{ ++ u16 r = ioread16(spidev->base+LOCOMO_SPIMD); ++ div &= 0x7; ++ clock &= 0x3; ++ if(clock != spidev->clock_base || div != spidev->clock_div){ ++ r &= ~(LOCOMO_SPI_XSEL | LOCOMO_SPI_CLKSEL | LOCOMO_SPI_XEN); ++ iowrite16(r,spidev->base+LOCOMO_SPIMD); ++ r |= (div | (clock <<3) | LOCOMO_SPI_XEN); ++ iowrite16(r,spidev->base+LOCOMO_SPIMD); ++ spidev->clock_div = div; ++ spidev->clock_base = clock; ++ udelay(300); ++ } ++ ++} ++// returns 1 if card ist present, 0 otherwise ++static int locomospi_carddetect() ++{ ++ return (locomo_gpio_read_level(spidev->ldev->dev.parent,LOCOMO_GPIO_CARD_DETECT)>0)?0:1; ++} ++ ++static void locomospi_setcs(int high) ++{ ++ u16 r; ++ printk(KERN_DEBUG "locomospi: cs %d\n",high); ++ r = ioread16(spidev->base + LOCOMO_SPICT); ++ if(high) ++ r |= LOCOMO_SPI_CS; ++ else ++ r &= ~LOCOMO_SPI_CS; ++ iowrite16(r, spidev->base + LOCOMO_SPICT); ++} ++ ++static void locomospi_reg_open() ++{ ++ u16 r; ++ spidev->clock_div = DIV_64; ++ spidev->clock_base = CLOCK_18MHZ; ++ locomospi_power(1); ++ msleep(100); ++// iowrite16( 0xec00 | (CLOCK_18MHZ <<3)|DIV_64, spidev->base+LOCOMO_SPIMD); ++ iowrite16( LOCOMO_SPI_MSB1ST | LOCOMO_SPI_DOSTAT | LOCOMO_SPI_RCPOL | LOCOMO_SPI_TCPOL ++ |(CLOCK_18MHZ <<3) | DIV_64, spidev->base+LOCOMO_SPIMD); ++// if(locomospi_carddetect()){ ++ r = ioread16(spidev->base+LOCOMO_SPIMD); ++ r |= LOCOMO_SPI_XON; ++ iowrite16( r, spidev->base+LOCOMO_SPIMD); ++ r = ioread16(spidev->base+LOCOMO_SPIMD); ++ r |= LOCOMO_SPI_XEN; ++ iowrite16( r, spidev->base+LOCOMO_SPIMD); ++// } ++ iowrite16( LOCOMO_SPI_CS, spidev->base+LOCOMO_SPICT); ++ r = ioread16(spidev->base+LOCOMO_SPICT); ++ r |= (LOCOMO_SPI_CEN | LOCOMO_SPI_RXUEN | LOCOMO_SPI_ALIGNEN); ++ iowrite16( r, spidev->base+LOCOMO_SPICT); ++ udelay(200); ++ r = ioread16(spidev->base+LOCOMO_SPICT); ++ iowrite16(r, spidev->base+LOCOMO_SPICT); ++ r = ioread16(spidev->base+LOCOMO_SPICT); ++ r &= ~LOCOMO_SPI_CS; ++ iowrite16(r, spidev->base+LOCOMO_SPICT); ++} ++ ++static void locomospi_reg_release() ++{ ++ u16 r; ++ r = ioread16(spidev->base+LOCOMO_SPICT); ++ r &= ~LOCOMO_SPI_CEN; ++ iowrite16(r, spidev->base+LOCOMO_SPICT); ++ r = ioread16(spidev->base+LOCOMO_SPIMD); ++ r &= ~LOCOMO_SPI_XEN; ++ iowrite16(r, spidev->base+LOCOMO_SPIMD); ++ r = ioread16(spidev->base+LOCOMO_SPIMD); ++ r &= ~LOCOMO_SPI_XON; ++ iowrite16(r, spidev->base+LOCOMO_SPIMD); ++ r = ioread16(spidev->base+LOCOMO_SPICT); ++ r |= LOCOMO_SPI_XEN; ++ iowrite16(r, spidev->base+LOCOMO_SPICT); ++ locomospi_power(0); ++} ++#if 0 ++static int txrx(const char* txbuffer, char* rxbuffer, int size) ++{ ++ u16 r = ioread16(spidev->base+LOCOMO_SPICT); ++ r |= LOCOMO_SPI_ALIGNEN; ++ iowrite16(r, spidev->base+LOCOMO_SPICT); ++ printk(KERN_DEBUG "locomospi: %d bytes to prozess\n",size); ++ /* initialize global vars for isr */ ++ transfercount=0; transfersize=size; ++ transtxbuf=txbuffer; transrxbuf=rxbuffer; ++ ++ /* start transmit and go sleep isr will wake us*/ ++ enable_irq(IRQ_LOCOMO_SPI_TEND); ++ iowrite8(txbuffer[0], spidev->base+LOCOMO_SPITD); ++ wait_event(transferqueue, transfercount >= transfersize); ++ disable_irq(IRQ_LOCOMO_SPI_TEND); ++ transrxbuf=NULL; transtxbuf=NULL; ++ ++ r = ioread16(spidev->base+LOCOMO_SPICT); ++ r &= ~LOCOMO_SPI_ALIGNEN; ++ iowrite16(r, spidev->base+LOCOMO_SPICT); ++ int i; ++ for(i=0; i< size; i++) ++ printk(KERN_DEBUG "locomospi: sent: %x received: %x \n",txbuffer[i], rxbuffer[i]); ++ ++ ++ return size; ++} ++ ++ ++static int tx(const char* txbuffer, int size) ++{ ++ printk(KERN_DEBUG "locomospi: %d bytes to send\n",size); ++ /* initialize global vars for isr */ ++ transfercount=0; transfersize=size; ++ transtxbuf=txbuffer; ++ ++ /* start transmit and go sleep isr will wake us*/ ++ enable_irq(IRQ_LOCOMO_SPI_RFW); ++ iowrite8(txbuffer[0], spidev->base+LOCOMO_SPITD); ++ wait_event(transferqueue, transfercount >= transfersize); ++ disable_irq(IRQ_LOCOMO_SPI_RFW); ++ transtxbuf=NULL; ++ ++ int i; ++ for(i=0; i< size; i++) ++ printk(KERN_DEBUG "locomospi: sent: %x\n",txbuffer[i]); ++ ++ ++ return size; ++} ++ ++static int rx(char* rxbuffer, int size) ++{ ++ printk(KERN_DEBUG "locomospi: %d bytes to read\n",size); ++ /* initialize global vars for isr */ ++ transfercount=0; transfersize=size; ++ transrxbuf=rxbuffer; ++ ++ /* start transmit and go sleep isr will wake us*/ ++ enable_irq(IRQ_LOCOMO_SPI_RFR); ++ rxbuffer[0]=ioread8(spidev->base+LOCOMO_SPIRD); ++ wait_event(transferqueue, transfercount >= transfersize); ++ disable_irq(IRQ_LOCOMO_SPI_RFR); ++ transrxbuf=NULL; ++ ++ int i; ++ for(i=0; i< size; i++) ++ printk(KERN_DEBUG "locomospi: received: %x \n", rxbuffer[i]); ++ ++ ++ return size; ++} ++ ++#else ++static int txrx(const char* txbuffer, char* rxbuffer, int size) ++{ ++ int i=0,j=0; ++ int wait; ++ u16 r; ++/* char * txback = kmalloc(size * sizeof(char), GFP_KERNEL); ++ memcpy(txback, txbuffer, size); ++*/ ++ if(spidev->clock_div == 4) ++ wait = 0x10000; ++ else ++ wait = 8; ++ ++// printk(KERN_DEBUG "locomospi: txrx %d bytes to prozess\n",size); ++ ++// r = ioread16(spidev->base+LOCOMO_SPICT); ++// r |= LOCOMO_SPI_ALIGNEN; ++// iowrite16(r, spidev->base+LOCOMO_SPICT); ++ //discard first bogus byte ++ ++ ioread8(spidev->base+LOCOMO_SPIRD); ++ for(i=0; i<size; i++){ ++ for(j=0; j <= wait; j++){ ++ if(ioread16(spidev->base+LOCOMO_SPIST) & LOCOMO_SPI_RFW) ++ break; ++ } ++ iowrite8(txbuffer[i], spidev->base+LOCOMO_SPITD); ++ ndelay(delay); ++ ++ for(j=0; j <= wait; j++){ ++ if(ioread16(spidev->base+LOCOMO_SPIST) & LOCOMO_SPI_RFR) ++ break; ++ } ++ rxbuffer[i] = ioread8(spidev->base+LOCOMO_SPIRD); ++ ndelay(delay); ++ } ++// r = ioread16(spidev->base+LOCOMO_SPICT); ++// r &= ~LOCOMO_SPI_ALIGNEN; ++// iowrite16(r, spidev->base+LOCOMO_SPICT); ++ ++/* for(j=0; j< size; j++) ++ printk(KERN_DEBUG "locomospi: sent: %x received: %x \n",txback[j], rxbuffer[j]); ++ ++ kfree(txback); ++*/ return i; ++} ++ ++static int tx(const char* buffer, int size) ++{ ++ int i=0,j=0; ++ int wait; ++ u16 r; ++ if(spidev->clock_div == 4) ++ wait = 0x10000; ++ else ++ wait = 8; ++ r = ioread16(spidev->base+LOCOMO_SPICT); ++ r &= ~LOCOMO_SPI_ALIGNEN; ++ iowrite16(r, spidev->base+LOCOMO_SPICT); ++ ++// printk(KERN_DEBUG "locomospi: tx %d bytes to transmit\n",size); ++ for(i=0; i<size; i++){ ++ for(j=0; j <= wait; j++){ ++ if(ioread16(spidev->base+LOCOMO_SPIST) & LOCOMO_SPI_RFW) ++ break; ++ } ++ iowrite8(buffer[i], spidev->base+LOCOMO_SPITD); ++ ndelay(delay); ++ } ++ ++ for(j=0; j <= wait; j++){ ++ if(ioread16(spidev->base+LOCOMO_SPIST) & LOCOMO_SPI_TEND) ++ break; ++ } ++ ++ r = ioread16(spidev->base+LOCOMO_SPICT); ++ r |= LOCOMO_SPI_ALIGNEN; ++ iowrite16(r, spidev->base+LOCOMO_SPICT); ++ ++// for(j=0; j< size; j++) ++// printk(KERN_DEBUG "locomospi: sent: %x \n", buffer[j]); ++// printk(KERN_DEBUG "locomospi: tx %d bytes transmitted\n",i); ++ return i; ++} ++ ++static int rx(char* buffer, int size) ++{ ++ int i,j; ++ int wait; ++ u16 r; ++ printk(KERN_DEBUG "locomospi: rx %d bytes to receive\n",size); ++ if(spidev->clock_div == 4) ++ wait = 0x10000; ++ else ++ wait = 8; ++ r = ioread16(spidev->base+LOCOMO_SPICT); ++ r &= ~LOCOMO_SPI_ALIGNEN; ++ iowrite16(r, spidev->base+LOCOMO_SPICT); ++ ++ for(i=0; i<size; i++){ ++ ++ for(j=0; j <= wait; j++){ ++ if(ioread16(spidev->base+LOCOMO_SPIST) & LOCOMO_SPI_RFR) ++ break; ++ } ++ buffer[i]= ioread8(spidev->base+LOCOMO_SPIRD); ++ ndelay(delay); ++ } ++ ++ r = ioread16(spidev->base+LOCOMO_SPICT); ++ r |= LOCOMO_SPI_ALIGNEN; ++ iowrite16(r, spidev->base+LOCOMO_SPICT); ++ ++ for(j=0; j< size; j++) ++ printk(KERN_DEBUG "locomospi: received: %x \n", buffer[j]); ++ printk(KERN_DEBUG "locomospi: rx %d bytes received\n",i); ++ return i; ++} ++#endif ++/* ++static irqreturn_t locomospi_rwready(int irq, void *dev_id) ++{ ++ struct locomospi_dev* dev=(struct locomospi_dev*) dev_id; ++// dev_dbg(&spidev->sdev->dev, "IRQ: %d\n", irq); ++// printk(KERN_DEBUG "locomospi: IRQ: %d\n", irq); ++ wake_up_interruptible(&dev->waitqueue); ++ return IRQ_HANDLED; ++} ++*/ ++static irqreturn_t locomospi_testisr(int irq, void *dev_id) ++{ ++ char *buf=""; ++ switch(irq){ ++ case IRQ_LOCOMO_SPI_RFR: buf="RFR"; ++ break; ++ case IRQ_LOCOMO_SPI_RFW: buf="RFW"; ++ break; ++ case IRQ_LOCOMO_SPI_REND:buf="REND"; ++ break; ++ case IRQ_LOCOMO_SPI_TEND:buf="TEND"; ++ break; ++ case IRQ_LOCOMO_CARDDETECT: ++ buf="CARD_DETECT"; ++ break; ++ default: return IRQ_NONE; ++ } ++ printk(KERN_DEBUG "locomospi: IRQ: %s\n",buf); ++// dev_dbg(&spidev->sdev->dev, "IRQ: %s\n",buf); ++ return IRQ_HANDLED; ++} ++static irqreturn_t locomospi_txrxisr(int irq, void *dev_id) ++{ ++ if(transfercount < transfersize){ ++ transrxbuf[transfercount++] = ioread8(spidev->base+LOCOMO_SPIRD); ++ iowrite8(transtxbuf[transfercount], spidev->base+LOCOMO_SPITD); ++ } ++ else{ ++ /* transfer complete. wake up txrx */ ++ wake_up(&transferqueue); ++ } ++ return IRQ_HANDLED; ++} ++ ++static irqreturn_t locomospi_txisr(int irq, void *dev_id) ++{ ++ if(transfercount < transfersize){ ++ iowrite8(transtxbuf[transfercount++], spidev->base+LOCOMO_SPITD); ++ } ++ else{ ++ /* transfer complete. wake up txrx */ ++ wake_up(&transferqueue); ++ } ++ return IRQ_HANDLED; ++} ++ ++static irqreturn_t locomospi_rxisr(int irq, void *dev_id) ++{ ++ if(transfercount < transfersize){ ++ transrxbuf[transfercount++] = ioread8(spidev->base+LOCOMO_SPIRD); ++ } ++ else{ ++ /* transfer complete. wake up txrx */ ++ wake_up(&transferqueue); ++ } ++ return IRQ_HANDLED; ++} ++ ++static void locomospi_clock(unsigned int Hz) ++{ ++ u16 r; ++ printk(KERN_DEBUG "locomospi: changing clock to: %d\n", Hz); ++ if(Hz == 0){ ++ r = ioread16(spidev->base+LOCOMO_SPIMD); ++ r &= ~LOCOMO_SPI_XON; ++ iowrite16(r, spidev->base+LOCOMO_SPIMD); ++ } ++ else if(Hz >= 24576000){ ++ r = ioread16(spidev->base+LOCOMO_SPIMD); ++ r |= LOCOMO_SPI_XON; ++ iowrite16(r, spidev->base+LOCOMO_SPIMD); ++ locomospi_setclock(DIV_1, CLOCK_25MHZ); ++ delay=41; ++ } ++ else if(Hz >= 22579200){ ++ r = ioread16(spidev->base+LOCOMO_SPIMD); ++ r |= LOCOMO_SPI_XON; ++ iowrite16(r, spidev->base+LOCOMO_SPIMD); ++ locomospi_setclock(DIV_1, CLOCK_22MHZ); ++ delay=45; ++ } ++ else if(Hz >= 18432000){ ++ r = ioread16(spidev->base+LOCOMO_SPIMD); ++ r |= LOCOMO_SPI_XON; ++ iowrite16(r, spidev->base+LOCOMO_SPIMD); ++ locomospi_setclock(DIV_1, CLOCK_18MHZ); ++ delay=55; ++ } ++ else if(Hz >= 12288000){ ++ r = ioread16(spidev->base+LOCOMO_SPIMD); ++ r |= LOCOMO_SPI_XON; ++ iowrite16(r, spidev->base+LOCOMO_SPIMD); ++ locomospi_setclock(DIV_2, CLOCK_25MHZ); ++ delay=82; ++ } ++ else if(Hz >= 11289600){ ++ r = ioread16(spidev->base+LOCOMO_SPIMD); ++ r |= LOCOMO_SPI_XON; ++ iowrite16(r, spidev->base+LOCOMO_SPIMD); ++ locomospi_setclock(DIV_2, CLOCK_22MHZ); ++ delay=89; ++ } ++ else if(Hz >= 9216000){ ++ r = ioread16(spidev->base+LOCOMO_SPIMD); ++ r |= LOCOMO_SPI_XON; ++ iowrite16(r, spidev->base+LOCOMO_SPIMD); ++ locomospi_setclock(DIV_2, CLOCK_18MHZ); ++ delay=110; ++ } ++ else if(Hz >= 6144000){ ++ r = ioread16(spidev->base+LOCOMO_SPIMD); ++ r |= LOCOMO_SPI_XON; ++ iowrite16(r, spidev->base+LOCOMO_SPIMD); ++ locomospi_setclock(DIV_4, CLOCK_25MHZ); ++ delay=164; ++ } ++ else if(Hz >= 5644800){ ++ r = ioread16(spidev->base+LOCOMO_SPIMD); ++ r |= LOCOMO_SPI_XON; ++ iowrite16(r, spidev->base+LOCOMO_SPIMD); ++ locomospi_setclock(DIV_4, CLOCK_22MHZ); ++ delay=178; ++ } ++ else if(Hz >= 4608000){ ++ r = ioread16(spidev->base+LOCOMO_SPIMD); ++ r |= LOCOMO_SPI_XON; ++ iowrite16(r, spidev->base+LOCOMO_SPIMD); ++ locomospi_setclock(DIV_4, CLOCK_18MHZ); ++ delay=218; ++ } ++ else if(Hz >= 3072000){ ++ r = ioread16(spidev->base+LOCOMO_SPIMD); ++ r |= LOCOMO_SPI_XON; ++ iowrite16(r, spidev->base+LOCOMO_SPIMD); ++ locomospi_setclock(DIV_8, CLOCK_25MHZ); ++ delay=327; ++ } ++ else if(Hz >= 2822400){ ++ r = ioread16(spidev->base+LOCOMO_SPIMD); ++ r |= LOCOMO_SPI_XON; ++ iowrite16(r, spidev->base+LOCOMO_SPIMD); ++ locomospi_setclock(DIV_8, CLOCK_22MHZ); ++ delay=355; ++ } ++ else if(Hz >= 2304000){ ++ r = ioread16(spidev->base+LOCOMO_SPIMD); ++ r |= LOCOMO_SPI_XON; ++ iowrite16(r, spidev->base+LOCOMO_SPIMD); ++ locomospi_setclock(DIV_8, CLOCK_18MHZ); ++ delay=435; ++ } ++ else if(Hz >= 384000){ ++ r = ioread16(spidev->base+LOCOMO_SPIMD); ++ r |= LOCOMO_SPI_XON; ++ iowrite16(r, spidev->base+LOCOMO_SPIMD); ++ locomospi_setclock(DIV_64, CLOCK_25MHZ); ++ delay=2605; ++ } ++ else if(Hz >= 352800){ ++ r = ioread16(spidev->base+LOCOMO_SPIMD); ++ r |= LOCOMO_SPI_XON; ++ iowrite16(r, spidev->base+LOCOMO_SPIMD); ++ locomospi_setclock(DIV_64, CLOCK_22MHZ); ++ delay=2834; ++ } ++ else{ /* set to 288 KHz */ ++ r = ioread16(spidev->base+LOCOMO_SPIMD); ++ r |= LOCOMO_SPI_XON; ++ iowrite16(r, spidev->base+LOCOMO_SPIMD); ++ locomospi_setclock(DIV_64, CLOCK_18MHZ); ++ delay=3473; ++ } ++ spidev->clock = Hz; ++} ++ ++/* sysfs attributes used for debug *******************************************/ ++ ++/* SPI registers */ ++ssize_t locomospi_showspimd(struct device_driver *drv, char *buf) ++{ ++ return sprintf(buf, "0x%x\n", ioread16(spidev->base+LOCOMO_SPIMD)); ++} ++ ++ssize_t locomospi_storespimd(struct device_driver *drv, const char *buf, size_t count) ++{ ++ iowrite16(simple_strtoul(buf, NULL, 16), spidev->base+LOCOMO_SPIMD); ++ return count; ++} ++static DRIVER_ATTR(spimd, S_IWUSR | S_IRUGO, locomospi_showspimd, locomospi_storespimd); ++ ++ssize_t locomospi_showspict(struct device_driver *drv, char *buf) ++{ ++ return sprintf(buf, "0x%x\n", ioread16(spidev->base+LOCOMO_SPICT)); ++} ++ ++ssize_t locomospi_storespict(struct device_driver *drv, const char *buf, size_t count) ++{ ++ iowrite16(simple_strtoul(buf, NULL, 16), spidev->base+LOCOMO_SPICT); ++ return count; ++} ++static DRIVER_ATTR(spict, S_IWUSR | S_IRUGO, locomospi_showspict, locomospi_storespict); ++ ++ssize_t locomospi_showspist(struct device_driver *drv, char *buf) ++{ ++ return sprintf(buf, "0x%x\n", ioread16(spidev->base+LOCOMO_SPIST)); ++} ++ ++ssize_t locomospi_storespist(struct device_driver *drv, const char *buf, size_t count) ++{ ++ iowrite16(simple_strtoul(buf, NULL, 16), spidev->base+LOCOMO_SPIST); ++ return count; ++} ++static DRIVER_ATTR(spist, S_IWUSR | S_IRUGO, locomospi_showspist, locomospi_storespist); ++ ++ssize_t locomospi_showspitd(struct device_driver *drv, char *buf) ++{ ++ return sprintf(buf, "0x%x\n", ioread16(spidev->base+LOCOMO_SPITD)); ++} ++ ++ssize_t locomospi_storespitd(struct device_driver *drv, const char *buf, size_t count) ++{ ++ iowrite16(simple_strtoul(buf, NULL, 16), spidev->base+LOCOMO_SPITD); ++ return count; ++} ++static DRIVER_ATTR(spitd, S_IWUSR | S_IRUGO, locomospi_showspitd, locomospi_storespitd); ++ ++ssize_t locomospi_showspird(struct device_driver *drv, char *buf) ++{ ++ return sprintf(buf, "0x%x\n", ioread16(spidev->base+LOCOMO_SPIRD)); ++} ++ ++ssize_t locomospi_storespird(struct device_driver *drv, const char *buf, size_t count) ++{ ++ iowrite16(simple_strtoul(buf, NULL, 16), spidev->base+LOCOMO_SPIRD); ++ return count; ++} ++static DRIVER_ATTR(spird, S_IWUSR | S_IRUGO, locomospi_showspird, locomospi_storespird); ++ ++ssize_t locomospi_showspits(struct device_driver *drv, char *buf) ++{ ++ return sprintf(buf, "0x%x\n", ioread16(spidev->base+LOCOMO_SPITS)); ++} ++ ++ssize_t locomospi_storespits(struct device_driver *drv, const char *buf, size_t count) ++{ ++ iowrite16(simple_strtoul(buf, NULL, 16), spidev->base+LOCOMO_SPITS); ++ return count; ++} ++static DRIVER_ATTR(spits, S_IWUSR | S_IRUGO, locomospi_showspits, locomospi_storespits); ++ ++ssize_t locomospi_showspirs(struct device_driver *drv, char *buf) ++{ ++ return sprintf(buf, "0x%x\n", ioread16(spidev->base+LOCOMO_SPIRS)); ++} ++ ++ssize_t locomospi_storespirs(struct device_driver *drv, const char *buf, size_t count) ++{ ++ iowrite16(simple_strtoul(buf, NULL, 16), spidev->base+LOCOMO_SPIRS); ++ return count; ++} ++static DRIVER_ATTR(spirs, S_IWUSR | S_IRUGO, locomospi_showspirs, locomospi_storespirs); ++ ++/* MMC Card status */ ++ ++ssize_t locomospi_showpower(struct device_driver *drv, char *buf) ++{ ++ return sprintf(buf, "%d\n", spidev->card_power); ++} ++ ++ssize_t locomospi_storepower(struct device_driver *drv, const char *buf, size_t count) ++{ ++ locomospi_power(simple_strtoul(buf, NULL, 10)); ++ return count; ++} ++static DRIVER_ATTR(cardpower, S_IWUSR | S_IRUGO, locomospi_showpower, locomospi_storepower); ++ ++ssize_t locomospi_detectcard(struct device_driver *drv, char *buf) ++{ ++ return sprintf(buf, "%d\n",(locomo_gpio_read_level(spidev->ldev->dev.parent,LOCOMO_GPIO_CARD_DETECT)>0)?0:1); ++} ++static DRIVER_ATTR(carddetect, S_IRUGO, locomospi_detectcard, NULL); ++ ++ssize_t locomospi_writeprotect(struct device_driver *drv, char *buf) ++{ ++ return sprintf(buf, "%d\n",(locomo_gpio_read_level(spidev->ldev->dev.parent,LOCOMO_GPIO_WRITE_PROT)>0)?1:0); ++} ++static DRIVER_ATTR(cardwriteprotect, S_IRUGO, locomospi_writeprotect, NULL); ++ ++ ++ssize_t locomospi_showclock(struct device_driver *drv, char *buf) ++{ ++ return sprintf(buf, "%d\n", spidev->clock); ++} ++ ++ssize_t locomospi_storeclock(struct device_driver *drv, const char *buf, size_t count) ++{ ++ locomospi_clock(simple_strtoul(buf, NULL, 10)); ++ return count; ++} ++static DRIVER_ATTR(clock, S_IWUSR | S_IRUGO, locomospi_showclock, locomospi_storeclock); ++ ++/* debug */ ++ssize_t locomospi_showdelay(struct device_driver *drv, char *buf) ++{ ++ return sprintf(buf, "%d\n", delay); ++} ++ ++ssize_t locomospi_storedelay(struct device_driver *drv, const char *buf, size_t count) ++{ ++ delay=simple_strtoul(buf,NULL,10); ++ return count; ++} ++static DRIVER_ATTR(delay, S_IWUSR | S_IRUGO, locomospi_showdelay, locomospi_storedelay); ++ ++ssize_t locomospi_reset(struct device_driver *drv, const char *buf, size_t count) ++{ ++ int choice = simple_strtoul(buf, NULL, 10); ++ char buff[100]; ++ u16 r; ++ switch(choice){ ++ case 0: locomospi_reg_release(); ++ schedule_timeout(2*HZ); ++ locomospi_reg_open(); ++ break; ++ case 1: { ++ char b1[] = "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"; ++ char b2[] = "\xff\x40\x00\x00\x00\x00\x95\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"; ++ locomospi_setcs(1); ++ txrx(b1,b1,17); ++ locomospi_setcs(0); ++ txrx(b2,b2,18); ++ ++ } ++ break; ++ case 2: locomospi_setcs(1); ++ txrx("\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff",buff,18); ++ locomospi_setcs(0); ++ txrx("\xff\x40\x00\x00\x00\x00\x95\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff",buff,17); ++ break; ++ case 3: ++ r = ioread16(spidev->base+LOCOMO_SPIMD); ++ r |= LOCOMO_SPI_LOOPBACK; ++ iowrite16(r, spidev->base+LOCOMO_SPIMD); ++ txrx("X",buff,1); ++ txrx("abcdefghijklmnopqrstuvwxyz1234567890",buff,36); ++ txrx("Y",buff,1); ++ udelay(100); ++ txrx("Z",buff,1); ++ schedule_timeout(HZ); ++ txrx("abcdefghijklmnopqrstuvwxyz1234567890",buff,36); ++ ++ r = ioread16(spidev->base+LOCOMO_SPIMD); ++ r &= ~LOCOMO_SPI_LOOPBACK; ++ iowrite16(r, spidev->base+LOCOMO_SPIMD); ++ break; ++ default: /* do nothing */; ++ } ++ return count; ++} ++static DRIVER_ATTR(reset, S_IWUSR, NULL, locomospi_reset); ++ ++typedef struct locomo_reg_entry { ++ u32 addr; ++ char* name; ++} locomo_reg_entry_t; ++#define LCM (sizeof(locomo_regs)/sizeof(locomo_reg_entry_t)) ++static locomo_reg_entry_t locomo_regs[] = ++{ ++/* { addr, name, description } */ ++ { 0x00, "VER" }, ++ { 0x04, "ST" }, ++ { 0x08, "C32K" }, ++ { 0x0C, "ICR" }, ++ { 0x10, "MCSX0" }, ++ { 0x14, "MCSX1" }, ++ { 0x18, "MCSX2" }, ++ { 0x1C, "MCSX3" }, ++ { 0x20, "ASD" }, ++ { 0x28, "HSD" }, ++ { 0x2C, "HSC" }, ++ { 0x30, "TADC" }, ++ { 0x38, "TC" }, ++ { 0x3C, "CPSD" }, ++ { 0x40, "KIB" }, ++ { 0x44, "KSC" }, ++ { 0x48, "KCMD" }, ++ { 0x4C, "KIC" }, ++ { 0x54, "ACC" }, ++ { 0x60, "SPIMD" }, ++ { 0x64, "SPICT" }, ++ { 0x68, "SPIST" }, ++ { 0x70, "SPIIS" }, ++ { 0x74, "SPIWE" }, ++ { 0x78, "SPIIE" }, ++ { 0x7C, "SPIIR" }, ++ { 0x80, "SPITD" }, ++ { 0x84, "SPIRD" }, ++ { 0x88, "SPITS" }, ++ { 0x8C, "SPIRS" }, ++ { 0x90, "GPD" }, ++ { 0x94, "GPE" }, ++ { 0x98, "GPL" }, ++ { 0x9C, "GPO" }, ++ { 0xa0, "GRIE" }, ++ { 0xa4, "GFIE" }, ++ { 0xa8, "GIS" }, ++ { 0xac, "GWE" }, ++ { 0xb0, "GIE" }, ++ { 0xb4, "GIR" }, ++ { 0xc8, "ALC" }, ++ { 0xcc, "ALR" }, ++ { 0xd0, "PAIF" }, ++ { 0xd8, "LTC" }, ++ { 0xdc, "LTINT" }, ++ { 0xe0, "DAC" }, ++ { 0xe8, "LPT0" }, ++ { 0xec, "LPT1" }, ++ { 0xfc, "TCR" }, ++}; ++ ++static ssize_t lcm_show(struct device *dev, struct device_attribute *attr, char *buf) ++{ ++ int base = spidev->base - LOCOMO_SPI; ++ char b[4000]=""; ++ char c[30]; ++ int i; ++ for(i=0; i<LCM; i++){ ++ sprintf(c,"%s:\t\t 0x%x\n",locomo_regs[i].name, ioread16(base + locomo_regs[i].addr)); ++ strcat(b,c); ++ } ++ return sprintf(buf,"%s",b); ++} ++ ++static DRIVER_ATTR(regs, 0444, lcm_show, NULL); ++ ++ ++/* SPI functions *************************************************************/ ++ ++static void locomospi_do_transfer(struct work_struct *wrk) ++{ ++ struct list_head *mptr, *tptr, *mptr2; ++ struct spi_transfer *entry; ++ struct spi_message *msg; ++ ++ list_for_each_safe(mptr, mptr2, &spidev->message_list){ ++ msg = list_entry(mptr, struct spi_message, queue); ++ ++ msg->status = 0; ++ msg->actual_length = 0; ++ list_for_each(tptr, &msg->transfers){ ++ entry = list_entry(tptr, struct spi_transfer, transfer_list); ++ if(entry->tx_buf && entry->rx_buf){ //duplex ++ txrx((char*) entry->tx_buf, (char*) entry->rx_buf, entry->len); ++ msg->actual_length += entry->len; ++ } else if(entry->tx_buf && !entry->rx_buf){ //write ++ tx((char*) entry->tx_buf, entry->len); ++ msg->actual_length += entry->len; ++ } else if(!entry->tx_buf && entry->rx_buf){ //read ++ rx((char*) entry->rx_buf, entry->len); ++ msg->actual_length += entry->len; ++ } else if(!entry->tx_buf && !entry->rx_buf){ //error ++ dev_err(&spidev->sdev->dev, "do_transfer: no buffers allocated\n"); ++ msg->status = -EFAULT; ++ } ++ } ++ spin_lock(&spidev->message_lock); ++ list_del(mptr); ++ spin_unlock(&spidev->message_lock); ++ msg->complete(msg->context); ++ } ++} ++ ++static int locomospi_setup(struct spi_device *spi) ++{ ++ if((spi->mode & SPI_CS_HIGH) != (spidev->spimode & SPI_CS_HIGH)) ++ locomospi_setcs(spi->mode & SPI_CS_HIGH ? 1 : 0 ); ++ if(spidev->clock != spi->max_speed_hz){ ++ locomospi_clock(spi->max_speed_hz); ++ } ++ spidev->spimode = spi->mode; ++ ++ return 0; ++} ++ ++static int locomospi_transfer(struct spi_device *spi, struct spi_message *msg) ++{ ++ ++ spin_lock(&spidev->message_lock); ++ list_add_tail(&msg->queue, &spidev->message_list); ++ spin_unlock(&spidev->message_lock); ++ schedule_work(&transfer_wq); ++ return 0; ++} ++ ++static struct locomo_driver locomo_spi_driver = { ++ .drv = { ++ .name = "locomo-spi", ++ }, ++ .devid = LOCOMO_DEVID_SPI, ++ .probe = locomospi_probe, ++ .remove = locomospi_remove, ++#ifdef CONFIG_PM ++ .suspend = locomospi_suspend, ++ .resume = locomospi_resume, ++#endif ++}; ++ ++static struct spi_board_info board = { ++ .modalias = "mmc_spi", ++ .platform_data = (void*) &colliemmc, ++ .controller_data= NULL, ++ .irq = 0, ++ .max_speed_hz = 25000000, ++ .bus_num = 0, ++ .chip_select = 0, ++ .mode = 0, ++}; ++ ++#ifdef CONFIG_PM ++static int locomospi_suspend(struct locomo_dev *dev, pm_message_t state) ++{ ++ disable_irq(IRQ_LOCOMO_CARDDETECT); ++ return 0; ++} ++ ++static int locomospi_resume(struct locomo_dev *dev) ++{ ++ enable_irq(IRQ_LOCOMO_CARDDETECT); ++ return 0; ++} ++#endif ++ ++static int locomospi_probe(struct locomo_dev *dev) ++{ ++ int result=0; ++ printk(KERN_DEBUG "Collie MMC over SPI Driver\n"); ++ spidev=kmalloc(sizeof(struct locomospi_dev),GFP_KERNEL); ++ if(!spidev){ ++ return -ENOMEM; ++ } ++ spidev->ldev = dev; ++ spidev->card_power = 1; ++ spidev->spimode = 0; ++ ++ if(!request_mem_region((unsigned long) dev->mapbase, dev->length, LOCOMO_DRIVER_NAME(dev))) { ++ dev_err(&dev->dev, " Can't aquire access to io memory\n"); ++ return -EBUSY; ++ } ++ spidev->base=(unsigned long) dev->mapbase; ++ locomospi_reg_open(); ++ ++ locomo_gpio_set_dir(dev->dev.parent, LOCOMO_GPIO_CARD_POWER, 0); ++ locomo_gpio_set_dir(dev->dev.parent, LOCOMO_GPIO_CARD_DETECT, 1); ++ locomo_gpio_set_dir(dev->dev.parent, LOCOMO_GPIO_WRITE_PROT, 1); ++ ++ result=driver_create_file(&locomo_spi_driver.drv, &driver_attr_cardpower); ++ if(result){ ++ dev_err(&dev->dev, "error creating driver attribute\n"); ++ goto region; ++ } ++ result=driver_create_file(&locomo_spi_driver.drv, &driver_attr_carddetect); ++ if(result){ ++ dev_err(&dev->dev,"error creating driver attribute\n"); ++ goto region; ++ } ++ result=driver_create_file(&locomo_spi_driver.drv, &driver_attr_cardwriteprotect); ++ if(result){ ++ dev_err(&dev->dev, "error creating driver attribute\n"); ++ goto region; ++ } ++ result=driver_create_file(&locomo_spi_driver.drv, &driver_attr_spimd); ++ if(result){ ++ dev_err(&dev->dev, "error creating driver attribute\n"); ++ goto region; ++ } ++ result=driver_create_file(&locomo_spi_driver.drv, &driver_attr_spict); ++ if(result){ ++ dev_err(&dev->dev, "error creating driver attribute\n"); ++ goto region; ++ } ++ result=driver_create_file(&locomo_spi_driver.drv, &driver_attr_spist); ++ if(result){ ++ dev_err(&dev->dev, "error creating driver attribute\n"); ++ goto region; ++ } ++ result=driver_create_file(&locomo_spi_driver.drv, &driver_attr_spitd); ++ if(result){ ++ dev_err(&dev->dev, "error creating driver attribute\n"); ++ goto region; ++ } ++ result=driver_create_file(&locomo_spi_driver.drv, &driver_attr_spird); ++ if(result){ ++ dev_err(&dev->dev, "error creating driver attribute\n"); ++ goto region; ++ } ++ result=driver_create_file(&locomo_spi_driver.drv, &driver_attr_spits); ++ if(result){ ++ dev_err(&dev->dev, "error creating driver attribute\n"); ++ goto region; ++ } ++ result=driver_create_file(&locomo_spi_driver.drv, &driver_attr_spirs); ++ if(result){ ++ dev_err(&dev->dev, "error creating driver attribute\n"); ++ goto region; ++ } ++ result=driver_create_file(&locomo_spi_driver.drv, &driver_attr_clock); ++ if(result){ ++ dev_err(&dev->dev, "error creating driver attribute\n"); ++ goto region; ++ } ++ result=driver_create_file(&locomo_spi_driver.drv, &driver_attr_delay); ++ if(result){ ++ dev_err(&dev->dev, "error creating driver attribute\n"); ++ goto region; ++ } ++ result=driver_create_file(&locomo_spi_driver.drv, &driver_attr_reset); ++ if(result){ ++ dev_err(&dev->dev, "error creating driver attribute\n"); ++ goto region; ++ } ++ result=driver_create_file(&locomo_spi_driver.drv, &driver_attr_regs); ++ if(result){ ++ dev_err(&dev->dev, "error creating driver attribute\n"); ++ goto region; ++ } ++ INIT_WORK(&transfer_wq, locomospi_do_transfer); ++ INIT_LIST_HEAD(&spidev->message_list); ++ spin_lock_init(&spidev->message_lock); ++ init_waitqueue_head(&spidev->waitqueue); ++ spidev->master=spi_alloc_master(&dev->dev,0); ++ if(!spidev->master){ ++ result=-ENOMEM; ++ goto region; ++ } ++ spidev->master->bus_num = 0; ++ spidev->master->num_chipselect = 1; ++ spidev->master->setup = locomospi_setup; ++ spidev->master->transfer = locomospi_transfer; ++ spidev->sdev = spi_new_device(spidev->master, &board); ++ if(!spidev->sdev){ ++ dev_err(&dev->dev, "failed to register spi device\n"); ++ result = -EINVAL; ++ goto master; ++ } ++/* result=request_irq(IRQ_LOCOMO_SPI_RFR, locomospi_testisr, IRQF_SHARED, "locomo-spi", (void*) spidev); ++ if(result) { ++ dev_err(&dev->dev, "Could not get IRQ: RFR\n"); ++ goto regdev; ++ } ++ //disable_irq(IRQ_LOCOMO_SPI_RFR); ++*//* result=request_irq(IRQ_LOCOMO_SPI_RFW, locomospi_testisr, IRQF_SHARED, "locomo-spi", (void*) spidev); ++ if(result) { ++ dev_err(&dev->dev, "Could not get IRQ: RFW\n"); ++ goto irq1; ++ } ++ //disable_irq(IRQ_LOCOMO_SPI_RFW); ++*//* result=request_irq(IRQ_LOCOMO_SPI_REND, locomospi_testisr, IRQF_SHARED, "locomo-spi", (void*) spidev); ++ if(result) { ++ dev_err(&dev->dev, "Could not get IRQ: REND\n"); ++ goto irq2; ++ } ++*//* result=request_irq(IRQ_LOCOMO_SPI_TEND, locomospi_testisr, IRQF_SHARED, "locomo-spi", (void*) spidev); ++ if(result) { ++ dev_err(&dev->dev, "Could not get IRQ: TEND\n"); ++ goto irq3; ++ } ++ //disable_irq(IRQ_LOCOMO_SPI_TEND); ++*/ spidev->workqueue = create_singlethread_workqueue("locomo-spi"); ++ if(!spidev->workqueue){ ++ dev_err(&dev->dev, "failed to create workqueue\n"); ++ goto irq4; ++ } ++ result=spi_register_master(spidev->master); ++ if(result){ ++ dev_err(&dev->dev, "failed to register spimaster\n"); ++ goto wq; ++ } ++ return 0; ++wq: ++ destroy_workqueue(spidev->workqueue); ++irq4: ++// free_irq(IRQ_LOCOMO_SPI_TEND, (void*) spidev); ++irq3: ++// free_irq(IRQ_LOCOMO_SPI_REND, (void*) spidev); ++irq2: ++// free_irq(IRQ_LOCOMO_SPI_RFW, (void*) spidev); ++irq1: ++// free_irq(IRQ_LOCOMO_SPI_RFR, (void*) spidev); ++regdev: ++ spi_unregister_device(spidev->sdev); ++master: ++ spi_master_put(spidev->master); ++region: ++ release_mem_region((unsigned long) dev->mapbase, dev->length); ++ kfree(spidev); ++ return result; ++ ++} ++ ++static int locomospi_remove(struct locomo_dev *dev) ++{ ++ spi_unregister_device(spidev->sdev); ++ spi_unregister_master(spidev->master); ++ destroy_workqueue(spidev->workqueue); ++ locomospi_reg_release(); ++// free_irq(IRQ_LOCOMO_SPI_TEND, (void*) spidev); ++// free_irq(IRQ_LOCOMO_SPI_REND, (void*) spidev); ++// free_irq(IRQ_LOCOMO_SPI_RFW, (void*) spidev); ++// free_irq(IRQ_LOCOMO_SPI_RFR, (void*) spidev); ++ spi_master_put(spidev->master); ++ release_mem_region((unsigned long) dev->mapbase, dev->length); ++ kfree(spidev); ++ return 0; ++} ++ ++ ++ ++static int __init locomospi_init(void) ++{ ++ int ret = locomo_driver_register(&locomo_spi_driver); ++ if (ret) ++ return ret; ++ ++ ++ return 0; ++} ++ ++static void __exit locomospi_exit(void) ++{ ++ locomo_driver_unregister(&locomo_spi_driver); ++} ++ ++module_init(locomospi_init); ++module_exit(locomospi_exit); ++ ++MODULE_AUTHOR("Thomas Kunze thommy@tabao.de"); ++MODULE_DESCRIPTION("Collie mmc driver"); ++MODULE_LICENSE("GPL"); +diff --git a/drivers/spi/locomo_spi.h b/drivers/spi/locomo_spi.h +new file mode 100644 +index 0000000..7e1c0ce +--- /dev/null ++++ b/drivers/spi/locomo_spi.h +@@ -0,0 +1,75 @@ ++#include <asm/hardware/locomo.h> ++#ifndef __LOCOMO_SPI_H__ ++#define __LOCOMO_SPI_H__ ++ ++/* locomo-spi status register LOCOMO_SPIST */ ++#define LOCOMO_SPI_TEND (1 << 3) /* Transfer end bit */ ++#define LOCOMO_SPI_REND (1 << 2) /* Receive end bit */ ++#define LOCOMO_SPI_RFW (1 << 1) /* write buffer bit */ ++#define LOCOMO_SPI_RFR (1) /* read buffer bit */ ++ ++/* locomo-spi mode register LOCOMO_SPIMD */ ++#define LOCOMO_SPI_LOOPBACK (1 << 15) /* loopback tx to rx */ ++#define LOCOMO_SPI_MSB1ST (1 << 14) /* send MSB first */ ++#define LOCOMO_SPI_DOSTAT (1 << 13) /* transmit line is idle high */ ++#define LOCOMO_SPI_TCPOL (1 << 11) /* transmit CPOL (maybe affects CPHA too) */ ++#define LOCOMO_SPI_RCPOL (1 << 10) /* receive CPOL (maybe affects CPHA too) */ ++#define LOCOMO_SPI_TDINV (1 << 9) /* invert transmit line */ ++#define LOCOMO_SPI_RDINV (1 << 8) /* invert receive line */ ++#define LOCOMO_SPI_XON (1 << 7) /* enable spi controller clock */ ++#define LOCOMO_SPI_XEN (1 << 6) /* clock bit write enable xon must be off, wait 300 us before xon->1 */ ++#define LOCOMO_SPI_XSEL 0x0018 /* clock select */ ++#define CLOCK_18MHZ 0 /* 18,432 MHz clock */ ++#define CLOCK_22MHZ 1 /* 22,5792 MHz clock */ ++#define CLOCK_25MHZ 2 /* 24,576 MHz clock */ ++#define LOCOMO_SPI_CLKSEL 0x7 ++#define DIV_1 0 /* don't divide clock */ ++#define DIV_2 1 /* divide clock by two */ ++#define DIV_4 2 /* divide clock by four */ ++#define DIV_8 3 /* divide clock by eight*/ ++#define DIV_64 4 /* divide clock by 64 */ ++ ++/* locomo-spi control register LOCOMO_SPICT */ ++#define LOCOMO_SPI_CRC16_7_B (1 << 15) /* 0: crc16 1: crc7 */ ++#define LOCOMO_SPI_CRCRX_TX_B (1 << 14) ++#define LOCOMO_SPI_CRCRESET_B (1 << 13) ++#define LOCOMO_SPI_CEN (1 << 7) /* ?? enable */ ++#define LOCOMO_SPI_CS (1 << 6) /* chip select */ ++#define LOCOMO_SPI_UNIT16 (1 << 5) /* 0: 8 bit units, 1: 16 bit unit */ ++#define LOCOMO_SPI_ALIGNEN (1 << 2) /* align transfer enable */ ++#define LOCOMO_SPI_RXWEN (1 << 1) /* continous receive */ ++#define LOCOMO_SPI_RXUEN (1 << 0) /* aligned receive */ ++ ++#define IRQ_LOCOMO_CARDDETECT IRQ_LOCOMO_GPIO13 ++ ++ ++struct locomospi_dev { ++ struct locomo_dev *ldev; ++ struct spi_master *master; ++ struct spi_device *sdev; ++ int card_power; ++ int clock_base; ++ int clock_div; ++ int clock; ++ unsigned long base; ++ u8 spimode; ++ wait_queue_head_t waitqueue; ++ struct workqueue_struct *workqueue; ++ struct list_head message_list; ++ spinlock_t message_lock; ++}; ++ ++ ++static irqreturn_t locomospi_cardisr(int, void*); ++static int locomospi_probe(struct locomo_dev*); ++static int locomospi_remove(struct locomo_dev*); ++static int locomospi_carddetect(void); ++static void locomospi_reg_open(void); ++static void locomospi_reg_release(void); ++static int tx(const char*, int); ++static int rx(char *, int); ++static void locomospi_power(int on); ++static int locomospi_suspend(struct locomo_dev *dev, pm_message_t state); ++static int locomospi_resume(struct locomo_dev *dev); ++static void locomospi_setcs(int high); ++#endif +-- +1.5.6.5 + diff --git a/packages/linux/linux-2.6.28/collie/0003-enable-cpufreq-for-collie.patch b/packages/linux/linux-2.6.28/collie/0003-enable-cpufreq-for-collie.patch new file mode 100644 index 0000000000..4ce284d52c --- /dev/null +++ b/packages/linux/linux-2.6.28/collie/0003-enable-cpufreq-for-collie.patch @@ -0,0 +1,25 @@ +From 41eabd493ccc241ccd52b77c576211759976972d Mon Sep 17 00:00:00 2001 +From: Thomas Kunze <thommycheck@gmx.de> +Date: Mon, 20 Oct 2008 17:33:29 +0200 +Subject: [PATCH 03/23] enable cpufreq for collie + +--- + arch/arm/Kconfig | 2 +- + 1 files changed, 1 insertions(+), 1 deletions(-) + +diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig +index 9722f8b..609f0fb 100644 +--- a/arch/arm/Kconfig ++++ b/arch/arm/Kconfig +@@ -1048,7 +1048,7 @@ config CPU_FREQ_SA1100 + + config CPU_FREQ_SA1110 + bool +- depends on CPU_FREQ && (SA1100_ASSABET || SA1100_CERF || SA1100_PT_SYSTEM3) ++ depends on CPU_FREQ && (SA1100_ASSABET || SA1100_CERF || SA1100_PT_SYSTEM3 || SA1100_COLLIE) + default y + + config CPU_FREQ_INTEGRATOR +-- +1.5.6.5 + diff --git a/packages/linux/linux-2.6.28/collie/0004-fix-dma-for-SA1100.patch b/packages/linux/linux-2.6.28/collie/0004-fix-dma-for-SA1100.patch new file mode 100644 index 0000000000..6dbb856189 --- /dev/null +++ b/packages/linux/linux-2.6.28/collie/0004-fix-dma-for-SA1100.patch @@ -0,0 +1,25 @@ +From 4f4df9e1c0c82cfd9133f52089025a8ff363977c Mon Sep 17 00:00:00 2001 +From: Thomas Kunze <thommycheck@gmx.de> +Date: Mon, 20 Oct 2008 17:39:02 +0200 +Subject: [PATCH 04/23] fix dma for SA1100 + +--- + arch/arm/mach-sa1100/dma.c | 2 +- + 1 files changed, 1 insertions(+), 1 deletions(-) + +diff --git a/arch/arm/mach-sa1100/dma.c b/arch/arm/mach-sa1100/dma.c +index f990a3e..1489d64 100644 +--- a/arch/arm/mach-sa1100/dma.c ++++ b/arch/arm/mach-sa1100/dma.c +@@ -39,7 +39,7 @@ typedef struct { + + static sa1100_dma_t dma_chan[SA1100_DMA_CHANNELS]; + +-static spinlock_t dma_list_lock; ++static DEFINE_SPINLOCK(dma_list_lock); + + + static irqreturn_t dma_irq_handler(int irq, void *dev_id) +-- +1.5.6.5 + diff --git a/packages/linux/linux-2.6.28/collie/0005-fix-collie-keyboard-bug.patch b/packages/linux/linux-2.6.28/collie/0005-fix-collie-keyboard-bug.patch new file mode 100644 index 0000000000..1200038de4 --- /dev/null +++ b/packages/linux/linux-2.6.28/collie/0005-fix-collie-keyboard-bug.patch @@ -0,0 +1,24 @@ +From 71f6a1b91e92c89f3fcf0330c55ad41fd3315c33 Mon Sep 17 00:00:00 2001 +From: Thomas Kunze <thommycheck@gmx.de> +Date: Mon, 20 Oct 2008 17:40:32 +0200 +Subject: [PATCH 05/23] fix collie keyboard bug + +--- + drivers/input/keyboard/locomokbd.c | 1 + + 1 files changed, 1 insertions(+), 0 deletions(-) + +diff --git a/drivers/input/keyboard/locomokbd.c b/drivers/input/keyboard/locomokbd.c +index 9caed30..79e19bf 100644 +--- a/drivers/input/keyboard/locomokbd.c ++++ b/drivers/input/keyboard/locomokbd.c +@@ -265,6 +265,7 @@ static int __devinit locomokbd_probe(struct locomo_dev *dev) + for (i = 0; i < LOCOMOKBD_NUMKEYS; i++) + set_bit(locomokbd->keycode[i], input_dev->keybit); + clear_bit(0, input_dev->keybit); ++ locomo_writel(0, locomokbd->base + LOCOMO_KSC); + + /* attempt to get the interrupt */ + err = request_irq(dev->irq[0], locomokbd_interrupt, 0, "locomokbd", locomokbd); +-- +1.5.6.5 + diff --git a/packages/linux/linux-2.6.28/collie/0006-add-collie-flash-hack.patch b/packages/linux/linux-2.6.28/collie/0006-add-collie-flash-hack.patch new file mode 100644 index 0000000000..0b987b6851 --- /dev/null +++ b/packages/linux/linux-2.6.28/collie/0006-add-collie-flash-hack.patch @@ -0,0 +1,722 @@ +From 6b663bce31fb1e1a78dbca22190e98251628fd4f Mon Sep 17 00:00:00 2001 +From: Thomas Kunze <thommycheck@gmx.de> +Date: Mon, 20 Oct 2008 17:48:10 +0200 +Subject: [PATCH 06/23] add collie flash hack + +--- + arch/arm/mach-sa1100/collie.c | 2 +- + drivers/mtd/chips/Kconfig | 8 + + drivers/mtd/chips/Makefile | 1 + + drivers/mtd/chips/sharp.c | 645 +++++++++++++++++++++++++++++++++++++++++ + drivers/mtd/maps/Kconfig | 2 +- + 5 files changed, 656 insertions(+), 2 deletions(-) + create mode 100644 drivers/mtd/chips/sharp.c + +diff --git a/arch/arm/mach-sa1100/collie.c b/arch/arm/mach-sa1100/collie.c +index 8cf267f..ec673b8 100644 +--- a/arch/arm/mach-sa1100/collie.c ++++ b/arch/arm/mach-sa1100/collie.c +@@ -222,7 +222,7 @@ static void collie_flash_exit(void) + gpio_free(COLLIE_GPIO_VPEN); + } + static struct flash_platform_data collie_flash_data = { +- .map_name = "cfi_probe", ++ .map_name = "sharp", + .init = collie_flash_init, + .set_vpp = collie_set_vpp, + .exit = collie_flash_exit, +diff --git a/drivers/mtd/chips/Kconfig b/drivers/mtd/chips/Kconfig +index 9408099..2dcbd03 100644 +--- a/drivers/mtd/chips/Kconfig ++++ b/drivers/mtd/chips/Kconfig +@@ -241,5 +241,13 @@ config MTD_XIP + used for XIP purposes. If you're not sure what this is all about + then say N. + ++config MTD_SHARP ++ tristate "pre-CFI Sharp chip support" ++ depends on MTD ++ help ++ This option enables support for flash chips using Sharp-compatible ++ commands, including some which are not CFI-compatible and hence ++ cannot be used with the CONFIG_MTD_CFI_INTELxxx options. ++ + endmenu + +diff --git a/drivers/mtd/chips/Makefile b/drivers/mtd/chips/Makefile +index 3658241..7283c57 100644 +--- a/drivers/mtd/chips/Makefile ++++ b/drivers/mtd/chips/Makefile +@@ -12,4 +12,5 @@ obj-$(CONFIG_MTD_GEN_PROBE) += gen_probe.o + obj-$(CONFIG_MTD_JEDECPROBE) += jedec_probe.o + obj-$(CONFIG_MTD_RAM) += map_ram.o + obj-$(CONFIG_MTD_ROM) += map_rom.o ++obj-$(CONFIG_MTD_SHARP) += sharp.o + obj-$(CONFIG_MTD_ABSENT) += map_absent.o +diff --git a/drivers/mtd/chips/sharp.c b/drivers/mtd/chips/sharp.c +new file mode 100644 +index 0000000..046b964 +--- /dev/null ++++ b/drivers/mtd/chips/sharp.c +@@ -0,0 +1,645 @@ ++/* ++ * MTD chip driver for pre-CFI Sharp flash chips ++ * ++ * Copyright 2000,2001 David A. Schleef <ds@schleef.org> ++ * 2000,2001 Lineo, Inc. ++ * ++ * $Id: sharp.c,v 1.17 2005/11/29 14:28:28 gleixner Exp $ ++ * ++ * Devices supported: ++ * LH28F016SCT Symmetrical block flash memory, 2Mx8 ++ * LH28F008SCT Symmetrical block flash memory, 1Mx8 ++ * ++ * Documentation: ++ * http://www.sharpmeg.com/datasheets/memic/flashcmp/ ++ * http://www.sharpmeg.com/datasheets/memic/flashcmp/01symf/16m/016sctl9.pdf ++ * 016sctl9.pdf ++ * ++ * Limitations: ++ * This driver only supports 4x1 arrangement of chips. ++ * Not tested on anything but PowerPC. ++ */ ++ ++#include <linux/kernel.h> ++#include <linux/module.h> ++#include <linux/types.h> ++#include <linux/sched.h> ++#include <linux/errno.h> ++#include <linux/init.h> ++#include <linux/interrupt.h> ++#include <linux/mtd/map.h> ++#include <linux/mtd/mtd.h> ++#include <linux/mtd/cfi.h> ++#include <linux/delay.h> ++#include <linux/init.h> ++ ++#define CMD_RESET 0xffffffff ++#define CMD_READ_ID 0x90909090 ++#define CMD_READ_STATUS 0x70707070 ++#define CMD_CLEAR_STATUS 0x50505050 ++#define CMD_BLOCK_ERASE_1 0x20202020 ++#define CMD_BLOCK_ERASE_2 0xd0d0d0d0 ++#define CMD_BYTE_WRITE 0x40404040 ++#define CMD_SUSPEND 0xb0b0b0b0 ++#define CMD_RESUME 0xd0d0d0d0 ++#define CMD_SET_BLOCK_LOCK_1 0x60606060 ++#define CMD_SET_BLOCK_LOCK_2 0x01010101 ++#define CMD_SET_MASTER_LOCK_1 0x60606060 ++#define CMD_SET_MASTER_LOCK_2 0xf1f1f1f1 ++#define CMD_CLEAR_BLOCK_LOCKS_1 0x60606060 ++#define CMD_CLEAR_BLOCK_LOCKS_2 0xd0d0d0d0 ++ ++#define SR_READY 0x80808080 // 1 = ready ++#define SR_ERASE_SUSPEND 0x40404040 // 1 = block erase suspended ++#define SR_ERROR_ERASE 0x20202020 // 1 = error in block erase or clear lock bits ++#define SR_ERROR_WRITE 0x10101010 // 1 = error in byte write or set lock bit ++#define SR_VPP 0x08080808 // 1 = Vpp is low ++#define SR_WRITE_SUSPEND 0x04040404 // 1 = byte write suspended ++#define SR_PROTECT 0x02020202 // 1 = lock bit set ++#define SR_RESERVED 0x01010101 ++ ++#define SR_ERRORS (SR_ERROR_ERASE|SR_ERROR_WRITE|SR_VPP|SR_PROTECT) ++ ++#define BLOCK_MASK 0xfffe0000 ++ ++/* Configuration options */ ++ ++#define AUTOUNLOCK /* automatically unlocks blocks before erasing */ ++ ++static struct mtd_info *sharp_probe(struct map_info *); ++ ++static int sharp_probe_map(struct map_info *map, struct mtd_info *mtd); ++ ++static int sharp_read(struct mtd_info *mtd, loff_t from, size_t len, ++ size_t *retlen, u_char *buf); ++static int sharp_write(struct mtd_info *mtd, loff_t from, size_t len, ++ size_t *retlen, const u_char *buf); ++static int sharp_erase(struct mtd_info *mtd, struct erase_info *instr); ++static void sharp_sync(struct mtd_info *mtd); ++static int sharp_suspend(struct mtd_info *mtd); ++static void sharp_resume(struct mtd_info *mtd); ++static void sharp_destroy(struct mtd_info *mtd); ++ ++static int sharp_write_oneword(struct map_info *map, struct flchip *chip, ++ unsigned long adr, __u32 datum); ++static int sharp_erase_oneblock(struct map_info *map, struct flchip *chip, ++ unsigned long adr); ++#ifdef AUTOUNLOCK ++static inline void sharp_unlock_oneblock(struct map_info *map, struct flchip *chip, ++ unsigned long adr); ++#endif ++ ++ ++struct sharp_info{ ++ struct flchip *chip; ++ int bogus; ++ int chipshift; ++ int numchips; ++ struct flchip chips[1]; ++}; ++ ++static void sharp_destroy(struct mtd_info *mtd); ++ ++static struct mtd_chip_driver sharp_chipdrv = { ++ .probe = sharp_probe, ++ .destroy = sharp_destroy, ++ .name = "sharp", ++ .module = THIS_MODULE ++}; ++ ++static void sharp_udelay(unsigned long i) { ++ if (in_interrupt()) { ++ udelay(i); ++ } else { ++ schedule(); ++ } ++} ++ ++static struct mtd_info *sharp_probe(struct map_info *map) ++{ ++ struct mtd_info *mtd = NULL; ++ struct sharp_info *sharp = NULL; ++ int width; ++ ++ mtd = kzalloc(sizeof(*mtd), GFP_KERNEL); ++ if(!mtd) ++ return NULL; ++ ++ sharp = kzalloc(sizeof(*sharp), GFP_KERNEL); ++ if(!sharp) { ++ kfree(mtd); ++ return NULL; ++ } ++ ++ width = sharp_probe_map(map,mtd); ++ if(!width){ ++ kfree(mtd); ++ kfree(sharp); ++ return NULL; ++ } ++ ++ mtd->priv = map; ++ mtd->type = MTD_NORFLASH; ++ mtd->erase = sharp_erase; ++ mtd->read = sharp_read; ++ mtd->write = sharp_write; ++ mtd->sync = sharp_sync; ++ mtd->suspend = sharp_suspend; ++ mtd->resume = sharp_resume; ++ mtd->flags = MTD_CAP_NORFLASH; ++ mtd->writesize = 1; ++ mtd->name = map->name; ++ ++ sharp->chipshift = 24; ++ sharp->numchips = 1; ++ sharp->chips[0].start = 0; ++ sharp->chips[0].state = FL_READY; ++ sharp->chips[0].mutex = &sharp->chips[0]._spinlock; ++ sharp->chips[0].word_write_time = 0; ++ init_waitqueue_head(&sharp->chips[0].wq); ++ spin_lock_init(&sharp->chips[0]._spinlock); ++ ++ map->fldrv = &sharp_chipdrv; ++ map->fldrv_priv = sharp; ++ ++ __module_get(THIS_MODULE); ++ return mtd; ++} ++ ++static inline void sharp_send_cmd(struct map_info *map, unsigned long cmd, unsigned long adr) ++{ ++ map_word map_cmd; ++ map_cmd.x[0] = cmd; ++ map_write(map, map_cmd, adr); ++} ++ ++static int sharp_probe_map(struct map_info *map,struct mtd_info *mtd) ++{ ++ map_word tmp, read0, read4; ++ unsigned long base = 0; ++ int width = 4; ++ ++ tmp = map_read(map, base+0); ++ ++ sharp_send_cmd(map, CMD_READ_ID, base+0); ++ ++ read0 = map_read(map, base+0); ++ read4 = map_read(map, base+4); ++ if (read0.x[0] == 0x00b000b0) { ++ printk("Sharp chip, %lx, %lx, width = %d\n", read0.x[0], read4.x[0], width); ++ /* Prints b000b0, b000b0, width = 4 on collie */ ++ switch(read4.x[0]){ ++ case 0xaaaaaaaa: ++ case 0xa0a0a0a0: ++ /* aa - LH28F016SCT-L95 2Mx8, 32 64k blocks*/ ++ /* a0 - LH28F016SCT-Z4 2Mx8, 32 64k blocks*/ ++ mtd->erasesize = 0x10000 * width; ++ mtd->size = 0x200000 * width; ++ return width; ++ case 0xa6a6a6a6: ++ /* a6 - LH28F008SCT-L12 1Mx8, 16 64k blocks*/ ++ /* a6 - LH28F008SCR-L85 1Mx8, 16 64k blocks*/ ++ mtd->erasesize = 0x10000 * width; ++ mtd->size = 0x100000 * width; ++ return width; ++ case 0x00b000b0: ++ /* a6 - LH28F640BFHE 8 64k * 2 chip blocks*/ ++ mtd->erasesize = 0x10000 * width / 2; ++ mtd->size = 0x800000 * width / 2; ++ return width; ++ default: ++ printk("Sort-of looks like sharp flash, 0x%08lx 0x%08lx\n", ++ read0.x[0], read4.x[0]); ++ } ++ } else if ((map_read(map, base+0).x[0] == CMD_READ_ID)){ ++ /* RAM, probably */ ++ printk("Looks like RAM\n"); ++ map_write(map, tmp, base+0); ++ }else{ ++ printk("Doesn't look like sharp flash, 0x%08lx 0x%08lx\n", ++ read0.x[0], read4.x[0]); ++ } ++ ++ return 0; ++} ++ ++/* This function returns with the chip->mutex lock held. */ ++static int sharp_wait(struct map_info *map, struct flchip *chip) ++{ ++ map_word status; ++ unsigned long timeo = jiffies + HZ; ++ DECLARE_WAITQUEUE(wait, current); ++ int adr = 0; ++ ++retry: ++ spin_lock_bh(chip->mutex); ++ ++ switch (chip->state) { ++ case FL_READY: ++ sharp_send_cmd(map, CMD_READ_STATUS, adr); ++ chip->state = FL_STATUS; ++ case FL_STATUS: ++ status = map_read(map, adr); ++ if ((status.x[0] & SR_READY) == SR_READY) ++ break; ++ spin_unlock_bh(chip->mutex); ++ if (time_after(jiffies, timeo)) { ++ printk("Waiting for chip to be ready timed out in erase\n"); ++ return -EIO; ++ } ++ sharp_udelay(1); ++ goto retry; ++ default: ++ set_current_state(TASK_INTERRUPTIBLE); ++ add_wait_queue(&chip->wq, &wait); ++ ++ spin_unlock_bh(chip->mutex); ++ ++ sharp_udelay(1); ++ ++ set_current_state(TASK_RUNNING); ++ remove_wait_queue(&chip->wq, &wait); ++ ++ if(signal_pending(current)) ++ return -EINTR; ++ ++ timeo = jiffies + HZ; ++ ++ goto retry; ++ } ++ ++ sharp_send_cmd(map, CMD_RESET, adr); ++ ++ chip->state = FL_READY; ++ ++ return 0; ++} ++ ++static void sharp_release(struct flchip *chip) ++{ ++ wake_up(&chip->wq); ++ spin_unlock_bh(chip->mutex); ++} ++ ++static int sharp_read(struct mtd_info *mtd, loff_t from, size_t len, ++ size_t *retlen, u_char *buf) ++{ ++ struct map_info *map = mtd->priv; ++ struct sharp_info *sharp = map->fldrv_priv; ++ int chipnum; ++ int ret = 0; ++ int ofs = 0; ++ ++ chipnum = (from >> sharp->chipshift); ++ ofs = from & ((1 << sharp->chipshift)-1); ++ ++ *retlen = 0; ++ ++ while(len){ ++ unsigned long thislen; ++ ++ if(chipnum>=sharp->numchips) ++ break; ++ ++ thislen = len; ++ if(ofs+thislen >= (1<<sharp->chipshift)) ++ thislen = (1<<sharp->chipshift) - ofs; ++ ++ ret = sharp_wait(map,&sharp->chips[chipnum]); ++ if(ret<0) ++ break; ++ ++ map_copy_from(map,buf,ofs,thislen); ++ ++ sharp_release(&sharp->chips[chipnum]); ++ ++ *retlen += thislen; ++ len -= thislen; ++ buf += thislen; ++ ++ ofs = 0; ++ chipnum++; ++ } ++ return ret; ++} ++ ++static int sharp_write(struct mtd_info *mtd, loff_t to, size_t len, ++ size_t *retlen, const u_char *buf) ++{ ++ struct map_info *map = mtd->priv; ++ struct sharp_info *sharp = map->fldrv_priv; ++ int ret = 0; ++ int i,j; ++ int chipnum; ++ unsigned long ofs; ++ union { u32 l; unsigned char uc[4]; } tbuf; ++ ++ *retlen = 0; ++ ++ while(len){ ++ tbuf.l = 0xffffffff; ++ chipnum = to >> sharp->chipshift; ++ ofs = to & ((1<<sharp->chipshift)-1); ++ ++ j=0; ++ for(i=ofs&3;i<4 && len;i++){ ++ tbuf.uc[i] = *buf; ++ buf++; ++ to++; ++ len--; ++ j++; ++ } ++ sharp_write_oneword(map, &sharp->chips[chipnum], ofs&~3, tbuf.l); ++ if(ret<0) ++ return ret; ++ (*retlen)+=j; ++ } ++ ++ return 0; ++} ++ ++static int sharp_write_oneword(struct map_info *map, struct flchip *chip, ++ unsigned long adr, __u32 datum) ++{ ++ int ret; ++ int try; ++ int i; ++ map_word data, status; ++ ++ status.x[0] = 0; ++ ret = sharp_wait(map,chip); ++ if (ret < 0) ++ return ret; ++ ++ for (try=0; try<10; try++) { ++ long timeo; ++ ++ sharp_send_cmd(map, CMD_BYTE_WRITE, adr); ++ /* cpu_to_le32 -> hack to fix the writel be->le conversion */ ++ data.x[0] = cpu_to_le32(datum); ++ map_write(map, data, adr); ++ ++ chip->state = FL_WRITING; ++ timeo = jiffies + (HZ/2); ++ ++ sharp_send_cmd(map, CMD_READ_STATUS, adr); ++ for(i=0;i<100;i++){ ++ status = map_read(map, adr); ++ if((status.x[0] & SR_READY) == SR_READY) ++ break; ++ } ++#ifdef AUTOUNLOCK ++ if (status.x[0] & SR_PROTECT) { /* lock block */ ++ sharp_send_cmd(map, CMD_CLEAR_STATUS, adr); ++ sharp_unlock_oneblock(map,chip,adr); ++ sharp_send_cmd(map, CMD_CLEAR_STATUS, adr); ++ sharp_send_cmd(map, CMD_RESET, adr); ++ continue; ++ } ++#endif ++ if(i==100){ ++ printk("sharp: timed out writing\n"); ++ } ++ ++ if (!(status.x[0] & SR_ERRORS)) ++ break; ++ ++ printk("sharp: error writing byte at addr=%08lx status=%08lx\n", adr, status.x[0]); ++ ++ sharp_send_cmd(map, CMD_CLEAR_STATUS, adr); ++ } ++ sharp_send_cmd(map, CMD_RESET, adr); ++ chip->state = FL_READY; ++ ++ sharp_release(chip); ++ ++ return 0; ++} ++ ++static int sharp_erase(struct mtd_info *mtd, struct erase_info *instr) ++{ ++ struct map_info *map = mtd->priv; ++ struct sharp_info *sharp = map->fldrv_priv; ++ unsigned long adr,len; ++ int chipnum, ret=0; ++ ++ if(instr->addr & (mtd->erasesize - 1)) ++ return -EINVAL; ++ if(instr->len & (mtd->erasesize - 1)) ++ return -EINVAL; ++ if(instr->len + instr->addr > mtd->size) ++ return -EINVAL; ++ ++ chipnum = instr->addr >> sharp->chipshift; ++ adr = instr->addr & ((1<<sharp->chipshift)-1); ++ len = instr->len; ++ ++ while(len){ ++ ret = sharp_erase_oneblock(map, &sharp->chips[chipnum], adr); ++ if(ret)return ret; ++ ++ if (adr >= 0xfe0000) { ++ adr += mtd->erasesize / 8; ++ len -= mtd->erasesize / 8; ++ } else { ++ adr += mtd->erasesize; ++ len -= mtd->erasesize; ++ } ++ if(adr >> sharp->chipshift){ ++ adr = 0; ++ chipnum++; ++ if(chipnum>=sharp->numchips) ++ break; ++ } ++ } ++ ++ instr->state = MTD_ERASE_DONE; ++ mtd_erase_callback(instr); ++ ++ return 0; ++} ++ ++static inline int sharp_do_wait_for_ready(struct map_info *map, struct flchip *chip, ++ unsigned long adr) ++{ ++ int ret; ++ unsigned long timeo; ++ map_word status; ++ DECLARE_WAITQUEUE(wait, current); ++ ++ sharp_send_cmd(map, CMD_READ_STATUS, adr); ++ status = map_read(map, adr); ++ ++ timeo = jiffies + HZ * 10; ++ ++ while (time_before(jiffies, timeo)) { ++ sharp_send_cmd(map, CMD_READ_STATUS, adr); ++ status = map_read(map, adr); ++ if ((status.x[0] & SR_READY) == SR_READY) { ++ ret = 0; ++ goto out; ++ } ++ set_current_state(TASK_INTERRUPTIBLE); ++ add_wait_queue(&chip->wq, &wait); ++ ++ spin_unlock_bh(chip->mutex); ++ ++ schedule_timeout(1); ++ schedule(); ++ ++ spin_lock_bh(chip->mutex); ++ ++ remove_wait_queue(&chip->wq, &wait); ++ set_current_state(TASK_RUNNING); ++ } ++ ret = -ETIME; ++out: ++ return ret; ++} ++ ++static int sharp_erase_oneblock(struct map_info *map, struct flchip *chip, ++ unsigned long adr) ++{ ++ int ret; ++ map_word status; ++ ++ ret = sharp_wait(map,chip); ++ if (ret < 0) ++ return ret; ++ ++#ifdef AUTOUNLOCK ++ /* This seems like a good place to do an unlock */ ++ sharp_unlock_oneblock(map,chip,adr); ++#endif ++ ++ sharp_send_cmd(map, CMD_BLOCK_ERASE_1, adr); ++ sharp_send_cmd(map, CMD_BLOCK_ERASE_2, adr); ++ ++ chip->state = FL_ERASING; ++ ++ ret = sharp_do_wait_for_ready(map,chip,adr); ++ if(ret<0) { ++ spin_unlock_bh(chip->mutex); ++ return ret; ++ } ++ ++ sharp_send_cmd(map, CMD_READ_STATUS, adr); ++ status = map_read(map, adr); ++ ++ if (!(status.x[0] & SR_ERRORS)) { ++ sharp_send_cmd(map, CMD_RESET, adr); ++ chip->state = FL_READY; ++ spin_unlock_bh(chip->mutex); ++ return 0; ++ } ++ ++ printk("sharp: error erasing block at addr=%08lx status=%08lx\n", adr, status.x[0]); ++ sharp_send_cmd(map, CMD_CLEAR_STATUS, adr); ++ ++ sharp_release(chip); ++ ++ return -EIO; ++} ++ ++#ifdef AUTOUNLOCK ++static inline void sharp_unlock_oneblock(struct map_info *map, struct flchip *chip, ++ unsigned long adr) ++{ ++ map_word status; ++ ++ sharp_send_cmd(map, CMD_CLEAR_BLOCK_LOCKS_1, adr & BLOCK_MASK); ++ sharp_send_cmd(map, CMD_CLEAR_BLOCK_LOCKS_2, adr & BLOCK_MASK); ++ ++ sharp_do_wait_for_ready(map,chip,adr); ++ ++ status = map_read(map, adr); ++ ++ if (!(status.x[0] & SR_ERRORS)) { ++ sharp_send_cmd(map, CMD_RESET, adr); ++ chip->state = FL_READY; ++ return; ++ } ++ ++ printk("sharp: error unlocking block at addr=%08lx status=%08lx\n", adr, status.x[0]); ++ sharp_send_cmd(map, CMD_CLEAR_STATUS, adr); ++} ++#endif ++ ++static void sharp_sync(struct mtd_info *mtd) ++{ ++} ++ ++static int sharp_suspend(struct mtd_info *mtd) ++{ ++ struct map_info *map = mtd->priv; ++ struct sharp_info *sharp = map->fldrv_priv; ++ int i; ++ struct flchip *chip; ++ int ret = 0; ++ ++ for (i = 0; !ret && i < sharp->numchips; i++) { ++ chip = &sharp->chips[i]; ++ ret = sharp_wait(map,chip); ++ ++ if (ret) { ++ ret = -EAGAIN; ++ } else { ++ chip->state = FL_PM_SUSPENDED; ++ spin_unlock_bh(chip->mutex); ++ } ++ } ++ return ret; ++} ++ ++static void sharp_resume(struct mtd_info *mtd) ++{ ++ struct map_info *map = mtd->priv; ++ struct sharp_info *sharp = map->fldrv_priv; ++ int i; ++ struct flchip *chip; ++ ++ for (i = 0; i < sharp->numchips; i++) { ++ chip = &sharp->chips[i]; ++ ++ spin_lock_bh(chip->mutex); ++ ++ if (chip->state == FL_PM_SUSPENDED) { ++ /* We need to force it back to a known state */ ++ sharp_send_cmd(map, CMD_RESET, chip->start); ++ chip->state = FL_READY; ++ wake_up(&chip->wq); ++ } ++ ++ spin_unlock_bh(chip->mutex); ++ } ++} ++ ++static void sharp_destroy(struct mtd_info *mtd) ++{ ++ struct map_info *map = mtd->priv; ++ struct sharp_info *sharp = map->fldrv_priv; ++ ++ kfree(sharp); ++} ++ ++static int __init sharp_probe_init(void) ++{ ++ printk("MTD Sharp chip driver <ds@lineo.com>\n"); ++ ++ register_mtd_chip_driver(&sharp_chipdrv); ++ ++ return 0; ++} ++ ++static void __exit sharp_probe_exit(void) ++{ ++ unregister_mtd_chip_driver(&sharp_chipdrv); ++} ++ ++module_init(sharp_probe_init); ++module_exit(sharp_probe_exit); ++ ++ ++MODULE_LICENSE("GPL"); ++MODULE_AUTHOR("David Schleef <ds@schleef.org>"); ++MODULE_DESCRIPTION("Old MTD chip driver for pre-CFI Sharp flash chips"); +diff --git a/drivers/mtd/maps/Kconfig b/drivers/mtd/maps/Kconfig +index 5ea1693..d523464 100644 +--- a/drivers/mtd/maps/Kconfig ++++ b/drivers/mtd/maps/Kconfig +@@ -360,7 +360,7 @@ config MTD_CDB89712 + + config MTD_SA1100 + tristate "CFI Flash device mapped on StrongARM SA11x0" +- depends on MTD_CFI && ARCH_SA1100 && MTD_PARTITIONS ++ depends on (MTD_CFI || MTD_SHARP) && ARCH_SA1100 && MTD_PARTITIONS + help + This enables access to the flash chips on most platforms based on + the SA1100 and SA1110, including the Assabet and the Compaq iPAQ. +-- +1.5.6.5 + diff --git a/packages/linux/linux-2.6.28/collie/0007-hostap-workaround-for-buggy-sa1100-pcmcia-driver.patch b/packages/linux/linux-2.6.28/collie/0007-hostap-workaround-for-buggy-sa1100-pcmcia-driver.patch new file mode 100644 index 0000000000..230bd93476 --- /dev/null +++ b/packages/linux/linux-2.6.28/collie/0007-hostap-workaround-for-buggy-sa1100-pcmcia-driver.patch @@ -0,0 +1,107 @@ +From 8200a4430e1515bf4523e3651fa7c29fdebbb0fb Mon Sep 17 00:00:00 2001 +From: Thomas Kunze <thommycheck@gmx.de> +Date: Mon, 20 Oct 2008 17:50:06 +0200 +Subject: [PATCH 07/23] hostap workaround for buggy sa1100 pcmcia driver + +--- + drivers/net/wireless/hostap/hostap_cs.c | 6 ++++-- + drivers/net/wireless/hostap/hostap_hw.c | 14 ++++++++++++-- + drivers/net/wireless/hostap/hostap_pci.c | 1 + + drivers/net/wireless/hostap/hostap_plx.c | 2 +- + 4 files changed, 18 insertions(+), 5 deletions(-) + +diff --git a/drivers/net/wireless/hostap/hostap_cs.c b/drivers/net/wireless/hostap/hostap_cs.c +index 6337402..928cdf0 100644 +--- a/drivers/net/wireless/hostap/hostap_cs.c ++++ b/drivers/net/wireless/hostap/hostap_cs.c +@@ -35,7 +35,7 @@ static int ignore_cis_vcc; + module_param(ignore_cis_vcc, int, 0444); + MODULE_PARM_DESC(ignore_cis_vcc, "Ignore broken CIS VCC entry"); + +- ++int activar=0; + /* struct local_info::hw_priv */ + struct hostap_cs_priv { + dev_node_t node; +@@ -499,11 +499,13 @@ static int hostap_cs_probe(struct pcmcia_device *p_dev) + + PDEBUG(DEBUG_HW, "%s: setting Vcc=33 (constant)\n", dev_info); + p_dev->conf.IntType = INT_MEMORY_AND_IO; +- ++ ++ activar=0; + ret = prism2_config(p_dev); + if (ret) { + PDEBUG(DEBUG_EXTRA, "prism2_config() failed\n"); + } ++ activar=1; + + return ret; + } +diff --git a/drivers/net/wireless/hostap/hostap_hw.c b/drivers/net/wireless/hostap/hostap_hw.c +index 3153fe9..188eaee 100644 +--- a/drivers/net/wireless/hostap/hostap_hw.c ++++ b/drivers/net/wireless/hostap/hostap_hw.c +@@ -54,6 +54,7 @@ + #include "hostap.h" + #include "hostap_ap.h" + ++extern int activar; + + /* #define final_version */ + +@@ -1497,6 +1498,8 @@ static int prism2_hw_config(struct net_device *dev, int initial) + if (local->hw_downloading) + return 1; + ++ activar=1; ++ + if (prism2_hw_init(dev, initial)) { + return local->no_pri ? 0 : 1; + } +@@ -2628,8 +2631,15 @@ static irqreturn_t prism2_interrupt(int irq, void *dev_id) + int events = 0; + u16 ev; + +- iface = netdev_priv(dev); +- local = iface->local; ++ ++ // Todos los parametros de entrada son correctos (no son nulos). De momento esta es la unica forma que conozco de detectar el problema. ++ if (!activar) { ++ printk("hostap_hw.c: INTERRUPT BEFORE DEVICE INIT!\n"); ++ return IRQ_HANDLED; ++ } ++ ++ iface = netdev_priv(dev); ++ local = iface->local; + + prism2_io_debug_add(dev, PRISM2_IO_DEBUG_CMD_INTERRUPT, 0, 0); + +diff --git a/drivers/net/wireless/hostap/hostap_pci.c b/drivers/net/wireless/hostap/hostap_pci.c +index 3a874fc..df58aa3 100644 +--- a/drivers/net/wireless/hostap/hostap_pci.c ++++ b/drivers/net/wireless/hostap/hostap_pci.c +@@ -19,6 +19,7 @@ + + #include "hostap_wlan.h" + ++int activar=1; + + static char *dev_info = "hostap_pci"; + +diff --git a/drivers/net/wireless/hostap/hostap_plx.c b/drivers/net/wireless/hostap/hostap_plx.c +index cbf15d7..4475174 100644 +--- a/drivers/net/wireless/hostap/hostap_plx.c ++++ b/drivers/net/wireless/hostap/hostap_plx.c +@@ -21,7 +21,7 @@ + #include <asm/io.h> + + #include "hostap_wlan.h" +- ++int activar=1; + + static char *dev_info = "hostap_plx"; + +-- +1.5.6.5 + diff --git a/packages/linux/linux-2.6.28/collie/0008-fix-collie-suspend-hack.patch b/packages/linux/linux-2.6.28/collie/0008-fix-collie-suspend-hack.patch new file mode 100644 index 0000000000..19557f9e18 --- /dev/null +++ b/packages/linux/linux-2.6.28/collie/0008-fix-collie-suspend-hack.patch @@ -0,0 +1,70 @@ +From 8ebd75d9f4d7dcc74e18b46ed82070eec52deaa8 Mon Sep 17 00:00:00 2001 +From: Thomas Kunze <thommycheck@gmx.de> +Date: Mon, 20 Oct 2008 17:51:21 +0200 +Subject: [PATCH 08/23] fix collie suspend hack + +--- + drivers/pcmcia/pxa2xx_sharpsl.c | 2 +- + drivers/pcmcia/sa1100_generic.c | 19 ++++++++++--------- + 2 files changed, 11 insertions(+), 10 deletions(-) + +diff --git a/drivers/pcmcia/pxa2xx_sharpsl.c b/drivers/pcmcia/pxa2xx_sharpsl.c +index 1cd02f5..3724395 100644 +--- a/drivers/pcmcia/pxa2xx_sharpsl.c ++++ b/drivers/pcmcia/pxa2xx_sharpsl.c +@@ -222,7 +222,7 @@ static void sharpsl_pcmcia_socket_suspend(struct soc_pcmcia_socket *skt) + sharpsl_pcmcia_init_reset(skt); + } + +-static struct pcmcia_low_level sharpsl_pcmcia_ops __initdata = { ++static struct pcmcia_low_level sharpsl_pcmcia_ops = { + .owner = THIS_MODULE, + .hw_init = sharpsl_pcmcia_hw_init, + .hw_shutdown = sharpsl_pcmcia_hw_shutdown, +diff --git a/drivers/pcmcia/sa1100_generic.c b/drivers/pcmcia/sa1100_generic.c +index c5b2a44..eecbe8c 100644 +--- a/drivers/pcmcia/sa1100_generic.c ++++ b/drivers/pcmcia/sa1100_generic.c +@@ -81,13 +81,14 @@ static int sa11x0_drv_pcmcia_probe(struct device *dev) + return ret; + } + +-static struct device_driver sa11x0_pcmcia_driver = { +- .probe = sa11x0_drv_pcmcia_probe, +- .remove = soc_common_drv_pcmcia_remove, +- .name = "sa11x0-pcmcia", +- .bus = &platform_bus_type, +- .suspend = pcmcia_socket_dev_suspend, +- .resume = pcmcia_socket_dev_resume, ++static struct platform_driver sa11x0_pcmcia_driver = { ++ .driver = { ++ .name = "sa11x0-pcmcia", ++ .probe = sa11x0_drv_pcmcia_probe, ++ .remove = soc_common_drv_pcmcia_remove, ++ .suspend= pcmcia_socket_dev_suspend, ++ .resume = pcmcia_socket_dev_resume, ++ }, + }; + + /* sa11x0_pcmcia_init() +@@ -100,7 +101,7 @@ static struct device_driver sa11x0_pcmcia_driver = { + */ + static int __init sa11x0_pcmcia_init(void) + { +- return driver_register(&sa11x0_pcmcia_driver); ++ return platform_driver_register(&sa11x0_pcmcia_driver); + } + + /* sa11x0_pcmcia_exit() +@@ -110,7 +111,7 @@ static int __init sa11x0_pcmcia_init(void) + */ + static void __exit sa11x0_pcmcia_exit(void) + { +- driver_unregister(&sa11x0_pcmcia_driver); ++ platform_driver_unregister(&sa11x0_pcmcia_driver); + } + + MODULE_AUTHOR("John Dorsey <john+@cs.cmu.edu>"); +-- +1.5.6.5 + diff --git a/packages/linux/linux-2.6.28/collie/0009-add-sa1100-usb-gadget-driver-hack.patch b/packages/linux/linux-2.6.28/collie/0009-add-sa1100-usb-gadget-driver-hack.patch new file mode 100644 index 0000000000..bb8dd5cd63 --- /dev/null +++ b/packages/linux/linux-2.6.28/collie/0009-add-sa1100-usb-gadget-driver-hack.patch @@ -0,0 +1,2629 @@ +From 923ac0a48c2a064e4639b0fa53dbd0a18d87043e Mon Sep 17 00:00:00 2001 +From: Thomas Kunze <thommycheck@gmx.de> +Date: Tue, 10 Feb 2009 18:09:03 +0100 +Subject: [PATCH 09/23] add sa1100 usb gadget driver hack + +Conflicts: + + drivers/usb/gadget/Makefile +--- + arch/arm/mach-sa1100/include/mach/collie.h | 5 +- + drivers/usb/gadget/Kconfig | 14 + + drivers/usb/gadget/Makefile | 1 + + drivers/usb/gadget/sa1100_udc.c | 2447 ++++++++++++++++++++++++++++ + drivers/usb/gadget/sa1100_udc.h | 94 ++ + 5 files changed, 2558 insertions(+), 3 deletions(-) + create mode 100644 drivers/usb/gadget/sa1100_udc.c + create mode 100644 drivers/usb/gadget/sa1100_udc.h + +diff --git a/arch/arm/mach-sa1100/include/mach/collie.h b/arch/arm/mach-sa1100/include/mach/collie.h +index 9bc5349..799c930 100644 +--- a/arch/arm/mach-sa1100/include/mach/collie.h ++++ b/arch/arm/mach-sa1100/include/mach/collie.h +@@ -23,11 +23,10 @@ + #define COLLIE_SCP_5VON SCOOP_GPCR_PA16 + #define COLLIE_SCP_AMP_ON SCOOP_GPCR_PA17 + #define COLLIE_GPIO_VPEN (COLLIE_SCOOP_GPIO_BASE + 7) +-#define COLLIE_SCP_LB_VOL_CHG SCOOP_GPCR_PA19 ++#define COLLIE_GPIO_LB_VOL_CHG (COLLIE_SCOOP_GPIO_BASE + 8) + + #define COLLIE_SCOOP_IO_DIR ( COLLIE_SCP_CHARGE_ON | COLLIE_SCP_MUTE_L | COLLIE_SCP_MUTE_R | \ +- COLLIE_SCP_5VON | COLLIE_SCP_AMP_ON | \ +- COLLIE_SCP_LB_VOL_CHG ) ++ COLLIE_SCP_5VON | COLLIE_SCP_AMP_ON ) + #define COLLIE_SCOOP_IO_OUT ( COLLIE_SCP_MUTE_L | COLLIE_SCP_MUTE_R | \ + COLLIE_SCP_CHARGE_ON ) + +diff --git a/drivers/usb/gadget/Kconfig b/drivers/usb/gadget/Kconfig +index dd4cd5a..efb65ac 100644 +--- a/drivers/usb/gadget/Kconfig ++++ b/drivers/usb/gadget/Kconfig +@@ -419,6 +419,20 @@ config USB_GOKU + default USB_GADGET + select USB_GADGET_SELECTED + ++config USB_GADGET_SA1100 ++ boolean "SA1100 USB Device Port" ++ depends on ARCH_SA1100 ++ select USB_GADGET_SELECTED ++ help ++ ++ Say "y" to link the driver statically, or "m" to build a ++ dynamically linked module called "sa1100_udc" and force all ++ gadget drivers to also be dynamically linked. ++ ++config USB_SA1100 ++ tristate ++ depends on USB_GADGET_SA1100 ++ default USB_GADGET + + # + # LAST -- dummy/emulated controller +diff --git a/drivers/usb/gadget/Makefile b/drivers/usb/gadget/Makefile +index bd4041b..5cdd0ce 100644 +--- a/drivers/usb/gadget/Makefile ++++ b/drivers/usb/gadget/Makefile +@@ -19,6 +19,7 @@ obj-$(CONFIG_USB_ATMEL_USBA) += atmel_usba_udc.o + obj-$(CONFIG_USB_FSL_USB2) += fsl_usb2_udc.o + obj-$(CONFIG_USB_M66592) += m66592-udc.o + obj-$(CONFIG_USB_FSL_QE) += fsl_qe_udc.o ++obj-$(CONFIG_USB_SA1100) += sa1100_udc.o + + # + # USB gadget drivers +diff --git a/drivers/usb/gadget/sa1100_udc.c b/drivers/usb/gadget/sa1100_udc.c +new file mode 100644 +index 0000000..5e26a6d +--- /dev/null ++++ b/drivers/usb/gadget/sa1100_udc.c +@@ -0,0 +1,2447 @@ ++/* ++ * SA1100 USB Device Controller (UDC) driver. ++ * ++ * Copyright (C) Compaq Computer Corporation, 1998, 1999 ++ * Copyright (C) Extenex Corporation, 2001 ++ * Copyright (C) David Brownell, 2003 ++ * Copyright (C) Nick Bane, 2005, 2006, 2007 ++ * Many fragments from pxa2xx_udc.c and mach-sa1100 driver with various ++ * GPL Copyright authors incl Russel king and Nicolas Pitre ++ * Working port to 2.6.32-1 by N C Bane ++ * ++ * This file provides interrupt routing and overall coordination for the ++ * sa1100 USB endpoints: ep0, ep1out-bulk, ep2in-bulk, as well as device ++ * initialization and some parts of USB "Chapter 9" device behavior. ++ * ++ * It implements the "USB gadget controller" API, abstracting most hardware ++ * details so that drivers running on top of this API are mostly independent ++ * of hardware. A key exception is that ep0 logic needs to understand which ++ * endpoints a given controller has, and their capabilities. Also, hardware ++ * that doesn't fully support USB (like sa1100) may need workarounds in the ++ * protocols implemented by device functions. ++ * ++ * See linux/Documentation/arm/SA1100/SA1100_USB for more info, or the ++ * kerneldoc for the API exposed to gadget drivers. ++ * ++ */ ++//#define DEBUG 1 ++//#define VERBOSE 1 ++ ++//#define SA1100_USB_DEBUG ++#ifdef SA1100_USB_DEBUG ++static int sa1100_usb_debug=0; ++#endif ++ ++#define NCB_DMA_FIX ++#ifdef NCB_DMA_FIX ++// This is a clunky fix for dma alignemnt issues ++// It should probably be done better by someone more ++// steeped in DMA lore ++#include <linux/slab.h> ++#define SEND_BUFFER_SIZE 4096 /* this is probably a bit big */ ++#define RECEIVE_BUFFER_SIZE 256 /* 64 may be all that is necessary */ ++static char *send_buffer=NULL; ++static char *receive_buffer=NULL; ++#endif ++ ++#include <linux/module.h> ++#include <linux/kernel.h> ++#include <linux/delay.h> ++#include <linux/ioport.h> ++#include <linux/sched.h> ++#include <linux/slab.h> ++#include <linux/smp_lock.h> ++#include <linux/errno.h> ++#include <linux/init.h> ++#include <linux/timer.h> ++#include <linux/list.h> ++#include <linux/interrupt.h> ++#include <linux/version.h> ++#include <linux/device.h> ++#include <linux/platform_device.h> ++ ++#include <asm/byteorder.h> ++#include <asm/io.h> ++#include <asm/irq.h> ++#include <mach/dma.h> ++#include <asm/system.h> ++#include <asm/mach-types.h> ++#include <asm/unaligned.h> ++ ++#include <linux/usb.h> ++#include <linux/usb/ch9.h> ++#include <linux/usb/gadget.h> ++ ++#if CONFIG_PROC_FS ++#include <linux/proc_fs.h> ++#endif ++ ++#if defined(CONFIG_SA1100_BALLOON) ++#include <asm/arch/balloon2.h> ++#endif ++ ++#if defined(CONFIG_SA1100_COLLIE) ++#include <linux/gpio.h> ++#include <mach/collie.h> ++#endif ++ ++#define DRIVER_VERSION __DATE__ ++ ++#define DMA_ADDR_INVALID (~(dma_addr_t)0) ++ ++ ++static const char driver_name [] = "sa1100_udc"; ++static const char driver_desc [] = "SA-1110 USB Device Controller"; ++ ++static const char ep0name [] = "ep0"; ++ ++#ifdef DEBUG ++static char *type_string (u8 bmAttributes) ++{ ++ switch ( (bmAttributes) & USB_ENDPOINT_XFERTYPE_MASK) { ++ case USB_ENDPOINT_XFER_BULK: return "bulk"; ++ //case USB_ENDPOINT_XFER_ISOC: return "iso"; ++ case USB_ENDPOINT_XFER_INT: return "intr"; ++ }; ++ return "control"; ++} ++#endif ++ ++#include <linux/dma-mapping.h> ++struct usb_stats_t { ++ unsigned long ep0_fifo_write_failures; ++ unsigned long ep0_bytes_written; ++ unsigned long ep0_fifo_read_failures; ++ unsigned long ep0_bytes_read; ++}; ++ ++struct usb_info_t { ++ dma_regs_t *dmaregs_tx, *dmaregs_rx; ++ int state; ++ unsigned char address; ++ struct usb_stats_t stats; ++}; ++ ++enum { kError=-1, kEvSuspend=0, kEvReset=1, ++ kEvResume=2, kEvAddress=3, kEvConfig=4, kEvDeConfig=5 }; ++int usbctl_next_state_on_event( int event ) { ++ return 0; ++} ++static struct usb_info_t usbd_info; ++ ++/* receiver */ ++void ep1_reset(void); ++void ep1_stall(void); ++int sa1100_usb_recv (struct usb_request *req, void (*callback) (int,int)); ++ ++/* xmitter */ ++void ep2_reset(void); ++void ep2_stall(void); ++int sa1100_usb_send (struct usb_request *req, void (*callback) (int,int)); ++ ++/* UDC register utility functions */ ++#define UDC_write(reg, val) { \ ++ int i = 10000; \ ++ do { \ ++ (reg) = (val); \ ++ if (i-- <= 0) { \ ++ printk( "%s [%d]: write %#x to %p (%#lx) failed\n", \ ++ __FUNCTION__, __LINE__, (val), &(reg), (reg)); \ ++ break; \ ++ } \ ++ } while((reg) != (val)); \ ++} ++ ++#define UDC_set(reg, val) { \ ++ int i = 10000; \ ++ do { \ ++ (reg) |= (val); \ ++ if (i-- <= 0) { \ ++ printk( "%s [%d]: set %#x of %p (%#lx) failed\n", \ ++ __FUNCTION__, __LINE__, (val), &(reg), (reg)); \ ++ break; \ ++ } \ ++ } while(!((reg) & (val))); \ ++} ++ ++#define UDC_clear(reg, val) { \ ++ int i = 10000; \ ++ do { \ ++ (reg) &= ~(val); \ ++ if (i-- <= 0) { \ ++ printk( "%s [%d]: clear %#x of %p (%#lx) failed\n", \ ++ __FUNCTION__, __LINE__, (val), &(reg), (reg)); \ ++ break; \ ++ } \ ++ } while((reg) & (val)); \ ++} ++ ++#define UDC_flip(reg, val) { \ ++ int i = 10000; \ ++ (reg) = (val); \ ++ do { \ ++ (reg) = (val); \ ++ if (i-- <= 0) { \ ++ printk( "%s [%d]: flip %#x of %p (%#lx) failed\n", \ ++ __FUNCTION__, __LINE__, (val), &(reg), (reg)); \ ++ break; \ ++ } \ ++ } while(((reg) & (val))); \ ++} ++ ++#include "sa1100_udc.h" ++ ++static struct sa1100_udc *the_controller; ++static void nuke (struct sa1100_ep *, int status); ++static void done (struct sa1100_ep *ep, struct sa1100_request *req, int status); ++static inline void ep0_idle (struct sa1100_udc *dev) ++{ ++ dev->ep0state = EP0_IDLE; ++} ++ ++// ep0 handlers ++ ++// 1 == lots of trace noise, 0 = only "important' stuff ++#define VERBOSITY 0 ++ ++#if 1 && !defined( ASSERT ) ++# define ASSERT(expr) \ ++ if(!(expr)) { \ ++ printk( "Assertion failed! %s,%s,%s,line=%d\n",\ ++ #expr,__FILE__,__FUNCTION__,__LINE__); \ ++ } ++#else ++# define ASSERT(expr) ++#endif ++ ++#if VERBOSITY ++#define PRINTKD(fmt, args...) printk( fmt , ## args) ++#else ++#define PRINTKD(fmt, args...) ++#endif ++ ++/* other subroutines */ ++unsigned int (*wrint)(void); ++void ep0_int_hndlr( void ); ++static void ep0_queue(void *buf, unsigned int req, unsigned int act); ++static void write_fifo( void ); ++static int read_fifo( struct usb_ctrlrequest * p ); ++ ++/* some voodo helpers 01Mar01ww */ ++static void set_cs_bits( __u32 set_bits ); ++static void set_de( void ); ++static void set_ipr( void ); ++static void set_ipr_and_de( void ); ++static bool clear_opr( void ); ++ ++/*************************************************************************** ++Inline Helpers ++***************************************************************************/ ++ ++/* Data extraction from usb_request_t fields */ ++enum { kTargetDevice=0, kTargetInterface=1, kTargetEndpoint=2 }; ++static inline int request_target( __u8 b ) { return (int) ( b & 0x0F); } ++ ++static inline int windex_to_ep_num( __u16 w ) { return (int) ( w & 0x000F); } ++inline int type_code_from_request( __u8 by ) { return (( by >> 4 ) & 3); } ++ ++/* following is hook for self-powered flag in GET_STATUS. Some devices ++ .. might like to override and return real info */ ++static inline bool self_powered_hook( void ) { return true; } ++ ++#if VERBOSITY ++/* "pcs" == "print control status" */ ++static inline void pcs( void ) ++{ ++ __u32 foo = Ser0UDCCS0; ++ printk( "%8.8X: %s %s %s %s\n", ++ foo, ++ foo & UDCCS0_SE ? "SE" : "", ++ foo & UDCCS0_OPR ? "OPR" : "", ++ foo & UDCCS0_IPR ? "IPR" : "", ++ foo & UDCCS0_SST ? "SST" : "" ++ ); ++} ++static inline void preq( struct usb_ctrlrequest * pReq ) ++{ ++ static char * tnames[] = { "dev", "intf", "ep", "oth" }; ++ static char * rnames[] = { "std", "class", "vendor", "???" }; ++ char * psz; ++ switch( pReq->bRequest ) { ++ case USB_REQ_GET_STATUS: psz = "get stat"; break; ++ case USB_REQ_CLEAR_FEATURE: psz = "clr feat"; break; ++ case USB_REQ_SET_FEATURE: psz = "set feat"; break; ++ case USB_REQ_SET_ADDRESS: psz = "set addr"; break; ++ case USB_REQ_GET_DESCRIPTOR: psz = "get desc"; break; ++ case USB_REQ_SET_DESCRIPTOR: psz = "set desc"; break; ++ case USB_REQ_GET_CONFIGURATION: psz = "get cfg"; break; ++ case USB_REQ_SET_CONFIGURATION: psz = "set cfg"; break; ++ case USB_REQ_GET_INTERFACE: psz = "get intf"; break; ++ case USB_REQ_SET_INTERFACE: psz = "set intf"; break; ++ default: psz = "unknown"; break; ++ } ++ printk( "- [%s: %s req to %s. dir=%s]\n", psz, ++ rnames[ (pReq->bRequestType >> 5) & 3 ], ++ tnames[ pReq->bRequestType & 3 ], ++ ( pReq->bRequestType & 0x80 ) ? "in" : "out" ); ++} ++ ++static inline void usbctl_dump_request(const char *prefix, const struct usb_ctrlrequest *req) ++{ ++ printk("%s: bRequestType=0x%02x bRequest=0x%02x " ++ "wValue=0x%04x wIndex=0x%04x wLength=0x%04x\n", ++ prefix, req->bRequestType, req->bRequest, ++ le16_to_cpu(req->wValue), le16_to_cpu(req->wIndex), ++ le16_to_cpu(req->wLength)); ++} ++#else ++static inline void pcs( void ){} ++//static inline void preq( void ){} ++static inline void preq( void *x ){} ++static inline void usbctl_dump_request(const char *prefix, const struct usb_ctrlrequest *req) {} ++#endif ++ ++/*************************************************************************** ++Globals ++***************************************************************************/ ++static const char pszMe[] = "usbep0: "; ++ ++ ++/* global write struct to keep write ++ ..state around across interrupts */ ++static struct { ++ unsigned char *p; ++ int bytes_left; ++} wr; ++ ++/*************************************************************************** ++Public Interface ++***************************************************************************/ ++ ++/* reset received from HUB (or controller just went nuts and reset by itself!) ++ so udc core has been reset, track this state here */ ++void ep0_reset(void) ++{ ++ /* reset state machine */ ++ wr.p = NULL; ++ wr.bytes_left = 0; ++ usbd_info.address=0; ++// needed? ++ Ser0UDCAR = 0; ++} ++ ++ ++/* handle interrupt for endpoint zero */ ++ ++inline void ep0_clear_write(void) { ++ wr.p = NULL; ++ wr.bytes_left = 0; ++} ++ ++/* this is a config packet parser based on that from the updated HH 2.6 udc */ ++static void ep0_read_packet(void) ++{ ++ unsigned char status_buf[2]; /* returned in GET_STATUS */ ++ struct usb_ctrlrequest req; ++ int request_type; ++ int n; ++ __u32 address; ++ __u32 in, out; ++ ++ /* reset previous count */ ++ the_controller->ep0_req_len=-1; ++ ++ /* read the setup request */ ++ n = read_fifo( &req ); ++ usbctl_dump_request("ep0_read_packet",&req); ++ ++ if ( n != sizeof( req ) ) { ++ printk( "%ssetup begin: fifo READ ERROR wanted %d bytes got %d. " ++ " Stalling out...\n", ++ pszMe, sizeof( req ), n ); ++ /* force stall, serviced out */ ++ set_cs_bits( UDCCS0_FST | UDCCS0_SO ); ++ goto sh_sb_end; ++ } ++ ++ /* Is it a standard request? (not vendor or class request) */ ++ request_type = type_code_from_request( req.bRequestType ); ++ if ( request_type != 0 ) { ++ printk( "%ssetup begin: unsupported bRequestType: %d ignored\n", ++ pszMe, request_type ); ++ set_cs_bits( UDCCS0_DE | UDCCS0_SO ); ++ goto sh_sb_end; ++ } ++ ++ /* save requested reply size */ ++ the_controller->ep0_req_len=le16_to_cpu(req.wLength); ++ PRINTKD("%s: request length is %d\n",__FUNCTION__,the_controller->ep0_req_len); ++ ++#if VERBOSITY ++ { ++ unsigned char * pdb = (unsigned char *) &req; ++ PRINTKD( "%2.2X %2.2X %2.2X %2.2X %2.2X %2.2X %2.2X %2.2X ", ++ pdb[0], pdb[1], pdb[2], pdb[3], pdb[4], pdb[5], pdb[6], pdb[7] ++ ); ++ preq( &req ); ++ } ++#endif ++ ++ /* Handle it */ ++ switch( req.bRequest ) { ++ ++ /* This first bunch have no data phase */ ++ ++ case USB_REQ_SET_ADDRESS: ++ address = (__u32) (req.wValue & 0x7F); ++ /* when SO and DE sent, UDC will enter status phase and ack, ++ ..propagating new address to udc core. Next control transfer ++ ..will be on the new address. You can't see the change in a ++ ..read back of CAR until then. (about 250us later, on my box). ++ ..The original Intel driver sets S0 and DE and code to check ++ ..that address has propagated here. I tried this, but it ++ ..would only work sometimes! The rest of the time it would ++ ..never propagate and we'd spin forever. So now I just set ++ ..it and pray... ++ */ ++ Ser0UDCAR = address; ++ usbd_info.address = address; ++ usbctl_next_state_on_event( kEvAddress ); ++ set_cs_bits( UDCCS0_SO | UDCCS0_DE ); /* no data phase */ ++ printk( "%sI have been assigned address: %d\n", pszMe, address ); ++ break; ++ ++ ++ case USB_REQ_SET_CONFIGURATION: ++ if ( req.wValue == 1 ) { ++ /* configured */ ++ if (usbctl_next_state_on_event( kEvConfig ) != kError) { ++ /* (re)set the out and in max packet sizes */ ++ PRINTKD( "%s: calling the_controller.driver->setup with SET_CONFIGURATION\n", __FUNCTION__ ); ++ the_controller->driver->setup(&the_controller->gadget, &req); ++ in = __le16_to_cpu( the_controller->ep[1].ep.maxpacket ); ++ out = __le16_to_cpu( the_controller->ep[2].ep.maxpacket ); ++ Ser0UDCOMP = ( out - 1 ); ++ Ser0UDCIMP = ( in - 1 ); ++ // we are configured ++ usbd_info.state = USB_STATE_CONFIGURED; ++ // enable rx and tx interrupts ++ Ser0UDCCR &= ~(UDCCR_RIM | UDCCR_TIM); ++ ++ printk( "%sConfigured (OMP=%8.8X IMP=%8.8X)\n", pszMe, out, in ); ++ break; ++ } ++ } else if ( req.wValue == 0 ) { ++ /* de-configured */ ++ if (usbctl_next_state_on_event( kEvDeConfig ) != kError ) ++ printk( "%sDe-Configured\n", pszMe ); ++ usbd_info.state = 0; ++ Ser0UDCCR |= UDCCR_RIM | UDCCR_TIM; ++ ep1_reset (); ++ ep2_reset (); ++ printk("%s: de-configured. Tx and Rx interrupts disabled. ep1 and ep2 reset\n",__FUNCTION__); ++ } else { ++ printk( "%ssetup phase: Unknown " ++ "\"set configuration\" data %d\n", ++ pszMe, req.wValue ); ++ } ++ set_cs_bits( UDCCS0_SO | UDCCS0_DE ); /* no data phase */ ++ break; ++ ++ case USB_REQ_CLEAR_FEATURE: ++ /* could check data length, direction...26Jan01ww */ ++ if ( req.wValue == 0 ) { /* clearing ENDPOINT_HALT/STALL */ ++ int ep = windex_to_ep_num( req.wIndex ); ++ if ( ep == 1 ) { ++ printk( "%sclear feature \"endpoint halt\" " ++ " on receiver\n", pszMe ); ++ ep1_reset(); ++ } ++ else if ( ep == 2 ) { ++ printk( "%sclear feature \"endpoint halt\" " ++ "on xmitter\n", pszMe ); ++ ep2_reset(); ++ } else { ++ printk( "%sclear feature \"endpoint halt\" " ++ "on unsupported ep # %d\n", ++ pszMe, ep ); ++ } ++ } else { ++ printk( "%sUnsupported feature selector (%d) " ++ "in clear feature. Ignored.\n" , ++ pszMe, req.wValue ); ++ } ++ set_cs_bits( UDCCS0_SO | UDCCS0_DE ); /* no data phase */ ++ break; ++ ++ case USB_REQ_SET_FEATURE: ++ if ( req.wValue == 0 ) { /* setting ENDPOINT_HALT/STALL */ ++ int ep = windex_to_ep_num( req.wValue ); ++ if ( ep == 1 ) { ++ printk( "%set feature \"endpoint halt\" " ++ "on receiver\n", pszMe ); ++ ep1_stall(); ++ } ++ else if ( ep == 2 ) { ++ printk( "%sset feature \"endpoint halt\" " ++ " on xmitter\n", pszMe ); ++ ep2_stall(); ++ } else { ++ printk( "%sset feature \"endpoint halt\" " ++ "on unsupported ep # %d\n", ++ pszMe, ep ); ++ } ++ } ++ else { ++ printk( "%sUnsupported feature selector " ++ "(%d) in set feature\n", ++ pszMe, req.wValue ); ++ } ++ set_cs_bits( UDCCS0_SO | UDCCS0_DE ); /* no data phase */ ++ break; ++ ++ /* The rest have a data phase that writes back to the host */ ++ case USB_REQ_GET_STATUS: ++ /* return status bit flags */ ++ status_buf[0] = status_buf[1] = 0; ++ n = request_target(req.bRequestType); ++ switch( n ) { ++ case kTargetDevice: ++ if ( self_powered_hook() ) ++ status_buf[0] |= 1; ++ break; ++ case kTargetInterface: ++ break; ++ case kTargetEndpoint: ++ /* return stalled bit */ ++ n = windex_to_ep_num( req.wIndex ); ++ if ( n == 1 ) ++ status_buf[0] |= (Ser0UDCCS1 & UDCCS1_FST) >> 4; ++ else if ( n == 2 ) ++ status_buf[0] |= (Ser0UDCCS2 & UDCCS2_FST) >> 5; ++ else { ++ printk( "%sUnknown endpoint (%d) " ++ "in GET_STATUS\n", pszMe, n ); ++ } ++ break; ++ default: ++ printk( "%sUnknown target (%d) in GET_STATUS\n", ++ pszMe, n ); ++ /* fall thru */ ++ break; ++ } ++ PRINTKD("%s: GET_STATUS writing %d\n",__FUNCTION__,req.wLength); ++ ep0_queue( status_buf, req.wLength, sizeof( status_buf )); ++ break; ++ case USB_REQ_GET_DESCRIPTOR: ++ PRINTKD( "%s: calling the_controller.driver->setup with GET_DESCRIPTOR\n", __FUNCTION__ ); ++ the_controller->driver->setup(&the_controller->gadget, &req); ++ break; ++ case USB_REQ_GET_CONFIGURATION: ++ PRINTKD( "%s: calling the_controller.driver->setup with GET_CONFIGURATION\n", __FUNCTION__ ); ++ the_controller->driver->setup(&the_controller->gadget, &req); ++ break; ++ case USB_REQ_GET_INTERFACE: ++ PRINTKD( "%s: calling the_controller->driver->setup with GET_INTERFACE\n", __FUNCTION__ ); ++ the_controller->driver->setup(&the_controller->gadget, &req); ++ break; ++ case USB_REQ_SET_INTERFACE: ++ PRINTKD( "%s: calling the_controller->driver->setup with SET_INTERFACE\n", __FUNCTION__ ); ++ the_controller->driver->setup(&the_controller->gadget, &req); ++ break; ++ default : ++ printk("%sunknown request 0x%x\n", pszMe, req.bRequest); ++ break; ++ } /* switch( bRequest ) */ ++ ++sh_sb_end: ++ return; ++ ++} ++ ++void ep0_int_hndlr(void) ++{ ++ u32 cs_reg_in; ++ ++ pcs(); ++ ++ cs_reg_in = Ser0UDCCS0; ++ ++ /* ++ * If "setup end" has been set, the usb controller has terminated ++ * a setup transaction before we set DE. This happens during ++ * enumeration with some hosts. For example, the host will ask for ++ * our device descriptor and specify a return of 64 bytes. When we ++ * hand back the first 8, the host will know our max packet size ++ * and turn around and issue a new setup immediately. This causes ++ * the UDC to auto-ack the new setup and set SE. We must then ++ * "unload" (process) the new setup, which is what will happen ++ * after this preamble is finished executing. ++ */ ++ if (cs_reg_in & UDCCS0_SE) { ++ PRINTKD("UDC: early termination of setup\n"); ++ ++ /* ++ * Clear setup end ++ */ ++ set_cs_bits(UDCCS0_SSE); ++ ++ /* ++ * Clear any pending write. ++ */ ++ ep0_clear_write(); ++ } ++ ++ /* ++ * UDC sent a stall due to a protocol violation. ++ */ ++ if (cs_reg_in & UDCCS0_SST) { ++ PRINTKD("UDC: write_preamble: UDC sent stall\n"); ++ ++ /* ++ * Clear sent stall ++ */ ++ set_cs_bits(UDCCS0_SST); ++ ++ /* ++ * Clear any pending write. ++ */ ++ ep0_clear_write(); ++ } ++ ++ switch (cs_reg_in & (UDCCS0_OPR | UDCCS0_IPR)) { ++ case UDCCS0_OPR | UDCCS0_IPR: ++ PRINTKD("UDC: write_preamble: see OPR. Stopping write to " ++ "handle new SETUP\n"); ++ ++ /* ++ * very rarely, you can get OPR and ++ * leftover IPR. Try to clear ++ */ ++ UDC_clear(Ser0UDCCS0, UDCCS0_IPR); ++ ++ /* ++ * Clear any pending write. ++ */ ++ ep0_clear_write(); ++ ++ /*FALLTHROUGH*/ ++ case UDCCS0_OPR: ++ /* ++ * A new setup request is pending. Handle ++ * it. Note that we don't try to read a ++ * packet if SE was set and OPR is clear. ++ */ ++ ep0_read_packet(); ++ break; ++ ++ case 0: ++ // if data pending ... ++ if (wr.p) { ++ unsigned int cs_bits = 0; ++ if (wr.bytes_left != 0) { ++ /* ++ * More data to go ++ */ ++ write_fifo(); ++ // packet ready ++ cs_bits |= UDCCS0_IPR; ++ } ++ ++ if (wr.bytes_left == 0) { ++ /* ++ * All data sent. ++ */ ++ cs_bits |= wrint(); ++ // a null packet may be following ++ if (!wrint) ++ ep0_clear_write(); ++ } ++ set_cs_bits(cs_bits); ++ } ++ else ++ PRINTKD("%s: No data - probably an ACK\n",__FUNCTION__); ++ break; ++ ++ case UDCCS0_IPR: ++ PRINTKD("UDC: IPR set, not writing\n"); ++ break; ++ } ++ ++ pcs(); ++ PRINTKD( "-end-\n" ); ++} ++ ++static unsigned int ep0_sh_write_data(void) ++{ ++ /* ++ * If bytes left is zero, we are coming in on the ++ * interrupt after the last packet went out. And ++ * we know we don't have to empty packet this ++ * transfer so just set DE and we are done ++ */ ++ PRINTKD("UDC: normal packet ended\n"); ++ wrint=NULL; ++ return UDCCS0_DE; ++} ++ ++static unsigned int ep0_sh_write_with_empty_packet(void) ++{ ++ /* ++ * If bytes left is zero, we are coming in on the ++ * interrupt after the last packet went out. ++ * We must do short packet suff, so set DE and IPR ++ */ ++ PRINTKD("UDC: short packet sent\n"); ++ wrint=NULL; ++ return UDCCS0_IPR | UDCCS0_DE; ++} ++ ++static unsigned int ep0_sh_write_data_then_empty_packet(void) ++{ ++ PRINTKD("UDC: last packet full. Send empty packet next\n"); ++ wrint=ep0_sh_write_with_empty_packet; ++ return 0; ++} ++ ++static void ep0_queue(void *buf, unsigned int len, unsigned int req_len) ++{ ++ __u32 cs_reg_bits = UDCCS0_IPR; ++ ++ PRINTKD("a=%d r=%d\n", len, req_len); ++ ++ if (len == 0) { ++ // no output packet to wait for ++ PRINTKD("%s: zero byte packet being queued. Setting DE and OPR end exiting\n",__FUNCTION__); ++ set_cs_bits(UDCCS0_DE | UDCCS0_SO); ++ return; ++ } ++ ++ /* ++ * thou shalt not enter data phase until ++ * Out Packet Ready is clear ++ */ ++ if (!clear_opr()) { ++ printk("UDC: SO did not clear OPR\n"); ++ set_cs_bits(UDCCS0_DE | UDCCS0_SO); ++ return; ++ } ++ ++ // note data to xmit stored ++ wr.p=buf; ++ wr.bytes_left=min(len, req_len); ++ ++ // write the first block ++ write_fifo(); ++ ++ // done already? ++ if (wr.bytes_left == 0) { ++ /* ++ * out in one, so data end ++ */ ++ cs_reg_bits |= UDCCS0_DE; ++ ep0_clear_write(); ++ // rest is a shorter than expected reply? ++ } else if (len < req_len) { ++ /* ++ * we are going to short-change host ++ * so need nul to not stall ++ */ ++ if (len % 8) { ++ PRINTKD("%s: %d more to go ending in a short packet.\n",__FUNCTION__,wr.bytes_left); ++ wrint=ep0_sh_write_with_empty_packet; ++ } ++ // unless we are on a packet boundary. Then send full packet plus null packet. ++ else { ++ PRINTKD("%s: %d more to go then add empty packet.\n",__FUNCTION__,wr.bytes_left); ++ wrint=ep0_sh_write_data_then_empty_packet; ++ } ++ } else { ++ /* ++ * we have as much or more than requested ++ */ ++ PRINTKD("%s: %d more to go.\n",__FUNCTION__,wr.bytes_left); ++ wrint=ep0_sh_write_data; ++ } ++ ++ /* ++ * note: IPR was set uncondtionally at start of routine ++ */ ++ set_cs_bits(cs_reg_bits); ++} ++ ++/* ++ * write_fifo() ++ * Stick bytes in the 8 bytes endpoint zero FIFO. ++ * This version uses a variety of tricks to make sure the bytes ++ * are written correctly. 1. The count register is checked to ++ * see if the byte went in, and the write is attempted again ++ * if not. 2. An overall counter is used to break out so we ++ * don't hang in those (rare) cases where the UDC reverses ++ * direction of the FIFO underneath us without notification ++ * (in response to host aborting a setup transaction early). ++ * ++ */ ++static void write_fifo( void ) ++{ ++ int bytes_this_time = min(wr.bytes_left, 8); ++ int bytes_written = 0; ++ ++ PRINTKD( "WF=%d: ", bytes_this_time ); ++ ++ while( bytes_this_time-- ) { ++ unsigned int cwc; ++ int i; ++ PRINTKD( "%2.2X ", *wr.p ); ++ cwc = Ser0UDCWC & 15; ++ i = 10; ++ do { ++ Ser0UDCD0 = *wr.p; ++ udelay( 20 ); /* voodo 28Feb01ww */ ++ } while( (Ser0UDCWC &15) == cwc && --i ); ++ ++ if ( i == 0 ) { ++ printk( "%swrite_fifo: write failure\n", pszMe ); ++ usbd_info.stats.ep0_fifo_write_failures++; ++ } ++ ++ wr.p++; ++ bytes_written++; ++ } ++ wr.bytes_left -= bytes_written; ++ ++ /* following propagation voodo so maybe caller writing IPR in ++ ..a moment might actually get it to stick 28Feb01ww */ ++ udelay( 300 ); ++ ++ usbd_info.stats.ep0_bytes_written += bytes_written; ++ PRINTKD( "L=%d WCR=%8.8lX\n", wr.bytes_left, Ser0UDCWC ); ++} ++/* ++ * read_fifo() ++ * Read 1-8 bytes out of FIFO and put in request. ++ * Called to do the initial read of setup requests ++ * from the host. Return number of bytes read. ++ * ++ * Like write fifo above, this driver uses multiple ++ * reads checked agains the count register with an ++ * overall timeout. ++ * ++ */ ++static int ++read_fifo( struct usb_ctrlrequest * request ) ++{ ++ int bytes_read = 0; ++ int fifo_count; ++ ++ unsigned char * pOut = (unsigned char*) request; ++ ++ fifo_count = ( Ser0UDCWC & 0xFF ); ++ ++ ASSERT( fifo_count <= 8 ); ++ PRINTKD( "RF=%d ", fifo_count ); ++ ++ while( fifo_count-- ) { ++ unsigned int cwc; ++ int i; ++ ++ cwc = Ser0UDCWC & 15; ++ ++ i = 10; ++ do { ++ *pOut = (unsigned char) Ser0UDCD0; ++ udelay( 20 ); ++ } while( ( Ser0UDCWC & 15 ) == cwc && --i ); ++ ++ if ( i == 0 ) { ++ printk( "%sread_fifo(): read failure\n", pszMe ); ++ usbd_info.stats.ep0_fifo_read_failures++; ++ } ++ pOut++; ++ bytes_read++; ++ } ++ ++ PRINTKD( "fc=%d\n", bytes_read ); ++ usbd_info.stats.ep0_bytes_read++; ++ return bytes_read; ++} ++ ++/* some voodo I am adding, since the vanilla macros just aren't doing it 1Mar01ww */ ++ ++#define ABORT_BITS ( UDCCS0_SST | UDCCS0_SE ) ++#define OK_TO_WRITE (!( Ser0UDCCS0 & ABORT_BITS )) ++#define BOTH_BITS (UDCCS0_IPR | UDCCS0_DE) ++ ++static void set_cs_bits( __u32 bits ) ++{ ++ if ( bits & ( UDCCS0_SO | UDCCS0_SSE | UDCCS0_FST | UDCCS0_SST) ) ++ Ser0UDCCS0 = bits; ++ else if ( (bits & BOTH_BITS) == BOTH_BITS ) ++ set_ipr_and_de(); ++ else if ( bits & UDCCS0_IPR ) ++ set_ipr(); ++ else if ( bits & UDCCS0_DE ) ++ set_de(); ++} ++ ++static void set_de( void ) ++{ ++ int i = 1; ++ while( 1 ) { ++ if ( OK_TO_WRITE ) { ++ Ser0UDCCS0 |= UDCCS0_DE; ++ } else { ++ PRINTKD( "%sQuitting set DE because SST or SE set\n", pszMe ); ++ break; ++ } ++ if ( Ser0UDCCS0 & UDCCS0_DE ) ++ break; ++ udelay( i ); ++ if ( ++i == 50 ) { ++ printk( "%sDangnabbbit! Cannot set DE! (DE=%8.8X CCS0=%8.8lX)\n", ++ pszMe, UDCCS0_DE, Ser0UDCCS0 ); ++ break; ++ } ++ } ++} ++ ++static void set_ipr( void ) ++{ ++ int i = 1; ++ while( 1 ) { ++ if ( OK_TO_WRITE ) { ++ Ser0UDCCS0 |= UDCCS0_IPR; ++ } else { ++ PRINTKD( "%sQuitting set IPR because SST or SE set\n", pszMe ); ++ break; ++ } ++ if ( Ser0UDCCS0 & UDCCS0_IPR ) ++ break; ++ udelay( i ); ++ if ( ++i == 50 ) { ++ printk( "%sDangnabbbit! Cannot set IPR! (IPR=%8.8X CCS0=%8.8lX)\n", ++ pszMe, UDCCS0_IPR, Ser0UDCCS0 ); ++ break; ++ } ++ } ++} ++ ++static void set_ipr_and_de( void ) ++{ ++ int i = 1; ++ while( 1 ) { ++ if ( OK_TO_WRITE ) { ++ Ser0UDCCS0 |= BOTH_BITS; ++ } else { ++ PRINTKD( "%sQuitting set IPR/DE because SST or SE set\n", pszMe ); ++ break; ++ } ++ if ( (Ser0UDCCS0 & BOTH_BITS) == BOTH_BITS) ++ break; ++ udelay( i ); ++ if ( ++i == 50 ) { ++ printk( "%sDangnabbbit! Cannot set DE/IPR! (DE=%8.8X IPR=%8.8X CCS0=%8.8lX)\n", ++ pszMe, UDCCS0_DE, UDCCS0_IPR, Ser0UDCCS0 ); ++ break; ++ } ++ } ++} ++ ++static bool clear_opr( void ) ++{ ++ int i = 10000; ++ bool is_clear; ++ do { ++ Ser0UDCCS0 = UDCCS0_SO; ++ is_clear = ! ( Ser0UDCCS0 & UDCCS0_OPR ); ++ if ( i-- <= 0 ) { ++ printk( "%sclear_opr(): failed\n", pszMe ); ++ break; ++ } ++ } while( ! is_clear ); ++ return is_clear; ++} ++ ++ ++ ++// ep1 handlers ++ ++static char *ep1_buf; ++static int ep1_len; ++static void (*ep1_callback)(int flag, int size); ++static char *ep1_curdmabuf; ++static dma_addr_t ep1_curdmapos; ++static int ep1_curdmalen; ++static int ep1_remain; ++static int ep1_used; ++ ++static dma_regs_t *dmaregs_rx = NULL; ++static int rx_pktsize; ++ ++static int naking; ++ ++static void ++ep1_start(void) ++{ ++ sa1100_reset_dma(dmaregs_rx); ++ if (!ep1_curdmalen) { ++ ep1_curdmalen = rx_pktsize; ++ if (ep1_curdmalen > ep1_remain) ++ ep1_curdmalen = ep1_remain; ++ ep1_curdmapos = dma_map_single(NULL, ep1_curdmabuf, ep1_curdmalen, ++ DMA_FROM_DEVICE); ++ } ++ ++ UDC_write( Ser0UDCOMP, ep1_curdmalen-1 ); ++ ++ sa1100_start_dma(dmaregs_rx, ep1_curdmapos, ep1_curdmalen); ++ ++ if ( naking ) { ++ /* turn off NAK of OUT packets, if set */ ++ UDC_flip( Ser0UDCCS1, UDCCS1_RPC ); ++ naking = 0; ++ } ++} ++ ++static void ++ep1_done(int flag) ++{ ++ int size = ep1_len - ep1_remain; ++ ++ if (!ep1_len) ++ return; ++ if (ep1_curdmalen) ++ dma_unmap_single(NULL, ep1_curdmapos, ep1_curdmalen, ++ DMA_FROM_DEVICE); ++ ep1_len = ep1_curdmalen = 0; ++ if (ep1_callback) ++ ep1_callback(flag, size); ++} ++ ++void ++ep1_state_change_notify( int new_state ) ++{ ++ ++} ++ ++void ++ep1_stall( void ) ++{ ++ /* SET_FEATURE force stall at UDC */ ++ UDC_set( Ser0UDCCS1, UDCCS1_FST ); ++} ++ ++int ++ep1_init(dma_regs_t *dmaregs) ++{ ++ dmaregs_rx = dmaregs; ++ sa1100_reset_dma(dmaregs_rx); ++ ep1_done(-EAGAIN); ++ return 0; ++} ++ ++void ++ep1_reset(void) ++{ ++ if (dmaregs_rx) ++ sa1100_reset_dma(dmaregs_rx); ++ UDC_clear(Ser0UDCCS1, UDCCS1_FST); ++ ep1_done(-EINTR); ++} ++ ++void ep1_int_hndlr(int udcsr) ++{ ++ dma_addr_t dma_addr; ++ unsigned int len; ++ int status = Ser0UDCCS1; ++ ++ if ( naking ) printk( "%sEh? in ISR but naking = %d\n", "usbrx: ", naking ); ++ ++ if (status & UDCCS1_RPC) { ++ ++ if (!ep1_curdmalen) { ++ printk("usb_recv: RPC for non-existent buffer\n"); ++ naking=1; ++ return; ++ } ++ ++ sa1100_stop_dma(dmaregs_rx); ++ ++ if (status & UDCCS1_SST) { ++ printk("usb_recv: stall sent OMP=%ld\n", Ser0UDCOMP); ++ UDC_flip(Ser0UDCCS1, UDCCS1_SST); ++ ep1_done(-EIO); // UDC aborted current transfer, so we do ++ return; ++ } ++ ++ if (status & UDCCS1_RPE) { ++ printk("usb_recv: RPError %x\n", status); ++ UDC_flip(Ser0UDCCS1, UDCCS1_RPC); ++ ep1_done(-EIO); ++ return; ++ } ++ ++ dma_addr=sa1100_get_dma_pos(dmaregs_rx); ++ dma_unmap_single(NULL, ep1_curdmapos, ep1_curdmalen, ++ DMA_FROM_DEVICE); ++ len = dma_addr - ep1_curdmapos; ++#ifdef SA1100_USB_DEBUG ++ if (sa1100_usb_debug) { ++ int i; ++ printk("usb rx %d :\n ",len); ++ if (sa1100_usb_debug>1) { ++ for (i=0; i<len; i++) { ++ if ((i % 32)==31) ++ printk("\n "); ++ printk("%2.2x ",((char *)ep1_curdmapos)[i]); ++ } ++ } ++ printk("\n"); ++ } ++#endif ++ if (len < ep1_curdmalen) { ++ char *buf = ep1_curdmabuf + len; ++ while (Ser0UDCCS1 & UDCCS1_RNE) { ++ if (len >= ep1_curdmalen) { ++ printk("usb_recv: too much data in fifo\n"); ++ break; ++ } ++ *buf++ = Ser0UDCDR; ++ len++; ++ } ++ } else if (Ser0UDCCS1 & UDCCS1_RNE) { ++ printk("usb_recv: fifo screwed, shouldn't contain data\n"); ++ len = 0; ++ } ++ ++#if defined(NCB_DMA_FIX) ++// if (len && (ep1_buf != ep1_curdmabuf)) ++// memcpy(ep1_buf,ep1_curdmabuf,len); ++ if (len) ++ memcpy(&(((unsigned char *)ep1_buf)[ep1_used]),ep1_curdmabuf,len); ++#endif ++ ++ ep1_curdmalen = 0; /* dma unmap already done */ ++ ep1_remain -= len; ++ ep1_used += len; ++// ep1_curdmabuf += len; // use same buffer again ++ naking = 1; ++//printk("%s: received %d, %d remaining\n",__FUNCTION__,len,ep1_remain); ++ if (len && (len == rx_pktsize)) ++ ep1_start(); ++ else ++ ep1_done((len) ? 0 : -EPIPE); ++ } ++ /* else, you can get here if we are holding NAK */ ++} ++ ++int ++sa1100_usb_recv(struct usb_request *req, void (*callback)(int flag, int size)) ++{ ++ unsigned long flags; ++ char *buf=req->buf; ++ int len=req->length; ++ ++ if (ep1_len) ++ return -EBUSY; ++ ++ local_irq_save(flags); ++ ep1_buf = buf; ++ ep1_len = len; ++ ep1_callback = callback; ++ ep1_remain = len; ++ ep1_used = 0; ++#ifdef NCB_DMA_FIX ++// if (((size_t)buf)&3) ++ if (1) ++ ep1_curdmabuf = receive_buffer; ++ else ++#else ++ ep1_curdmabuf = buf; ++#endif ++ ep1_curdmalen = 0; ++ ep1_start(); ++ local_irq_restore(flags); ++ ++ return 0; ++} ++ ++// ep2 handlers ++ ++static char *ep2_buf; ++static int ep2_len; ++static void (*ep2_callback)(int status, int size); ++static dma_addr_t ep2_dma; ++static dma_addr_t ep2_curdmapos; ++static int ep2_curdmalen; ++static int ep2_remain; ++static dma_regs_t *dmaregs_tx = NULL; ++static int tx_pktsize; ++ ++/* device state is changing, async */ ++void ++ep2_state_change_notify( int new_state ) ++{ ++} ++ ++/* set feature stall executing, async */ ++void ++ep2_stall( void ) ++{ ++ UDC_set( Ser0UDCCS2, UDCCS2_FST ); /* force stall at UDC */ ++} ++ ++static void ++ep2_start(void) ++{ ++ if (!ep2_len) ++ return; ++ ++ ep2_curdmalen = tx_pktsize; ++ if (ep2_curdmalen > ep2_remain) ++ ep2_curdmalen = ep2_remain; ++ ++ /* must do this _before_ queue buffer.. */ ++ UDC_flip( Ser0UDCCS2,UDCCS2_TPC ); /* stop NAKing IN tokens */ ++ UDC_write( Ser0UDCIMP, ep2_curdmalen-1 ); ++ ++ Ser0UDCAR = usbd_info.address; // fighting stupid silicon bug ++ sa1100_start_dma(dmaregs_tx, ep2_curdmapos, ep2_curdmalen); ++} ++ ++static void ++ep2_done(int flag) ++{ ++ int size = ep2_len - ep2_remain; ++ if (ep2_len) { ++ dma_unmap_single(NULL, ep2_dma, ep2_len, DMA_TO_DEVICE); ++ ep2_len = 0; ++ if (ep2_callback) ++ ep2_callback(flag, size); ++ } ++} ++ ++int ep2_init(dma_regs_t *dmaregs) ++{ ++ dmaregs_tx = dmaregs; ++ sa1100_reset_dma(dmaregs_tx); ++ ep2_done(-EAGAIN); ++ return 0; ++} ++ ++void ep2_reset(void) ++{ ++ UDC_clear(Ser0UDCCS2, UDCCS2_FST); ++ if (dmaregs_tx) ++ sa1100_reset_dma(dmaregs_tx); ++ ep2_done(-EINTR); ++} ++ ++void ep2_int_hndlr(int udcsr) ++{ ++ int status = Ser0UDCCS2; ++ ++ if (Ser0UDCAR != usbd_info.address) // check for stupid silicon bug. ++ Ser0UDCAR = usbd_info.address; ++ ++ if (status & UDCCS2_TPC) { ++ ++ UDC_flip(Ser0UDCCS2, UDCCS2_SST); ++ ++ sa1100_reset_dma(dmaregs_tx); ++ ++ if (status & (UDCCS2_TPE | UDCCS2_TUR)) { ++ printk("usb_send: transmit error %x\n", status); ++ ep2_done(-EIO); ++ } else { ++ ep2_curdmapos += ep2_curdmalen; ++ ep2_remain -= ep2_curdmalen; ++ ++ if (ep2_remain != 0) ++ ep2_start(); ++ else ++ ep2_done(0); ++ } ++ } else { ++ printk("usb_send: Not TPC: UDCCS2 = %x\n", status); ++ } ++} ++ ++int ++sa1100_usb_send(struct usb_request *req, void (*callback)(int status, int size)) ++{ ++ char *buf=req->buf; ++ int len=req->length; ++ unsigned long flags; ++ ++ if (usbd_info.state != USB_STATE_CONFIGURED) { ++ PRINTKD("%s: return -ENODEV\n",__FUNCTION__); ++ return -ENODEV; ++ } ++ ++ if (ep2_len) { ++ PRINTKD("%s: return -EBUSY\n",__FUNCTION__); ++ return -EBUSY; ++ } ++ ++ local_irq_save(flags); ++#ifdef NCB_DMA_FIX ++ // if misaligned, copy to aligned buffer ++// if (((size_t)buf)&3) { ++ if (1) { ++ PRINTKD("%s: copying %d bytes to send_buffer\n",__FUNCTION__,len); ++ memcpy(send_buffer,buf,len); ++ ep2_buf = send_buffer; ++ } ++ else ++#endif ++ ep2_buf = buf; ++ ++ ep2_len = len; ++ ep2_dma = dma_map_single(NULL, ep2_buf, len,DMA_TO_DEVICE); ++ PRINTKD("%s: mapped dma to buffer(%p0\n",__FUNCTION__,buf); ++ ++ ep2_callback = callback; ++ ep2_remain = len; ++ ep2_curdmapos = ep2_dma; ++ ++ PRINTKD("%s: calling ep2_start\n",__FUNCTION__); ++ ep2_start(); ++ local_irq_restore(flags); ++ ++ return 0; ++} ++/*-------------------------------------------------------------------------*/ ++ ++static int ++sa1100_enable(struct usb_ep *_ep, const struct usb_endpoint_descriptor *desc) ++{ ++ struct sa1100_udc *dev; ++ struct sa1100_ep *ep; ++ u32 max; ++ int type; ++ ++ ep = container_of (_ep, struct sa1100_ep, ep); ++ if (!_ep || !desc || ep->desc || _ep->name == ep0name ++ || desc->bDescriptorType != USB_DT_ENDPOINT) { ++ PRINTKD("%s: _ep = %p, desc = %p\n",__FUNCTION__,_ep,desc); ++ if (_ep && desc) ++ PRINTKD("%s: ep->desc = %p, _ep->name = %s desc->bDescriptorType = %s\n",__FUNCTION__,ep->desc,_ep->name, ++ (desc->bDescriptorType == USB_DT_ENDPOINT) ? "USB_DT_ENDPOINT":"bad!!"); ++ return -EINVAL; ++ } ++ ++ dev = ep->dev; ++ if (!dev->driver || dev->gadget.speed == USB_SPEED_UNKNOWN) ++ return -ESHUTDOWN; ++ ++ type = desc->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK; ++ max = le16_to_cpu (desc->wMaxPacketSize); ++ switch (max) { ++ case 64: case 32: ++ /* note: maxpacket > 16 means DMA might overrun/underrun */ ++ case 16: case 8: ++ break; ++ default: ++ if (type == USB_ENDPOINT_XFER_INT && max < 64) ++ break; ++ return -EDOM; ++ } ++ ++ switch (type) { ++ case USB_ENDPOINT_XFER_BULK: ++ case USB_ENDPOINT_XFER_INT: ++ if (ep == &dev->ep[2]) { ++ if (desc->bEndpointAddress != (USB_DIR_IN|2)) { ++ PRINTKD("%s: ep[2] has invalid endpoint\n",__FUNCTION__); ++ return -EINVAL; ++ } ++ tx_pktsize = max; ++ Ser0UDCOMP = max - 1; ++ PRINTKD("%s: ep2 max packet size is %d\n",__FUNCTION__,max); ++ break; ++ } else if (ep == &dev->ep[1]) { ++ if (desc->bEndpointAddress != (USB_DIR_OUT|1)) { ++ PRINTKD("%s: ep[1] has invalid endpoint\n",__FUNCTION__); ++ return -EINVAL; ++ } ++ rx_pktsize = max; ++ Ser0UDCIMP = max - 1; ++ PRINTKD("%s: ep1 max packet size is %d\n",__FUNCTION__,max); ++ break; ++ } ++ // FALLTHROUGH ++ default: ++ PRINTKD("%s: Invalid endpoint\n",__FUNCTION__); ++ return -EINVAL; ++ } ++ ++ _ep->maxpacket = max; ++ ep->desc = desc; ++ ep->stopped = 0; ++ ++ DEBUG (dev, "enabled %s %s max %04x\n", _ep->name, ++ type_string (desc->bmAttributes), max); ++ ++ return 0; ++} ++ ++static int sa1100_disable (struct usb_ep *_ep) ++{ ++ struct sa1100_ep *ep; ++ ++ ep = container_of (_ep, struct sa1100_ep, ep); ++ if (!_ep || !ep->desc || _ep->name == ep0name) ++ return -EINVAL; ++ ++ nuke (ep, -ESHUTDOWN); ++ ++ DEBUG (ep->dev, "disabled %s\n", _ep->name); ++ ++ ep->desc = NULL; ++ ep->stopped = 1; ++ return 0; ++} ++ ++/*-------------------------------------------------------------------------*/ ++ ++static struct usb_request * ++sa1100_alloc_request (struct usb_ep *_ep, gfp_t gfp_flags) ++{ ++ struct sa1100_request *req; ++ ++ if (!_ep) ++ return 0; ++ ++ req = kzalloc(sizeof *req, gfp_flags); ++ if (!req) ++ return 0; ++ ++ memset (req, 0, sizeof *req); ++ req->req.dma = DMA_ADDR_INVALID; ++ INIT_LIST_HEAD (&req->queue); ++ return &req->req; ++} ++ ++static void sa1100_free_request(struct usb_ep *_ep, struct usb_request *_req) ++{ ++ struct sa1100_request *req; ++ ++ req = container_of (_req, struct sa1100_request, req); ++ WARN_ON (!list_empty (&req->queue)); ++ kfree(req); //NCB - see pxa2xx_udc ++} ++ ++/*-------------------------------------------------------------------------*/ ++ ++static void done(struct sa1100_ep *ep, struct sa1100_request *req, int status) ++{ ++ unsigned stopped = ep->stopped; ++ ++ list_del_init (&req->queue); ++ ++ if (likely(req->req.status == -EINPROGRESS)) ++ req->req.status = status; ++ else ++ status = req->req.status; ++ ++ if (status && status != -ESHUTDOWN) ++ VDEBUG (ep->dev, "complete %s req %p stat %d len %u/%u\n", ++ ep->ep.name, &req->req, status, ++ req->req.actual, req->req.length); ++ ++ /* don't modify queue heads during completion callback */ ++ ep->stopped = 1; ++ req->req.complete (&ep->ep, &req->req); ++ ep->stopped = stopped; ++} ++ ++/*-------------------------------------------------------------------------*/ ++ ++/* FIXME move away from the old non-queued api. ++ * - forces extra work on us ++ * - stores request state twice ++ * - doesn't let gadget driver handle dma mapping ++ * - status codes need mapping ++ */ ++ ++static int map_status(int status) ++{ ++ switch (status) { ++ case 0: ++ case -EIO: /* ep[12]_int_handler */ ++ return status; ++ case -EPIPE: /* ep1_int_handler */ ++ return 0; ++ // case -EAGAIN: /* ep[12]_init */ ++ // case -EINTR: /* ep[12]_reset */ ++ default: ++ return -ESHUTDOWN; ++ } ++} ++ ++static void tx_callback(int status, int size) ++{ ++ struct sa1100_ep *ep = &the_controller->ep[2]; ++ struct sa1100_request *req; ++ ++ if (list_empty (&ep->queue)) { ++ if (status != -EAGAIN) ++ DEBUG (ep->dev, "%s, bogus tx callback %d/%d\n", ++ ep->ep.name, status, size); ++ return; ++ } ++ req = list_entry (ep->queue.next, struct sa1100_request, queue); ++ req->req.actual = size; ++ done (ep, req, map_status (status)); ++ ++ if (ep->stopped || list_empty (&ep->queue)) ++ return; ++ req = list_entry (ep->queue.next, struct sa1100_request, queue); ++ sa1100_usb_send (&req->req, tx_callback); ++} ++ ++static void rx_callback (int status, int size) ++{ ++ struct sa1100_ep *ep = &the_controller->ep[1]; ++ struct sa1100_request *req; ++ ++ if (list_empty (&ep->queue)) { ++ if (status != -EAGAIN) ++ DEBUG (ep->dev, "%s, bogus tx callback %d/%d\n", ++ ep->ep.name, status, size); ++ return; ++ } ++ req = list_entry (ep->queue.next, struct sa1100_request, queue); ++ req->req.actual = size; ++ done (ep, req, map_status (status)); ++ ++ if (ep->stopped || list_empty (&ep->queue)) ++ return; ++ req = list_entry (ep->queue.next, struct sa1100_request, queue); ++ sa1100_usb_recv (&req->req, rx_callback); ++} ++ ++ ++static int ++sa1100_queue (struct usb_ep *_ep, struct usb_request *_req, gfp_t gfp_flags) ++{ ++ struct sa1100_request *req; ++ struct sa1100_ep *ep; ++ struct sa1100_udc *dev; ++ unsigned long flags; ++ ++ req = container_of (_req, struct sa1100_request, req); ++ if (!_req || !_req->complete || !_req->buf ++ || !list_empty (&req->queue)) ++ return -EINVAL; ++ ++ ep = container_of (_ep, struct sa1100_ep, ep); ++ if (unlikely(!_ep || (!ep->desc && _ep->name != ep0name))) ++ return -EINVAL; ++ ++ dev = ep->dev; ++ if (unlikely(!dev->driver || dev->gadget.speed == USB_SPEED_UNKNOWN)) ++ return -ESHUTDOWN; ++ ++ // handle ep0 ++ if (_ep->name == ep0name) { ++ ep0_queue( _req->buf, _req->length, dev->ep0_req_len >=0 ? dev->ep0_req_len: _req->length ); ++ return 0; ++ } ++ ++ /* sa1100 udc can't write zlps */ ++ if (ep == &dev->ep[2] && _req->length == 0) ++ return -ERANGE; ++ ++ /* the old sa1100 api doesn't use 'unsigned' for lengths */ ++ if (_req->length > INT_MAX) ++ return -ERANGE; ++ ++ VDEBUG (dev, "%s queue req %p, len %d buf %p\n", ++ _ep->name, _req, _req->length, _req->buf); ++ ++ local_irq_save (flags); ++ ++ _req->status = -EINPROGRESS; ++ _req->actual = 0; ++ ++ if (list_empty (&ep->queue) && !ep->stopped) { ++ /* FIXME this does DMA mapping wrong. caller is allowed ++ * to provide buffers that don't need mapping, but this ++ * doesn't use them. ++ */ ++ if (ep == &ep->dev->ep[2]) { ++ PRINTKD("%s: sa1100_usb_send buf %p length %d\n",__FUNCTION__,_req->buf,_req->length); ++ sa1100_usb_send (_req, tx_callback); ++ } ++ else if (ep == &ep->dev->ep[1]) { ++ PRINTKD("%s: sa1100_usb_recv buf %p length %d\n",__FUNCTION__,_req->buf,_req->length); ++ sa1100_usb_recv (_req, rx_callback); ++ } ++ /* ep0 rx/tx is handled separately */ ++ } ++ list_add_tail (&req->queue, &ep->queue); ++ ++ local_irq_restore (flags); ++ ++ return 0; ++} ++ ++/* dequeue ALL requests */ ++static void nuke (struct sa1100_ep *ep, int status) ++{ ++ struct sa1100_request *req; ++ ++ /* called with irqs blocked */ ++ while (!list_empty (&ep->queue)) { ++ req = list_entry (ep->queue.next, ++ struct sa1100_request, ++ queue); ++ done (ep, req, status); ++ } ++ if (ep == &ep->dev->ep[1]) ++ ep1_reset (); ++ else if (ep == &ep->dev->ep[2]) ++ ep2_reset (); ++} ++ ++/* dequeue JUST ONE request */ ++static int sa1100_dequeue (struct usb_ep *_ep, struct usb_request *_req) ++{ ++ struct sa1100_ep *ep; ++ struct sa1100_request *req; ++ unsigned long flags; ++ ++ ep = container_of (_ep, struct sa1100_ep, ep); ++ if (!_ep || (!ep->desc && _ep->name != ep0name) || !_req) ++ return -EINVAL; ++ ++ local_irq_save (flags); ++ ++ /* make sure it's actually queued on this endpoint */ ++ list_for_each_entry (req, &ep->queue, queue) { ++ if (&req->req == _req) ++ break; ++ } ++ if (&req->req != _req) { ++ local_irq_restore(flags); ++ return -EINVAL; ++ } ++ ++ done(ep, req, -ECONNRESET); ++ ++ local_irq_restore(flags); ++ ++ return 0; ++} ++ ++/*-------------------------------------------------------------------------*/ ++ ++static int ++sa1100_set_halt (struct usb_ep *_ep, int value) ++{ ++ struct sa1100_ep *ep; ++ ++ ep = container_of (_ep, struct sa1100_ep, ep); ++ if (unlikely(!_ep ++ || (!ep->desc && _ep->name != ep0name)) ++ || (ep->desc->bmAttributes & 0x03) == USB_ENDPOINT_XFER_ISOC) ++ return -EINVAL; ++ if (!ep->dev->driver || ep->dev->gadget.speed == USB_SPEED_UNKNOWN) ++ return -ESHUTDOWN; ++ ++ VDEBUG (ep->dev, "%s %s halt\n", _ep->name, value ? "set" : "clear"); ++ ++ /* set/clear, then synch memory views with the device */ ++ if (value) { ++ if (ep == &ep->dev->ep[1]) ++ ep1_stall (); ++ else ++ ep2_stall (); ++ } else { ++ if (ep == &ep->dev->ep[1]) ++ ep1_reset (); ++ else ++ ep2_reset (); ++ } ++ ++ return 0; ++} ++ ++static struct usb_ep_ops sa1100_ep_ops = { ++ .enable = sa1100_enable, ++ .disable = sa1100_disable, ++ ++ .alloc_request = sa1100_alloc_request, ++ .free_request = sa1100_free_request, ++ ++ .queue = sa1100_queue, ++ .dequeue = sa1100_dequeue, ++ ++ .set_halt = sa1100_set_halt, ++ // .fifo_status = sa1100_fifo_status, ++ // .fifo_flush = sa1100_fifo_flush, ++}; ++ ++/*-------------------------------------------------------------------------*/ ++ ++static int sa1100_get_frame (struct usb_gadget *_gadget) ++{ ++ return -EOPNOTSUPP; ++} ++ ++static int sa1100_wakeup (struct usb_gadget *_gadget) ++{ ++ struct sa1100_udc *dev; ++ ++ if (!_gadget) ++ return 0; ++ dev = container_of (_gadget, struct sa1100_udc, gadget); ++ ++ // FIXME ++ ++ return 0; ++} ++ ++static const struct usb_gadget_ops sa1100_ops = { ++ .get_frame = sa1100_get_frame, ++ .wakeup = sa1100_wakeup, ++ ++ // .set_selfpowered = sa1100_set_selfpowered, ++}; ++ ++/*-------------------------------------------------------------------------*/ ++ ++static inline void enable_resume_mask_suspend (void) ++{ ++ int i = 0; ++ ++ while (1) { ++ Ser0UDCCR |= UDCCR_SUSIM; // mask future suspend events ++ udelay (i); ++ if ( (Ser0UDCCR & UDCCR_SUSIM) || (Ser0UDCSR & UDCSR_RSTIR)) ++ break; ++ if (++i == 50) { ++ WARN_ (&the_controller, "%s Could not set SUSIM %8.8lX\n", ++ __FUNCTION__, Ser0UDCCR); ++ break; ++ } ++ } ++ ++ i = 0; ++ while (1) { ++ Ser0UDCCR &= ~UDCCR_RESIM; ++ udelay (i); ++ if ( (Ser0UDCCR & UDCCR_RESIM) == 0 ++ || (Ser0UDCSR & UDCSR_RSTIR)) ++ break; ++ if (++i == 50) { ++ WARN_ (&the_controller, "%s Could not clear RESIM %8.8lX\n", ++ __FUNCTION__, Ser0UDCCR); ++ break; ++ } ++ } ++} ++ ++static inline void enable_suspend_mask_resume (void) ++{ ++ int i = 0; ++ while (1) { ++ Ser0UDCCR |= UDCCR_RESIM; // mask future resume events ++ udelay (i); ++ if (Ser0UDCCR & UDCCR_RESIM || (Ser0UDCSR & UDCSR_RSTIR)) ++ break; ++ if (++i == 50) { ++ WARN_ (&the_controller, "%s could not set RESIM %8.8lX\n", ++ __FUNCTION__, Ser0UDCCR); ++ break; ++ } ++ } ++ i = 0; ++ while (1) { ++ Ser0UDCCR &= ~UDCCR_SUSIM; ++ udelay (i); ++ if ( (Ser0UDCCR & UDCCR_SUSIM) == 0 ++ || (Ser0UDCSR & UDCSR_RSTIR)) ++ break; ++ if (++i == 50) { ++ WARN_ (&the_controller, "%s Could not clear SUSIM %8.8lX\n", ++ __FUNCTION__, Ser0UDCCR); ++ break; ++ } ++ } ++} ++ ++// HACK DEBUG 3Mar01ww ++// Well, maybe not, it really seems to help! 08Mar01ww ++static void core_kicker (void) ++{ ++ u32 car = Ser0UDCAR; ++ u32 imp = Ser0UDCIMP; ++ u32 omp = Ser0UDCOMP; ++ ++ UDC_set (Ser0UDCCR, UDCCR_UDD); ++ udelay (300); ++ UDC_clear (Ser0UDCCR, UDCCR_UDD); ++ ++ Ser0UDCAR = car; ++ Ser0UDCIMP = imp; ++ Ser0UDCOMP = omp; ++} ++ ++static irqreturn_t udc_int_hndlr(int irq, void *_dev) ++{ ++ struct sa1100_udc *dev = _dev; ++ u32 status = Ser0UDCSR; ++ ++ PRINTKD("%s: status = 0x%x and control = 0x%lx\n", __FUNCTION__, ++ status, Ser0UDCCR); ++ /* ReSeT Interrupt Request - UDC has been reset */ ++ if (status & UDCSR_RSTIR) { ++ PRINTKD("%s: processing UDCSR_RSTIR\n", __FUNCTION__); ++ if (usbctl_next_state_on_event(kEvReset) != kError) { ++ /* starting 20ms or so reset sequence now... */ ++ INFO (dev, "Resetting\n"); ++ ep0_reset(); // just set state to idle ++ ep1_reset(); // flush dma, clear false stall ++ ep2_reset(); // flush dma, clear false stall ++ } ++ // mask reset ints, they flood during sequence, enable ++ // suspend and resume ++ UDC_set(Ser0UDCCR, UDCCR_REM); // mask reset ++ UDC_clear(Ser0UDCCR, (UDCCR_SUSIM | UDCCR_RESIM)); // enable suspend and resume ++ UDC_flip(Ser0UDCSR, status); // clear all pending sources ++ PRINTKD("%s: setting USB_FULL_SPEED\n",__FUNCTION__); ++ dev->gadget.speed = USB_SPEED_FULL; ++ return IRQ_HANDLED; // NCB ++ } ++ ++ /* else we have done something other than reset, ++ * so be sure reset enabled ++ */ ++ UDC_clear(Ser0UDCCR, UDCCR_REM); ++ ++ /* RESume Interrupt Request */ ++ if (status & UDCSR_RESIR) { ++ struct usb_gadget_driver *driver = dev->driver; ++ ++ PRINTKD("%s: processing UDCSR_RESIR\n",__FUNCTION__); ++ if (driver->resume) ++ driver->resume (&dev->gadget); ++ core_kicker (); ++ enable_suspend_mask_resume (); ++ } ++ ++ /* SUSpend Interrupt Request */ ++ if (status & UDCSR_SUSIR) { ++ struct usb_gadget_driver *driver = dev->driver; ++ ++ PRINTKD("%s: processing UDCSR_SUSIR\n",__FUNCTION__); ++ if (driver->suspend) ++ driver->suspend (&dev->gadget); ++ enable_resume_mask_suspend (); ++ } ++ ++ UDC_flip(Ser0UDCSR, status); // clear all pending sources ++ ++ if (status & UDCSR_EIR) ++ PRINTKD("%s: processing ep0_int_hndlr\n",__FUNCTION__); ++ ep0_int_hndlr(); ++ ++ if (status & UDCSR_RIR) { ++ PRINTKD("%s: processing ep1_int_hndlr\n",__FUNCTION__); ++ ep1_int_hndlr(status); ++ } ++ if (status & UDCSR_TIR) { ++ PRINTKD("%s: processing ep2_int_hndlr\n",__FUNCTION__); ++ ep2_int_hndlr(status); ++ } ++ ++ return IRQ_HANDLED; // NCB ++} ++ ++/* soft_connect_hook () ++ * Some devices have platform-specific circuitry to make USB ++ * not seem to be plugged in, even when it is. This allows ++ * software to control when a device 'appears' on the USB bus ++ * (after Linux has booted and this driver has loaded, for ++ * example). If you have such a circuit, control it here. ++ */ ++#ifdef CONFIG_SA1100_EXTENEX1 ++static void soft_connect_hook(int enable) ++{ ++ if (machine_is_extenex1 ()) { ++ if (enable) { ++ PPDR |= PPC_USB_SOFT_CON; ++ PPSR |= PPC_USB_SOFT_CON; ++ } else { ++ PPSR &= ~PPC_USB_SOFT_CON; ++ PPDR &= ~PPC_USB_SOFT_CON; ++ } ++ } ++} ++#elif defined(CONFIG_SA1100_BALLOON) ++static void soft_connect_hook(int enable) ++{ ++ if (machine_is_balloon()) { ++ if (enable) ++ balloon_cpld_control(BALLOON_UDC_DISCONNECT, 0); ++ else ++ balloon_cpld_control(BALLOON_UDC_DISCONNECT, 1); ++ } ++} ++#elif defined(CONFIG_SA1100_COLLIE) ++static int collie_usb_init(void) ++{ ++ int rc; ++ rc = gpio_request(COLLIE_GPIO_LB_VOL_CHG, "usb enable"); ++ if (rc) ++ return rc; ++ ++ rc = gpio_direction_output(COLLIE_GPIO_LB_VOL_CHG, 1); ++ if (rc) ++ gpio_free(COLLIE_GPIO_LB_VOL_CHG); ++ ++ return rc; ++} ++ ++static void collie_set_usb(int enable) ++{ ++ gpio_set_value(COLLIE_GPIO_LB_VOL_CHG, enable); ++} ++ ++static void collie_usb_exit(void) ++{ ++ gpio_free(COLLIE_GPIO_LB_VOL_CHG); ++} ++ ++static void soft_connect_hook(int enable) ++{ ++ collie_set_usb(enable); ++} ++#else ++#define soft_connect_hook(x) do { } while (0); ++#endif ++ ++/* "function" sysfs attribute */ ++static ssize_t ++show_function(struct device *_dev, struct device_attribute *attr, char *buf) ++{ ++ struct sa1100_udc *dev = dev_get_drvdata (_dev); ++ ++ if (!dev->driver ++ || !dev->driver->function ++ || strlen(dev->driver->function) > PAGE_SIZE) ++ return 0; ++ return scnprintf (buf, PAGE_SIZE, "%s\n", dev->driver->function); ++} ++static DEVICE_ATTR(function, S_IRUGO, show_function, NULL); ++ ++/* disable the UDC at the source */ ++static void udc_disable(struct sa1100_udc *dev) ++{ ++ soft_connect_hook(0); ++ UDC_set(Ser0UDCCR, UDCCR_UDD); ++ dev->gadget.speed = USB_SPEED_UNKNOWN; ++ ep0_idle(dev); ++} ++ ++static void udc_reinit(struct sa1100_udc *dev) ++{ ++ u32 i; ++ ++ /* Initialize the gadget controller data structure */ ++ INIT_LIST_HEAD(&dev->gadget.ep_list); ++ INIT_LIST_HEAD(&dev->gadget.ep0->ep_list); ++ ep0_idle(dev); ++ for ( i = 0 ; i < 3 ; i++) { ++ struct sa1100_ep *ep = &dev->ep[i]; ++ if (i != 0) ++ list_add_tail(&ep->ep.ep_list, &dev->gadget.ep_list); ++ ep->desc = NULL; ++ ep->stopped = 0; ++ INIT_LIST_HEAD(&ep->queue); ++ } ++} ++ ++/* enable the udc at the source */ ++static void udc_enable(struct sa1100_udc *dev) ++{ ++ UDC_clear (Ser0UDCCR, UDCCR_UDD); ++ ep0_idle(dev); ++} ++ ++static void ep0_start(struct sa1100_udc *dev) ++{ ++ udc_enable(dev); ++ udelay(100); ++ ++ /* clear stall - receiver seems to start stalled? 19Jan01ww */ ++ /* also clear other stuff just to be thurough 22Feb01ww */ ++ UDC_clear(Ser0UDCCS1, UDCCS1_FST | UDCCS1_RPE | UDCCS1_RPC ); ++ UDC_clear(Ser0UDCCS2, UDCCS2_FST | UDCCS2_TPE | UDCCS2_TPC ); ++ ++ /* mask everything */ ++ Ser0UDCCR = 0xFC; ++ ++ /* flush DMA and fire through some -EAGAINs */ ++ ep1_init(dev->ep[1].dmaregs); ++ ep2_init(dev->ep[2].dmaregs); ++ ++ /* enable any platform specific hardware */ ++ soft_connect_hook(1); ++ ++ /* clear all top-level sources */ ++ Ser0UDCSR = UDCSR_RSTIR | UDCSR_RESIR | UDCSR_EIR | ++ UDCSR_RIR | UDCSR_TIR | UDCSR_SUSIR ; ++ ++ /* EXERIMENT - a short line in the spec says toggling this ++ * bit diddles the internal state machine in the udc to ++ * expect a suspend ++ */ ++ Ser0UDCCR |= UDCCR_RESIM; ++ /* END EXPERIMENT 10Feb01ww */ ++ ++ /* enable any platform specific hardware */ ++ soft_connect_hook(1); ++ ++ /* Enable interrupts. If you are unplugged you will immediately ++ * get a suspend interrupt. If you are plugged and have a soft ++ * connect-circuit, you will get a reset. If you are plugged ++ * without a soft-connect, I think you also get suspend. In short, ++ * start with suspend masked and everything else enabled ++ */ ++ UDC_write(Ser0UDCCR, UDCCR_SUSIM); ++} ++ ++ ++/* when a driver is successfully registered, it will receive ++ * control requests including set_configuration(), which enables ++ * non-control requests. then usb traffic follows until a ++ * disconnect is reported. then a host may connect again, or ++ * the driver might get unbound. ++ */ ++int usb_gadget_register_driver(struct usb_gadget_driver *driver) ++{ ++ struct sa1100_udc *dev = the_controller; ++ int retval; ++ ++ if (!driver || !driver->bind || !driver->setup) ++ return -EINVAL; ++ if (!dev) ++ return -ENODEV; ++ if (dev->driver) ++ return -EBUSY; ++ ++ /* hook up the driver ... */ ++ dev->driver = driver; ++ dev->gadget.dev.driver = &driver->driver; ++ ++ retval = device_add(&dev->gadget.dev); ++ if (retval != 0) { ++ printk(KERN_ERR "Error in device_add() : %d\n",retval); ++ goto register_error; ++ } ++ ++ retval = driver->bind (&dev->gadget); ++ if (retval != 0) { ++ DEBUG(dev, "bind to driver %s --> %d\n", ++ driver->driver.name, retval); ++ device_del(&dev->gadget.dev); ++ goto register_error; ++ } ++ ++ retval = device_create_file(dev->dev, &dev_attr_function); ++ ++ /* ... then enable host detection and ep0; and we're ready ++ * for set_configuration as well as eventual disconnect. ++ */ ++ ep0_start(dev); ++ ++ DEBUG(dev, "%s ready\n", driver->driver.name); ++ ++ return 0; ++ ++register_error: ++ dev->driver = NULL; ++ dev->gadget.dev.driver = NULL; ++ return retval; ++} ++EXPORT_SYMBOL (usb_gadget_register_driver); ++ ++static void ++stop_activity(struct sa1100_udc *dev, struct usb_gadget_driver *driver) ++{ ++ int i; ++ ++ /* don't disconnect if it's not connected */ ++ if (dev->gadget.speed == USB_SPEED_UNKNOWN) ++ driver = NULL; ++ dev->gadget.speed = USB_SPEED_UNKNOWN; ++ ++ /* mask everything */ ++ Ser0UDCCR = 0xFC; ++ ++ /* stop hardware; prevent new request submissions; ++ * and kill any outstanding requests. ++ */ ++ for (i = 0; i < 3; i++) { ++ struct sa1100_ep *ep = &dev->ep[i]; ++ ep->stopped = 1; ++ nuke(ep, -ESHUTDOWN); ++ } ++ udc_disable (dev); ++ ++ /* report disconnect; the driver is already quiesced */ ++ if (driver) ++ driver->disconnect(&dev->gadget); ++ ++ /* re-init driver-visible data structures */ ++ udc_reinit(dev); ++} ++ ++int usb_gadget_unregister_driver(struct usb_gadget_driver *driver) ++{ ++ struct sa1100_udc *dev = the_controller; ++ ++ if (!dev) ++ return -ENODEV; ++ if (!driver || driver != dev->driver) ++ return -EINVAL; ++ ++ local_irq_disable(); ++ stop_activity (dev, driver); ++ local_irq_enable(); ++ if (driver->unbind) ++ driver->unbind(&dev->gadget); ++ dev->driver = 0; ++ ++ device_del(&dev->gadget.dev); ++ device_remove_file(dev->dev, &dev_attr_function); ++ ++ DEBUG (dev, "unregistered driver '%s'\n", driver->driver.name); ++ return 0; ++} ++EXPORT_SYMBOL (usb_gadget_unregister_driver); ++ ++ ++/*-------------------------------------------------------------------------*/ ++ ++/*-------------------------------------------------------------------------*/ ++ ++////////////////////////////////////////////////////////////////////////////// ++// Proc Filesystem Support ++////////////////////////////////////////////////////////////////////////////// ++ ++#if CONFIG_PROC_FS ++ ++#define SAY(fmt,args...) p += sprintf (p, fmt, ## args) ++#define SAYV(num) p += sprintf (p, num_fmt, "Value", num) ++#define SAYC(label,yn) p += sprintf (p, yn_fmt, label, yn) ++#define SAYS(label,v) p += sprintf (p, cnt_fmt, label, v) ++ ++static int usbctl_read_proc (char *page, char **start, off_t off, ++ int count, int *eof, void *data) ++{ ++ const char * num_fmt = "%25.25s: %8.8lX\n"; ++ const char * cnt_fmt = "%25.25s: %lu\n"; ++ const char * yn_fmt = "%25.25s: %s\n"; ++ const char * yes = "YES"; ++ const char * no = "NO"; ++ unsigned long v; ++ char * p = page; ++ int len; ++ ++ SAY ("SA1100 USB Controller Core\n"); ++ ++ SAYS ("ep0 bytes read", usbd_info.stats.ep0_bytes_read); ++ SAYS ("ep0 bytes written", usbd_info.stats.ep0_bytes_written); ++ SAYS ("ep0 FIFO read failures", usbd_info.stats.ep0_fifo_read_failures); ++ SAYS ("ep0 FIFO write failures", usbd_info.stats.ep0_fifo_write_failures); ++ ++ SAY ("\n"); ++ ++ v = Ser0UDCAR; ++ SAY ("%25.25s: 0x%8.8lX - %ld\n", "Address Register", v, v); ++ v = Ser0UDCIMP; ++ SAY ("%25.25s: %ld (%8.8lX)\n", "IN max packet size", v+1, v); ++ v = Ser0UDCOMP; ++ SAY ("%25.25s: %ld (%8.8lX)\n", "OUT max packet size", v+1, v); ++ ++ v = Ser0UDCCR; ++ SAY ("\nUDC Mask Register\n"); ++ SAYV (v); ++ SAYC ("UDC Active", (v & UDCCR_UDA) ? yes : no); ++ SAYC ("Suspend interrupts masked", (v & UDCCR_SUSIM) ? yes : no); ++ SAYC ("Resume interrupts masked", (v & UDCCR_RESIM) ? yes : no); ++ SAYC ("Reset interrupts masked", (v & UDCCR_REM) ? yes : no); ++ ++ v = Ser0UDCSR; ++ SAY ("\nUDC Interrupt Request Register\n"); ++ SAYV (v); ++ SAYC ("Reset pending", (v & UDCSR_RSTIR) ? yes : no); ++ SAYC ("Suspend pending", (v & UDCSR_SUSIR) ? yes : no); ++ SAYC ("Resume pending", (v & UDCSR_RESIR) ? yes : no); ++ SAYC ("ep0 pending", (v & UDCSR_EIR) ? yes : no); ++ SAYC ("receiver pending", (v & UDCSR_RIR) ? yes : no); ++ SAYC ("tramsitter pending", (v & UDCSR_TIR) ? yes : no); ++ ++#ifdef CONFIG_SA1100_EXTENEX1 ++ SAYC ("\nSoft connect", (PPSR & PPC_USB_SOFT_CON) ? "Visible" : "Hidden"); ++#endif ++ ++#if 1 ++ SAY ("\nDMA Tx registers\n"); ++ { ++ dma_regs_t *r=the_controller->ep[2].dmaregs; ++ SAY (" DDAR"); ++ SAYV(r->DDAR); ++ SAY (" DCSR"); ++ SAYV(r->RdDCSR); ++ SAY (" DBSA (address buf A) "); ++ SAYV(r->DBSA); ++ SAY (" DBTA (transfer count A) "); ++ SAYV(r->DBTA); ++ SAY (" DBSB (address buf B) "); ++ SAYV(r->DBSB); ++ SAY (" DBTB (transfer count B) "); ++ SAYV(r->DBTB); ++ ++ } ++ SAY ("\nDMA Rx registers\n"); ++ { ++ dma_regs_t *r=the_controller->ep[1].dmaregs; ++ SAY (" DDAR"); ++ SAYV(r->DDAR); ++ SAY (" DCSR"); ++ SAYV(r->RdDCSR); ++ SAY (" DBSA (address buf A) "); ++ SAYV(r->DBSA); ++ SAY (" DBTA (transfer count A) "); ++ SAYV(r->DBTA); ++ SAY (" DBSB (address buf B) "); ++ SAYV(r->DBSB); ++ SAY (" DBTB (transfer count B) "); ++ SAYV(r->DBTB); ++ ++ } ++#endif ++#if 1 ++ v = Ser0UDCCS0; ++ SAY ("\nUDC Endpoint Zero Status Register\n"); ++ SAYV (v); ++ SAYC ("Out Packet Ready", (v & UDCCS0_OPR) ? yes : no); ++ SAYC ("In Packet Ready", (v & UDCCS0_IPR) ? yes : no); ++ SAYC ("Sent Stall", (v & UDCCS0_SST) ? yes : no); ++ SAYC ("Force Stall", (v & UDCCS0_FST) ? yes : no); ++ SAYC ("Data End", (v & UDCCS0_DE) ? yes : no); ++ SAYC ("Data Setup End", (v & UDCCS0_SE) ? yes : no); ++ SAYC ("Serviced (SO)", (v & UDCCS0_SO) ? yes : no); ++ ++ v = Ser0UDCCS1; ++ SAY ("\nUDC Receiver Status Register\n"); ++ SAYV (v); ++ SAYC ("Receive Packet Complete", (v & UDCCS1_RPC) ? yes : no); ++ SAYC ("Sent Stall", (v & UDCCS1_SST) ? yes : no); ++ SAYC ("Force Stall", (v & UDCCS1_FST) ? yes : no); ++ SAYC ("Receive Packet Error", (v & UDCCS1_RPE) ? yes : no); ++ SAYC ("Receive FIFO not empty", (v & UDCCS1_RNE) ? yes : no); ++ ++ v = Ser0UDCCS2; ++ SAY ("\nUDC Transmitter Status Register\n"); ++ SAYV (v); ++ SAYC ("FIFO has < 8 of 16 chars", (v & UDCCS2_TFS) ? yes : no); ++ SAYC ("Transmit Packet Complete", (v & UDCCS2_TPC) ? yes : no); ++ SAYC ("Transmit FIFO underrun", (v & UDCCS2_TUR) ? yes : no); ++ SAYC ("Transmit Packet Error", (v & UDCCS2_TPE) ? yes : no); ++ SAYC ("Sent Stall", (v & UDCCS2_SST) ? yes : no); ++ SAYC ("Force Stall", (v & UDCCS2_FST) ? yes : no); ++#endif ++ ++ len = (p - page) - off; ++ if (len < 0) ++ len = 0; ++ *eof = (len <=count) ? 1 : 0; ++ *start = page + off; ++ return len; ++} ++ ++static inline void register_proc_entry (void) ++{ ++ create_proc_read_entry (driver_name, 0, NULL, ++ usbctl_read_proc, NULL); ++} ++ ++static inline void unregister_proc_entry (void) ++{ ++ remove_proc_entry (driver_name, NULL); ++} ++ ++#else ++ ++#define register_proc_entry() do {} while (0) ++#define unregister_proc_entry() do {} while (0) ++ ++#endif /* CONFIG_PROC_FS */ ++ ++/*-------------------------------------------------------------------------*/ ++ ++MODULE_DESCRIPTION ("sa1100_udc"); ++MODULE_AUTHOR ("Various"); ++MODULE_LICENSE ("GPL"); ++ ++static struct sa1100_udc memory = { ++ .gadget = { ++ .ops = &sa1100_ops, ++ .ep0 = &memory.ep[0].ep, ++ .name = driver_name, ++ .dev = { ++ .bus_id = "gadget", ++ }, ++ }, ++ ++ /* control endpoint */ ++ .ep[0] = { ++ .ep = { ++ .name = ep0name, ++ .ops = &sa1100_ep_ops, ++ .maxpacket = EP0_FIFO_SIZE, ++ }, ++ .dev = &memory, ++ }, ++ ++ /* first group of endpoints */ ++ .ep[1] = { ++ .ep = { ++ .name = "ep1out-bulk", ++ .ops = &sa1100_ep_ops, ++ .maxpacket = BULK_FIFO_SIZE, ++ }, ++ .dev = &memory, ++ }, ++ .ep[2] = { ++ .ep = { ++ .name = "ep2in-bulk", ++ .ops = &sa1100_ep_ops, ++ .maxpacket = BULK_FIFO_SIZE, ++ }, ++ .dev = &memory, ++ } ++}; ++ ++static int __init sa1100_udc_probe(struct device *_dev) ++{ ++ struct sa1100_udc *dev = &memory; ++ int retval = 0; ++ ++ /* setup dev */ ++ dev->dev = _dev; ++// dev->mach = _dev->platform_data; ++ ++ device_initialize(&dev->gadget.dev); ++ dev->gadget.dev.parent = _dev; ++ dev->gadget.dev.dma_mask = _dev->dma_mask; ++ ++ the_controller = dev; ++ dev_set_drvdata(_dev, dev); ++ ++ /* controller stays disabled until gadget driver is bound */ ++ udc_disable(dev); ++ udc_reinit(dev); ++ ++// spin_lock_init(&the_udc.lock); ++ register_proc_entry(); ++ ++#if defined(CONFIG_SA1100_COLLIE) ++ collie_usb_init(); ++#endif ++ ++ /* setup dma channels and IRQ */ ++ retval = sa1100_request_dma(DMA_Ser0UDCRd, "USB receive", ++ NULL, NULL, &dev->ep[1].dmaregs); ++ if (retval) { ++ ERROR(dev, "couldn't get rx dma, err %d\n", retval); ++ goto err_rx_dma; ++ } ++ retval = sa1100_request_dma(DMA_Ser0UDCWr, "USB transmit", ++ NULL, NULL, &dev->ep[2].dmaregs); ++ if (retval) { ++ ERROR(dev, "couldn't get tx dma, err %d\n", retval); ++ goto err_tx_dma; ++ } ++ retval = request_irq(IRQ_Ser0UDC, udc_int_hndlr, IRQF_DISABLED, ++ driver_name, dev); ++ if (retval) { ++ ERROR(dev, "couldn't get irq, err %d\n", retval); ++ goto err_irq; ++ } ++ ++ INFO(dev, "initialized, rx %p tx %p irq %d\n", ++ dev->ep[1].dmaregs, dev->ep[2].dmaregs, IRQ_Ser0UDC); ++ return 0; ++ ++err_irq: ++ sa1100_free_dma(dev->ep[2].dmaregs); ++ usbd_info.dmaregs_rx = 0; ++err_tx_dma: ++ sa1100_free_dma(dev->ep[1].dmaregs); ++ usbd_info.dmaregs_tx = 0; ++err_rx_dma: ++ return retval; ++} ++ ++static int __exit sa1100_udc_remove(struct device *_dev) ++{ ++ struct sa1100_udc *dev = dev_get_drvdata(_dev); ++ ++ udc_disable(dev); ++ unregister_proc_entry(); ++ usb_gadget_unregister_driver(dev->driver); ++ sa1100_free_dma(dev->ep[1].dmaregs); ++ sa1100_free_dma(dev->ep[2].dmaregs); ++ free_irq(IRQ_Ser0UDC, dev); ++ dev_set_drvdata(_dev,NULL); ++ the_controller = NULL; ++#if defined(CONFIG_SA1100_COLLIE) ++ collie_usb_exit(); ++#endif ++ return 0; ++} ++ ++static struct device_driver udc_driver = { ++ .name = "sa11x0-udc", ++ .bus = &platform_bus_type, ++ .probe = sa1100_udc_probe, ++ .remove = __exit_p(sa1100_udc_remove), ++// .suspend = sa1100_udc_suspend, ++// .resume = sa1100_udc_resume, ++ .owner = THIS_MODULE, ++}; ++ ++static int __init udc_init(void) ++{ ++ printk(KERN_INFO "%s: version %s\n", driver_name, DRIVER_VERSION); ++#ifdef NCB_DMA_FIX ++ send_buffer = (char*) kzalloc(SEND_BUFFER_SIZE, GFP_KERNEL | GFP_DMA ); ++ receive_buffer = (char*) kzalloc(RECEIVE_BUFFER_SIZE, GFP_KERNEL | GFP_DMA ); ++#endif ++ return driver_register(&udc_driver); ++} ++module_init(udc_init); ++ ++static void __exit udc_exit(void) ++{ ++#ifdef NCB_DMA_FIX ++ if (send_buffer) { ++ kfree(send_buffer); ++ send_buffer = NULL; ++ } ++ if (receive_buffer) { ++ kfree(receive_buffer); ++ receive_buffer = NULL; ++ } ++#endif ++ driver_unregister(&udc_driver); ++} ++module_exit(udc_exit); +diff --git a/drivers/usb/gadget/sa1100_udc.h b/drivers/usb/gadget/sa1100_udc.h +new file mode 100644 +index 0000000..86fa28d +--- /dev/null ++++ b/drivers/usb/gadget/sa1100_udc.h +@@ -0,0 +1,94 @@ ++/* ++ * internals of "new style" UDC controller ++ * <linux/usb_gadget.h> replaces ARM-specific "sa1100_usb.h". ++ */ ++ ++struct sa1100_ep { ++ struct usb_ep ep; ++ struct sa1100_udc *dev; ++ //unsigned long irqs; ++ ++ const struct usb_endpoint_descriptor *desc; ++ struct list_head queue; ++ dma_regs_t *dmaregs; ++ unsigned stopped : 1; ++}; ++ ++struct sa1100_request { ++ struct usb_request req; ++ struct list_head queue; ++// NCB unsigned mapped : 1; ++}; ++ ++enum ep0_state { ++ EP0_IDLE, ++ EP0_IN_DATA_PHASE, ++ EP0_OUT_DATA_PHASE, ++ EP0_END_XFER, ++ EP0_STALL, ++}; ++ ++#define EP0_FIFO_SIZE ((unsigned)8) ++#define BULK_FIFO_SIZE ((unsigned)64) ++//#define ISO_FIFO_SIZE ((unsigned)256) ++//#define INT_FIFO_SIZE ((unsigned)8) ++ ++struct udc_stats { ++ struct ep0stats { ++ unsigned long ops; ++ unsigned long bytes; ++ } read, write; ++ unsigned long irqs; ++}; ++ ++struct sa1100_udc { ++ struct usb_gadget gadget; ++ struct usb_gadget_driver *driver; ++ struct device *dev; ++ enum ep0_state ep0state; ++ struct udc_stats stats; ++// NCB spinlock_t lock; ++// NCB dma_regs_t *dmaregs_tx, *dmaregs_rx; ++ unsigned got_irq : 1, ++ vbus : 1, ++ pullup : 1, ++ has_cfr : 1, ++ req_pending : 1, ++ req_std : 1, ++ req_config : 1; ++ struct timer_list timer; ++ u64 dma_mask; ++ unsigned char address; ++ struct sa1100_ep ep[3]; ++ int ep0_req_len; ++}; ++ ++/*-------------------------------------------------------------------------*/ ++ ++#define xprintk(dev,level,fmt,args...) \ ++ printk(level "%s: " fmt , driver_name , ## args) ++ ++#ifdef DEBUG ++#undef DEBUG ++#define DEBUG(dev,fmt,args...) \ ++ xprintk(dev , KERN_DEBUG , fmt , ## args) ++#else ++#define DEBUG(dev,fmt,args...) \ ++ do { } while (0) ++#endif /* DEBUG */ ++ ++#ifdef VERBOSE ++#define VDEBUG DEBUG ++#else ++#define VDEBUG(dev,fmt,args...) \ ++ do { } while (0) ++#endif /* VERBOSE */ ++ ++#define ERROR(dev,fmt,args...) \ ++ xprintk(dev , KERN_ERR , fmt , ## args) ++#define WARN_(dev,fmt,args...) \ ++ xprintk(dev , KERN_WARNING , fmt , ## args) ++#define INFO(dev,fmt,args...) \ ++ xprintk(dev , KERN_INFO , fmt , ## args)
++ ++/*-------------------------------------------------------------------------*/ +-- +1.5.6.5 + diff --git a/packages/linux/linux-2.6.28/collie/0010-mmc_spi-add-suspend-and-resume-callbacks.patch b/packages/linux/linux-2.6.28/collie/0010-mmc_spi-add-suspend-and-resume-callbacks.patch new file mode 100644 index 0000000000..fbf1b4573b --- /dev/null +++ b/packages/linux/linux-2.6.28/collie/0010-mmc_spi-add-suspend-and-resume-callbacks.patch @@ -0,0 +1,59 @@ +From 53fc40876ed9b753f935361fb1027718a184c41e Mon Sep 17 00:00:00 2001 +From: Thomas Kunze <thommycheck@gmx.de> +Date: Thu, 5 Feb 2009 00:49:03 +0100 +Subject: [PATCH 10/23] mmc_spi: add suspend and resume callbacks + +--- + drivers/mmc/host/mmc_spi.c | 29 +++++++++++++++++++++++++++++ + 1 files changed, 29 insertions(+), 0 deletions(-) + +diff --git a/drivers/mmc/host/mmc_spi.c b/drivers/mmc/host/mmc_spi.c +index ad00e16..ac6719b 100644 +--- a/drivers/mmc/host/mmc_spi.c ++++ b/drivers/mmc/host/mmc_spi.c +@@ -1407,6 +1407,33 @@ static int __devexit mmc_spi_remove(struct spi_device *spi) + return 0; + } + ++#ifdef CONFIG_PM ++static int mmc_spi_suspend(struct spi_device *spi, pm_message_t state) ++{ ++ struct mmc_host *mmc = dev_get_drvdata(&spi->dev); ++ struct mmc_spi_host *host = mmc_priv(mmc); ++ int ret = 0; ++ ++ if (mmc) ++ ret = mmc_suspend_host(mmc, state); ++ return ret; ++} ++ ++static int mmc_spi_resume(struct spi_device *spi) ++{ ++ struct mmc_host *mmc = dev_get_drvdata(&spi->dev); ++ int ret = 0; ++ ++ if (mmc) ++ ret = mmc_resume_host(mmc); ++ ++ return ret; ++} ++#else ++#define mmc_spi_suspend NULL ++#define mmc_spi_resume NULL ++#endif ++ + + static struct spi_driver mmc_spi_driver = { + .driver = { +@@ -1416,6 +1443,8 @@ static struct spi_driver mmc_spi_driver = { + }, + .probe = mmc_spi_probe, + .remove = __devexit_p(mmc_spi_remove), ++ .suspend = mmc_spi_suspend, ++ .resume = mmc_spi_resume, + }; + + +-- +1.5.6.5 + diff --git a/packages/linux/linux-2.6.28/collie/0011-move-drivers-mfd-.h-to-include-linux-mfd.patch b/packages/linux/linux-2.6.28/collie/0011-move-drivers-mfd-.h-to-include-linux-mfd.patch new file mode 100644 index 0000000000..0bc3dbb713 --- /dev/null +++ b/packages/linux/linux-2.6.28/collie/0011-move-drivers-mfd-.h-to-include-linux-mfd.patch @@ -0,0 +1,803 @@ +From c69779dac8693a3b057b3708d19f7013c6973bf2 Mon Sep 17 00:00:00 2001 +From: Thomas Kunze <thommycheck@gmx.de> +Date: Tue, 10 Feb 2009 14:54:57 +0100 +Subject: [PATCH 11/23] move drivers/mfd/*.h to include/linux/mfd + +So drivers like collie_battery driver can use +those files easier. +--- + arch/arm/mach-sa1100/collie_pm.c | 2 +- + drivers/mfd/mcp-core.c | 2 +- + drivers/mfd/mcp-sa11x0.c | 2 +- + drivers/mfd/mcp.h | 66 ---------- + drivers/mfd/ucb1x00-assabet.c | 2 +- + drivers/mfd/ucb1x00-core.c | 2 +- + drivers/mfd/ucb1x00-ts.c | 2 +- + drivers/mfd/ucb1x00.h | 255 -------------------------------------- + include/linux/mfd/mcp.h | 68 ++++++++++ + include/linux/mfd/ucb1x00.h | 255 ++++++++++++++++++++++++++++++++++++++ + 10 files changed, 329 insertions(+), 327 deletions(-) + delete mode 100644 drivers/mfd/mcp.h + delete mode 100644 drivers/mfd/ucb1x00.h + create mode 100644 include/linux/mfd/mcp.h + create mode 100644 include/linux/mfd/ucb1x00.h + +diff --git a/arch/arm/mach-sa1100/collie_pm.c b/arch/arm/mach-sa1100/collie_pm.c +index b1161fc..65b8b31 100644 +--- a/arch/arm/mach-sa1100/collie_pm.c ++++ b/arch/arm/mach-sa1100/collie_pm.c +@@ -22,6 +22,7 @@ + #include <linux/interrupt.h> + #include <linux/device.h> + #include <linux/platform_device.h> ++#include <linux/mfd/ucb1x00.h> + + #include <asm/irq.h> + #include <mach/hardware.h> +@@ -31,7 +32,6 @@ + #include <asm/mach/sharpsl_param.h> + #include <asm/hardware/sharpsl_pm.h> + +-#include "../drivers/mfd/ucb1x00.h" + + static struct ucb1x00 *ucb; + static int ad_revise; +diff --git a/drivers/mfd/mcp-core.c b/drivers/mfd/mcp-core.c +index b4ed57e..64c806a 100644 +--- a/drivers/mfd/mcp-core.c ++++ b/drivers/mfd/mcp-core.c +@@ -17,11 +17,11 @@ + #include <linux/device.h> + #include <linux/slab.h> + #include <linux/string.h> ++#include <linux/mfd/mcp.h> + + #include <asm/dma.h> + #include <asm/system.h> + +-#include "mcp.h" + + #define to_mcp(d) container_of(d, struct mcp, attached_device) + #define to_mcp_driver(d) container_of(d, struct mcp_driver, drv) +diff --git a/drivers/mfd/mcp-sa11x0.c b/drivers/mfd/mcp-sa11x0.c +index 28380b2..88c81cf 100644 +--- a/drivers/mfd/mcp-sa11x0.c ++++ b/drivers/mfd/mcp-sa11x0.c +@@ -19,6 +19,7 @@ + #include <linux/spinlock.h> + #include <linux/slab.h> + #include <linux/platform_device.h> ++#include <linux/mfd/mcp.h> + + #include <asm/dma.h> + #include <mach/hardware.h> +@@ -28,7 +29,6 @@ + + #include <mach/assabet.h> + +-#include "mcp.h" + + struct mcp_sa11x0 { + u32 mccr0; +diff --git a/drivers/mfd/mcp.h b/drivers/mfd/mcp.h +deleted file mode 100644 +index c093a93..0000000 +--- a/drivers/mfd/mcp.h ++++ /dev/null +@@ -1,66 +0,0 @@ +-/* +- * linux/drivers/mfd/mcp.h +- * +- * Copyright (C) 2001 Russell King, 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 as published by +- * the Free Software Foundation; either version 2 of the License. +- */ +-#ifndef MCP_H +-#define MCP_H +- +-struct mcp_ops; +- +-struct mcp { +- struct module *owner; +- struct mcp_ops *ops; +- spinlock_t lock; +- int use_count; +- unsigned int sclk_rate; +- unsigned int rw_timeout; +- dma_device_t dma_audio_rd; +- dma_device_t dma_audio_wr; +- dma_device_t dma_telco_rd; +- dma_device_t dma_telco_wr; +- struct device attached_device; +-}; +- +-struct mcp_ops { +- void (*set_telecom_divisor)(struct mcp *, unsigned int); +- void (*set_audio_divisor)(struct mcp *, unsigned int); +- void (*reg_write)(struct mcp *, unsigned int, unsigned int); +- unsigned int (*reg_read)(struct mcp *, unsigned int); +- void (*enable)(struct mcp *); +- void (*disable)(struct mcp *); +-}; +- +-void mcp_set_telecom_divisor(struct mcp *, unsigned int); +-void mcp_set_audio_divisor(struct mcp *, unsigned int); +-void mcp_reg_write(struct mcp *, unsigned int, unsigned int); +-unsigned int mcp_reg_read(struct mcp *, unsigned int); +-void mcp_enable(struct mcp *); +-void mcp_disable(struct mcp *); +-#define mcp_get_sclk_rate(mcp) ((mcp)->sclk_rate) +- +-struct mcp *mcp_host_alloc(struct device *, size_t); +-int mcp_host_register(struct mcp *); +-void mcp_host_unregister(struct mcp *); +- +-struct mcp_driver { +- struct device_driver drv; +- int (*probe)(struct mcp *); +- void (*remove)(struct mcp *); +- int (*suspend)(struct mcp *, pm_message_t); +- int (*resume)(struct mcp *); +-}; +- +-int mcp_driver_register(struct mcp_driver *); +-void mcp_driver_unregister(struct mcp_driver *); +- +-#define mcp_get_drvdata(mcp) dev_get_drvdata(&(mcp)->attached_device) +-#define mcp_set_drvdata(mcp,d) dev_set_drvdata(&(mcp)->attached_device, d) +- +-#define mcp_priv(mcp) ((void *)((mcp)+1)) +- +-#endif +diff --git a/drivers/mfd/ucb1x00-assabet.c b/drivers/mfd/ucb1x00-assabet.c +index 61aeaf7..0f6f46d 100644 +--- a/drivers/mfd/ucb1x00-assabet.c ++++ b/drivers/mfd/ucb1x00-assabet.c +@@ -14,10 +14,10 @@ + #include <linux/fs.h> + #include <linux/proc_fs.h> + #include <linux/device.h> ++#include <linux/mfd/ucb1x00.h> + + #include <asm/dma.h> + +-#include "ucb1x00.h" + + #define UCB1X00_ATTR(name,input)\ + static ssize_t name##_show(struct device *dev, struct device_attribute *attr, \ +diff --git a/drivers/mfd/ucb1x00-core.c b/drivers/mfd/ucb1x00-core.c +index a316f1b..bc2c1ba 100644 +--- a/drivers/mfd/ucb1x00-core.c ++++ b/drivers/mfd/ucb1x00-core.c +@@ -24,11 +24,11 @@ + #include <linux/interrupt.h> + #include <linux/device.h> + #include <linux/mutex.h> ++#include <linux/mfd/ucb1x00.h> + + #include <asm/dma.h> + #include <mach/hardware.h> + +-#include "ucb1x00.h" + + static DEFINE_MUTEX(ucb1x00_mutex); + static LIST_HEAD(ucb1x00_drivers); +diff --git a/drivers/mfd/ucb1x00-ts.c b/drivers/mfd/ucb1x00-ts.c +index 44762ca..b5feae9 100644 +--- a/drivers/mfd/ucb1x00-ts.c ++++ b/drivers/mfd/ucb1x00-ts.c +@@ -30,12 +30,12 @@ + #include <linux/freezer.h> + #include <linux/slab.h> + #include <linux/kthread.h> ++#include <linux/mfd/ucb1x00.h> + + #include <asm/dma.h> + #include <mach/collie.h> + #include <asm/mach-types.h> + +-#include "ucb1x00.h" + + + struct ucb1x00_ts { +diff --git a/drivers/mfd/ucb1x00.h b/drivers/mfd/ucb1x00.h +deleted file mode 100644 +index a8ad8a0..0000000 +--- a/drivers/mfd/ucb1x00.h ++++ /dev/null +@@ -1,255 +0,0 @@ +-/* +- * linux/drivers/mfd/ucb1x00.h +- * +- * Copyright (C) 2001 Russell King, 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 as published by +- * the Free Software Foundation; either version 2 of the License. +- */ +-#ifndef UCB1200_H +-#define UCB1200_H +- +-#define UCB_IO_DATA 0x00 +-#define UCB_IO_DIR 0x01 +- +-#define UCB_IO_0 (1 << 0) +-#define UCB_IO_1 (1 << 1) +-#define UCB_IO_2 (1 << 2) +-#define UCB_IO_3 (1 << 3) +-#define UCB_IO_4 (1 << 4) +-#define UCB_IO_5 (1 << 5) +-#define UCB_IO_6 (1 << 6) +-#define UCB_IO_7 (1 << 7) +-#define UCB_IO_8 (1 << 8) +-#define UCB_IO_9 (1 << 9) +- +-#define UCB_IE_RIS 0x02 +-#define UCB_IE_FAL 0x03 +-#define UCB_IE_STATUS 0x04 +-#define UCB_IE_CLEAR 0x04 +-#define UCB_IE_ADC (1 << 11) +-#define UCB_IE_TSPX (1 << 12) +-#define UCB_IE_TSMX (1 << 13) +-#define UCB_IE_TCLIP (1 << 14) +-#define UCB_IE_ACLIP (1 << 15) +- +-#define UCB_IRQ_TSPX 12 +- +-#define UCB_TC_A 0x05 +-#define UCB_TC_A_LOOP (1 << 7) /* UCB1200 */ +-#define UCB_TC_A_AMPL (1 << 7) /* UCB1300 */ +- +-#define UCB_TC_B 0x06 +-#define UCB_TC_B_VOICE_ENA (1 << 3) +-#define UCB_TC_B_CLIP (1 << 4) +-#define UCB_TC_B_ATT (1 << 6) +-#define UCB_TC_B_SIDE_ENA (1 << 11) +-#define UCB_TC_B_MUTE (1 << 13) +-#define UCB_TC_B_IN_ENA (1 << 14) +-#define UCB_TC_B_OUT_ENA (1 << 15) +- +-#define UCB_AC_A 0x07 +-#define UCB_AC_B 0x08 +-#define UCB_AC_B_LOOP (1 << 8) +-#define UCB_AC_B_MUTE (1 << 13) +-#define UCB_AC_B_IN_ENA (1 << 14) +-#define UCB_AC_B_OUT_ENA (1 << 15) +- +-#define UCB_TS_CR 0x09 +-#define UCB_TS_CR_TSMX_POW (1 << 0) +-#define UCB_TS_CR_TSPX_POW (1 << 1) +-#define UCB_TS_CR_TSMY_POW (1 << 2) +-#define UCB_TS_CR_TSPY_POW (1 << 3) +-#define UCB_TS_CR_TSMX_GND (1 << 4) +-#define UCB_TS_CR_TSPX_GND (1 << 5) +-#define UCB_TS_CR_TSMY_GND (1 << 6) +-#define UCB_TS_CR_TSPY_GND (1 << 7) +-#define UCB_TS_CR_MODE_INT (0 << 8) +-#define UCB_TS_CR_MODE_PRES (1 << 8) +-#define UCB_TS_CR_MODE_POS (2 << 8) +-#define UCB_TS_CR_BIAS_ENA (1 << 11) +-#define UCB_TS_CR_TSPX_LOW (1 << 12) +-#define UCB_TS_CR_TSMX_LOW (1 << 13) +- +-#define UCB_ADC_CR 0x0a +-#define UCB_ADC_SYNC_ENA (1 << 0) +-#define UCB_ADC_VREFBYP_CON (1 << 1) +-#define UCB_ADC_INP_TSPX (0 << 2) +-#define UCB_ADC_INP_TSMX (1 << 2) +-#define UCB_ADC_INP_TSPY (2 << 2) +-#define UCB_ADC_INP_TSMY (3 << 2) +-#define UCB_ADC_INP_AD0 (4 << 2) +-#define UCB_ADC_INP_AD1 (5 << 2) +-#define UCB_ADC_INP_AD2 (6 << 2) +-#define UCB_ADC_INP_AD3 (7 << 2) +-#define UCB_ADC_EXT_REF (1 << 5) +-#define UCB_ADC_START (1 << 7) +-#define UCB_ADC_ENA (1 << 15) +- +-#define UCB_ADC_DATA 0x0b +-#define UCB_ADC_DAT_VAL (1 << 15) +-#define UCB_ADC_DAT(x) (((x) & 0x7fe0) >> 5) +- +-#define UCB_ID 0x0c +-#define UCB_ID_1200 0x1004 +-#define UCB_ID_1300 0x1005 +-#define UCB_ID_TC35143 0x9712 +- +-#define UCB_MODE 0x0d +-#define UCB_MODE_DYN_VFLAG_ENA (1 << 12) +-#define UCB_MODE_AUD_OFF_CAN (1 << 13) +- +-#include "mcp.h" +- +-struct ucb1x00_irq { +- void *devid; +- void (*fn)(int, void *); +-}; +- +-struct ucb1x00 { +- spinlock_t lock; +- struct mcp *mcp; +- unsigned int irq; +- struct semaphore adc_sem; +- spinlock_t io_lock; +- u16 id; +- u16 io_dir; +- u16 io_out; +- u16 adc_cr; +- u16 irq_fal_enbl; +- u16 irq_ris_enbl; +- struct ucb1x00_irq irq_handler[16]; +- struct device dev; +- struct list_head node; +- struct list_head devs; +-}; +- +-struct ucb1x00_driver; +- +-struct ucb1x00_dev { +- struct list_head dev_node; +- struct list_head drv_node; +- struct ucb1x00 *ucb; +- struct ucb1x00_driver *drv; +- void *priv; +-}; +- +-struct ucb1x00_driver { +- struct list_head node; +- struct list_head devs; +- int (*add)(struct ucb1x00_dev *dev); +- void (*remove)(struct ucb1x00_dev *dev); +- int (*suspend)(struct ucb1x00_dev *dev, pm_message_t state); +- int (*resume)(struct ucb1x00_dev *dev); +-}; +- +-#define classdev_to_ucb1x00(cd) container_of(cd, struct ucb1x00, dev) +- +-int ucb1x00_register_driver(struct ucb1x00_driver *); +-void ucb1x00_unregister_driver(struct ucb1x00_driver *); +- +-/** +- * ucb1x00_clkrate - return the UCB1x00 SIB clock rate +- * @ucb: UCB1x00 structure describing chip +- * +- * Return the SIB clock rate in Hz. +- */ +-static inline unsigned int ucb1x00_clkrate(struct ucb1x00 *ucb) +-{ +- return mcp_get_sclk_rate(ucb->mcp); +-} +- +-/** +- * ucb1x00_enable - enable the UCB1x00 SIB clock +- * @ucb: UCB1x00 structure describing chip +- * +- * Enable the SIB clock. This can be called multiple times. +- */ +-static inline void ucb1x00_enable(struct ucb1x00 *ucb) +-{ +- mcp_enable(ucb->mcp); +-} +- +-/** +- * ucb1x00_disable - disable the UCB1x00 SIB clock +- * @ucb: UCB1x00 structure describing chip +- * +- * Disable the SIB clock. The SIB clock will only be disabled +- * when the number of ucb1x00_enable calls match the number of +- * ucb1x00_disable calls. +- */ +-static inline void ucb1x00_disable(struct ucb1x00 *ucb) +-{ +- mcp_disable(ucb->mcp); +-} +- +-/** +- * ucb1x00_reg_write - write a UCB1x00 register +- * @ucb: UCB1x00 structure describing chip +- * @reg: UCB1x00 4-bit register index to write +- * @val: UCB1x00 16-bit value to write +- * +- * Write the UCB1x00 register @reg with value @val. The SIB +- * clock must be running for this function to return. +- */ +-static inline void ucb1x00_reg_write(struct ucb1x00 *ucb, unsigned int reg, unsigned int val) +-{ +- mcp_reg_write(ucb->mcp, reg, val); +-} +- +-/** +- * ucb1x00_reg_read - read a UCB1x00 register +- * @ucb: UCB1x00 structure describing chip +- * @reg: UCB1x00 4-bit register index to write +- * +- * Read the UCB1x00 register @reg and return its value. The SIB +- * clock must be running for this function to return. +- */ +-static inline unsigned int ucb1x00_reg_read(struct ucb1x00 *ucb, unsigned int reg) +-{ +- return mcp_reg_read(ucb->mcp, reg); +-} +-/** +- * ucb1x00_set_audio_divisor - +- * @ucb: UCB1x00 structure describing chip +- * @div: SIB clock divisor +- */ +-static inline void ucb1x00_set_audio_divisor(struct ucb1x00 *ucb, unsigned int div) +-{ +- mcp_set_audio_divisor(ucb->mcp, div); +-} +- +-/** +- * ucb1x00_set_telecom_divisor - +- * @ucb: UCB1x00 structure describing chip +- * @div: SIB clock divisor +- */ +-static inline void ucb1x00_set_telecom_divisor(struct ucb1x00 *ucb, unsigned int div) +-{ +- mcp_set_telecom_divisor(ucb->mcp, div); +-} +- +-void ucb1x00_io_set_dir(struct ucb1x00 *ucb, unsigned int, unsigned int); +-void ucb1x00_io_write(struct ucb1x00 *ucb, unsigned int, unsigned int); +-unsigned int ucb1x00_io_read(struct ucb1x00 *ucb); +- +-#define UCB_NOSYNC (0) +-#define UCB_SYNC (1) +- +-unsigned int ucb1x00_adc_read(struct ucb1x00 *ucb, int adc_channel, int sync); +-void ucb1x00_adc_enable(struct ucb1x00 *ucb); +-void ucb1x00_adc_disable(struct ucb1x00 *ucb); +- +-/* +- * Which edges of the IRQ do you want to control today? +- */ +-#define UCB_RISING (1 << 0) +-#define UCB_FALLING (1 << 1) +- +-int ucb1x00_hook_irq(struct ucb1x00 *ucb, unsigned int idx, void (*fn)(int, void *), void *devid); +-void ucb1x00_enable_irq(struct ucb1x00 *ucb, unsigned int idx, int edges); +-void ucb1x00_disable_irq(struct ucb1x00 *ucb, unsigned int idx, int edges); +-int ucb1x00_free_irq(struct ucb1x00 *ucb, unsigned int idx, void *devid); +- +-#endif +diff --git a/include/linux/mfd/mcp.h b/include/linux/mfd/mcp.h +new file mode 100644 +index 0000000..be95e09 +--- /dev/null ++++ b/include/linux/mfd/mcp.h +@@ -0,0 +1,68 @@ ++/* ++ * linux/drivers/mfd/mcp.h ++ * ++ * Copyright (C) 2001 Russell King, 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 as published by ++ * the Free Software Foundation; either version 2 of the License. ++ */ ++#ifndef MCP_H ++#define MCP_H ++ ++#include <mach/dma.h> ++ ++struct mcp_ops; ++ ++struct mcp { ++ struct module *owner; ++ struct mcp_ops *ops; ++ spinlock_t lock; ++ int use_count; ++ unsigned int sclk_rate; ++ unsigned int rw_timeout; ++ dma_device_t dma_audio_rd; ++ dma_device_t dma_audio_wr; ++ dma_device_t dma_telco_rd; ++ dma_device_t dma_telco_wr; ++ struct device attached_device; ++}; ++ ++struct mcp_ops { ++ void (*set_telecom_divisor)(struct mcp *, unsigned int); ++ void (*set_audio_divisor)(struct mcp *, unsigned int); ++ void (*reg_write)(struct mcp *, unsigned int, unsigned int); ++ unsigned int (*reg_read)(struct mcp *, unsigned int); ++ void (*enable)(struct mcp *); ++ void (*disable)(struct mcp *); ++}; ++ ++void mcp_set_telecom_divisor(struct mcp *, unsigned int); ++void mcp_set_audio_divisor(struct mcp *, unsigned int); ++void mcp_reg_write(struct mcp *, unsigned int, unsigned int); ++unsigned int mcp_reg_read(struct mcp *, unsigned int); ++void mcp_enable(struct mcp *); ++void mcp_disable(struct mcp *); ++#define mcp_get_sclk_rate(mcp) ((mcp)->sclk_rate) ++ ++struct mcp *mcp_host_alloc(struct device *, size_t); ++int mcp_host_register(struct mcp *); ++void mcp_host_unregister(struct mcp *); ++ ++struct mcp_driver { ++ struct device_driver drv; ++ int (*probe)(struct mcp *); ++ void (*remove)(struct mcp *); ++ int (*suspend)(struct mcp *, pm_message_t); ++ int (*resume)(struct mcp *); ++}; ++ ++int mcp_driver_register(struct mcp_driver *); ++void mcp_driver_unregister(struct mcp_driver *); ++ ++#define mcp_get_drvdata(mcp) dev_get_drvdata(&(mcp)->attached_device) ++#define mcp_set_drvdata(mcp,d) dev_set_drvdata(&(mcp)->attached_device, d) ++ ++#define mcp_priv(mcp) ((void *)((mcp)+1)) ++ ++#endif +diff --git a/include/linux/mfd/ucb1x00.h b/include/linux/mfd/ucb1x00.h +new file mode 100644 +index 0000000..eac3463 +--- /dev/null ++++ b/include/linux/mfd/ucb1x00.h +@@ -0,0 +1,255 @@ ++/* ++ * linux/include/mfd/ucb1x00.h ++ * ++ * Copyright (C) 2001 Russell King, 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 as published by ++ * the Free Software Foundation; either version 2 of the License. ++ */ ++#ifndef UCB1200_H ++#define UCB1200_H ++ ++#include <linux/mfd/mcp.h> ++#define UCB_IO_DATA 0x00 ++#define UCB_IO_DIR 0x01 ++ ++#define UCB_IO_0 (1 << 0) ++#define UCB_IO_1 (1 << 1) ++#define UCB_IO_2 (1 << 2) ++#define UCB_IO_3 (1 << 3) ++#define UCB_IO_4 (1 << 4) ++#define UCB_IO_5 (1 << 5) ++#define UCB_IO_6 (1 << 6) ++#define UCB_IO_7 (1 << 7) ++#define UCB_IO_8 (1 << 8) ++#define UCB_IO_9 (1 << 9) ++ ++#define UCB_IE_RIS 0x02 ++#define UCB_IE_FAL 0x03 ++#define UCB_IE_STATUS 0x04 ++#define UCB_IE_CLEAR 0x04 ++#define UCB_IE_ADC (1 << 11) ++#define UCB_IE_TSPX (1 << 12) ++#define UCB_IE_TSMX (1 << 13) ++#define UCB_IE_TCLIP (1 << 14) ++#define UCB_IE_ACLIP (1 << 15) ++ ++#define UCB_IRQ_TSPX 12 ++ ++#define UCB_TC_A 0x05 ++#define UCB_TC_A_LOOP (1 << 7) /* UCB1200 */ ++#define UCB_TC_A_AMPL (1 << 7) /* UCB1300 */ ++ ++#define UCB_TC_B 0x06 ++#define UCB_TC_B_VOICE_ENA (1 << 3) ++#define UCB_TC_B_CLIP (1 << 4) ++#define UCB_TC_B_ATT (1 << 6) ++#define UCB_TC_B_SIDE_ENA (1 << 11) ++#define UCB_TC_B_MUTE (1 << 13) ++#define UCB_TC_B_IN_ENA (1 << 14) ++#define UCB_TC_B_OUT_ENA (1 << 15) ++ ++#define UCB_AC_A 0x07 ++#define UCB_AC_B 0x08 ++#define UCB_AC_B_LOOP (1 << 8) ++#define UCB_AC_B_MUTE (1 << 13) ++#define UCB_AC_B_IN_ENA (1 << 14) ++#define UCB_AC_B_OUT_ENA (1 << 15) ++ ++#define UCB_TS_CR 0x09 ++#define UCB_TS_CR_TSMX_POW (1 << 0) ++#define UCB_TS_CR_TSPX_POW (1 << 1) ++#define UCB_TS_CR_TSMY_POW (1 << 2) ++#define UCB_TS_CR_TSPY_POW (1 << 3) ++#define UCB_TS_CR_TSMX_GND (1 << 4) ++#define UCB_TS_CR_TSPX_GND (1 << 5) ++#define UCB_TS_CR_TSMY_GND (1 << 6) ++#define UCB_TS_CR_TSPY_GND (1 << 7) ++#define UCB_TS_CR_MODE_INT (0 << 8) ++#define UCB_TS_CR_MODE_PRES (1 << 8) ++#define UCB_TS_CR_MODE_POS (2 << 8) ++#define UCB_TS_CR_BIAS_ENA (1 << 11) ++#define UCB_TS_CR_TSPX_LOW (1 << 12) ++#define UCB_TS_CR_TSMX_LOW (1 << 13) ++ ++#define UCB_ADC_CR 0x0a ++#define UCB_ADC_SYNC_ENA (1 << 0) ++#define UCB_ADC_VREFBYP_CON (1 << 1) ++#define UCB_ADC_INP_TSPX (0 << 2) ++#define UCB_ADC_INP_TSMX (1 << 2) ++#define UCB_ADC_INP_TSPY (2 << 2) ++#define UCB_ADC_INP_TSMY (3 << 2) ++#define UCB_ADC_INP_AD0 (4 << 2) ++#define UCB_ADC_INP_AD1 (5 << 2) ++#define UCB_ADC_INP_AD2 (6 << 2) ++#define UCB_ADC_INP_AD3 (7 << 2) ++#define UCB_ADC_EXT_REF (1 << 5) ++#define UCB_ADC_START (1 << 7) ++#define UCB_ADC_ENA (1 << 15) ++ ++#define UCB_ADC_DATA 0x0b ++#define UCB_ADC_DAT_VAL (1 << 15) ++#define UCB_ADC_DAT(x) (((x) & 0x7fe0) >> 5) ++ ++#define UCB_ID 0x0c ++#define UCB_ID_1200 0x1004 ++#define UCB_ID_1300 0x1005 ++#define UCB_ID_TC35143 0x9712 ++ ++#define UCB_MODE 0x0d ++#define UCB_MODE_DYN_VFLAG_ENA (1 << 12) ++#define UCB_MODE_AUD_OFF_CAN (1 << 13) ++ ++ ++struct ucb1x00_irq { ++ void *devid; ++ void (*fn)(int, void *); ++}; ++ ++struct ucb1x00 { ++ spinlock_t lock; ++ struct mcp *mcp; ++ unsigned int irq; ++ struct semaphore adc_sem; ++ spinlock_t io_lock; ++ u16 id; ++ u16 io_dir; ++ u16 io_out; ++ u16 adc_cr; ++ u16 irq_fal_enbl; ++ u16 irq_ris_enbl; ++ struct ucb1x00_irq irq_handler[16]; ++ struct device dev; ++ struct list_head node; ++ struct list_head devs; ++}; ++ ++struct ucb1x00_driver; ++ ++struct ucb1x00_dev { ++ struct list_head dev_node; ++ struct list_head drv_node; ++ struct ucb1x00 *ucb; ++ struct ucb1x00_driver *drv; ++ void *priv; ++}; ++ ++struct ucb1x00_driver { ++ struct list_head node; ++ struct list_head devs; ++ int (*add)(struct ucb1x00_dev *dev); ++ void (*remove)(struct ucb1x00_dev *dev); ++ int (*suspend)(struct ucb1x00_dev *dev, pm_message_t state); ++ int (*resume)(struct ucb1x00_dev *dev); ++}; ++ ++#define classdev_to_ucb1x00(cd) container_of(cd, struct ucb1x00, dev) ++ ++int ucb1x00_register_driver(struct ucb1x00_driver *); ++void ucb1x00_unregister_driver(struct ucb1x00_driver *); ++ ++/** ++ * ucb1x00_clkrate - return the UCB1x00 SIB clock rate ++ * @ucb: UCB1x00 structure describing chip ++ * ++ * Return the SIB clock rate in Hz. ++ */ ++static inline unsigned int ucb1x00_clkrate(struct ucb1x00 *ucb) ++{ ++ return mcp_get_sclk_rate(ucb->mcp); ++} ++ ++/** ++ * ucb1x00_enable - enable the UCB1x00 SIB clock ++ * @ucb: UCB1x00 structure describing chip ++ * ++ * Enable the SIB clock. This can be called multiple times. ++ */ ++static inline void ucb1x00_enable(struct ucb1x00 *ucb) ++{ ++ mcp_enable(ucb->mcp); ++} ++ ++/** ++ * ucb1x00_disable - disable the UCB1x00 SIB clock ++ * @ucb: UCB1x00 structure describing chip ++ * ++ * Disable the SIB clock. The SIB clock will only be disabled ++ * when the number of ucb1x00_enable calls match the number of ++ * ucb1x00_disable calls. ++ */ ++static inline void ucb1x00_disable(struct ucb1x00 *ucb) ++{ ++ mcp_disable(ucb->mcp); ++} ++ ++/** ++ * ucb1x00_reg_write - write a UCB1x00 register ++ * @ucb: UCB1x00 structure describing chip ++ * @reg: UCB1x00 4-bit register index to write ++ * @val: UCB1x00 16-bit value to write ++ * ++ * Write the UCB1x00 register @reg with value @val. The SIB ++ * clock must be running for this function to return. ++ */ ++static inline void ucb1x00_reg_write(struct ucb1x00 *ucb, unsigned int reg, unsigned int val) ++{ ++ mcp_reg_write(ucb->mcp, reg, val); ++} ++ ++/** ++ * ucb1x00_reg_read - read a UCB1x00 register ++ * @ucb: UCB1x00 structure describing chip ++ * @reg: UCB1x00 4-bit register index to write ++ * ++ * Read the UCB1x00 register @reg and return its value. The SIB ++ * clock must be running for this function to return. ++ */ ++static inline unsigned int ucb1x00_reg_read(struct ucb1x00 *ucb, unsigned int reg) ++{ ++ return mcp_reg_read(ucb->mcp, reg); ++} ++/** ++ * ucb1x00_set_audio_divisor - ++ * @ucb: UCB1x00 structure describing chip ++ * @div: SIB clock divisor ++ */ ++static inline void ucb1x00_set_audio_divisor(struct ucb1x00 *ucb, unsigned int div) ++{ ++ mcp_set_audio_divisor(ucb->mcp, div); ++} ++ ++/** ++ * ucb1x00_set_telecom_divisor - ++ * @ucb: UCB1x00 structure describing chip ++ * @div: SIB clock divisor ++ */ ++static inline void ucb1x00_set_telecom_divisor(struct ucb1x00 *ucb, unsigned int div) ++{ ++ mcp_set_telecom_divisor(ucb->mcp, div); ++} ++ ++void ucb1x00_io_set_dir(struct ucb1x00 *ucb, unsigned int, unsigned int); ++void ucb1x00_io_write(struct ucb1x00 *ucb, unsigned int, unsigned int); ++unsigned int ucb1x00_io_read(struct ucb1x00 *ucb); ++ ++#define UCB_NOSYNC (0) ++#define UCB_SYNC (1) ++ ++unsigned int ucb1x00_adc_read(struct ucb1x00 *ucb, int adc_channel, int sync); ++void ucb1x00_adc_enable(struct ucb1x00 *ucb); ++void ucb1x00_adc_disable(struct ucb1x00 *ucb); ++ ++/* ++ * Which edges of the IRQ do you want to control today? ++ */ ++#define UCB_RISING (1 << 0) ++#define UCB_FALLING (1 << 1) ++ ++int ucb1x00_hook_irq(struct ucb1x00 *ucb, unsigned int idx, void (*fn)(int, void *), void *devid); ++void ucb1x00_enable_irq(struct ucb1x00 *ucb, unsigned int idx, int edges); ++void ucb1x00_disable_irq(struct ucb1x00 *ucb, unsigned int idx, int edges); ++int ucb1x00_free_irq(struct ucb1x00 *ucb, unsigned int idx, void *devid); ++ ++#endif +-- +1.5.6.5 + diff --git a/packages/linux/linux-2.6.28/collie/0012-move-ucb1200-ts-driver.patch b/packages/linux/linux-2.6.28/collie/0012-move-ucb1200-ts-driver.patch new file mode 100644 index 0000000000..c1aafef5e2 --- /dev/null +++ b/packages/linux/linux-2.6.28/collie/0012-move-ucb1200-ts-driver.patch @@ -0,0 +1,981 @@ +From 9e0d71c4a6247d88d3b772f6b05bcaa39711a937 Mon Sep 17 00:00:00 2001 +From: Thomas Kunze <thommycheck@gmx.de> +Date: Tue, 10 Feb 2009 19:31:25 +0100 +Subject: [PATCH 12/23] move ucb1200-ts driver + +Move the touchscreen driver to drivers/input/touchscreen +where touchscreen drivers belong. + +Conflicts: + + drivers/input/touchscreen/Makefile + drivers/mfd/Kconfig + drivers/mfd/Makefile + +Conflicts: + + drivers/mfd/Kconfig + drivers/mfd/Makefile +--- + drivers/input/touchscreen/Kconfig | 7 + + drivers/input/touchscreen/Makefile | 1 + + drivers/input/touchscreen/ucb1x00-ts.c | 438 ++++++++++++++++++++++++++++++++ + drivers/mfd/Kconfig | 3 - + drivers/mfd/Makefile | 3 +- + drivers/mfd/ucb1x00-ts.c | 438 -------------------------------- + 6 files changed, 447 insertions(+), 443 deletions(-) + create mode 100644 drivers/input/touchscreen/ucb1x00-ts.c + delete mode 100644 drivers/mfd/ucb1x00-ts.c + +diff --git a/drivers/input/touchscreen/Kconfig b/drivers/input/touchscreen/Kconfig +index 3d1ab8f..3ac8cd6 100644 +--- a/drivers/input/touchscreen/Kconfig ++++ b/drivers/input/touchscreen/Kconfig +@@ -221,6 +221,13 @@ config TOUCHSCREEN_ATMEL_TSADCC + To compile this driver as a module, choose M here: the + module will be called atmel_tsadcc. + ++config TOUCHSCREEN_UCB1200_TS ++ tristate "Philips UCB1200 touchscreen" ++ depends on MCP_UCB1200 ++ help ++ This enabled support for the Pilips UCB1200 touchscreen interface ++ and compatible. ++ + config TOUCHSCREEN_UCB1400 + tristate "Philips UCB1400 touchscreen" + depends on AC97_BUS +diff --git a/drivers/input/touchscreen/Makefile b/drivers/input/touchscreen/Makefile +index 15cf290..77ba930 100644 +--- a/drivers/input/touchscreen/Makefile ++++ b/drivers/input/touchscreen/Makefile +@@ -25,6 +25,7 @@ obj-$(CONFIG_TOUCHSCREEN_PENMOUNT) += penmount.o + obj-$(CONFIG_TOUCHSCREEN_TOUCHIT213) += touchit213.o + obj-$(CONFIG_TOUCHSCREEN_TOUCHRIGHT) += touchright.o + obj-$(CONFIG_TOUCHSCREEN_TOUCHWIN) += touchwin.o ++obj-$(CONFIG_TOUCHSCREEN_UCB1200_TS) += ucb1x00-ts.o + obj-$(CONFIG_TOUCHSCREEN_UCB1400) += ucb1400_ts.o + obj-$(CONFIG_TOUCHSCREEN_WM97XX) += wm97xx-ts.o + wm97xx-ts-$(CONFIG_TOUCHSCREEN_WM9705) += wm9705.o +diff --git a/drivers/input/touchscreen/ucb1x00-ts.c b/drivers/input/touchscreen/ucb1x00-ts.c +new file mode 100644 +index 0000000..b5feae9 +--- /dev/null ++++ b/drivers/input/touchscreen/ucb1x00-ts.c +@@ -0,0 +1,438 @@ ++/* ++ * Touchscreen driver for UCB1x00-based touchscreens ++ * ++ * Copyright (C) 2001 Russell King, All Rights Reserved. ++ * Copyright (C) 2005 Pavel Machek ++ * ++ * 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. ++ * ++ * 21-Jan-2002 <jco@ict.es> : ++ * ++ * Added support for synchronous A/D mode. This mode is useful to ++ * avoid noise induced in the touchpanel by the LCD, provided that ++ * the UCB1x00 has a valid LCD sync signal routed to its ADCSYNC pin. ++ * It is important to note that the signal connected to the ADCSYNC ++ * pin should provide pulses even when the LCD is blanked, otherwise ++ * a pen touch needed to unblank the LCD will never be read. ++ */ ++#include <linux/module.h> ++#include <linux/moduleparam.h> ++#include <linux/init.h> ++#include <linux/smp.h> ++#include <linux/sched.h> ++#include <linux/completion.h> ++#include <linux/delay.h> ++#include <linux/string.h> ++#include <linux/input.h> ++#include <linux/device.h> ++#include <linux/freezer.h> ++#include <linux/slab.h> ++#include <linux/kthread.h> ++#include <linux/mfd/ucb1x00.h> ++ ++#include <asm/dma.h> ++#include <mach/collie.h> ++#include <asm/mach-types.h> ++ ++ ++ ++struct ucb1x00_ts { ++ struct input_dev *idev; ++ struct ucb1x00 *ucb; ++ ++ wait_queue_head_t irq_wait; ++ struct task_struct *rtask; ++ u16 x_res; ++ u16 y_res; ++ ++ unsigned int restart:1; ++ unsigned int adcsync:1; ++}; ++ ++static int adcsync; ++ ++static inline void ucb1x00_ts_evt_add(struct ucb1x00_ts *ts, u16 pressure, u16 x, u16 y) ++{ ++ struct input_dev *idev = ts->idev; ++ ++ input_report_abs(idev, ABS_X, x); ++ input_report_abs(idev, ABS_Y, y); ++ input_report_abs(idev, ABS_PRESSURE, pressure); ++ input_sync(idev); ++} ++ ++static inline void ucb1x00_ts_event_release(struct ucb1x00_ts *ts) ++{ ++ struct input_dev *idev = ts->idev; ++ ++ input_report_abs(idev, ABS_PRESSURE, 0); ++ input_sync(idev); ++} ++ ++/* ++ * Switch to interrupt mode. ++ */ ++static inline void ucb1x00_ts_mode_int(struct ucb1x00_ts *ts) ++{ ++ ucb1x00_reg_write(ts->ucb, UCB_TS_CR, ++ UCB_TS_CR_TSMX_POW | UCB_TS_CR_TSPX_POW | ++ UCB_TS_CR_TSMY_GND | UCB_TS_CR_TSPY_GND | ++ UCB_TS_CR_MODE_INT); ++} ++ ++/* ++ * Switch to pressure mode, and read pressure. We don't need to wait ++ * here, since both plates are being driven. ++ */ ++static inline unsigned int ucb1x00_ts_read_pressure(struct ucb1x00_ts *ts) ++{ ++ if (machine_is_collie()) { ++ ucb1x00_io_write(ts->ucb, COLLIE_TC35143_GPIO_TBL_CHK, 0); ++ ucb1x00_reg_write(ts->ucb, UCB_TS_CR, ++ UCB_TS_CR_TSPX_POW | UCB_TS_CR_TSMX_POW | ++ UCB_TS_CR_MODE_POS | UCB_TS_CR_BIAS_ENA); ++ ++ udelay(55); ++ ++ return ucb1x00_adc_read(ts->ucb, UCB_ADC_INP_AD2, ts->adcsync); ++ } else { ++ ucb1x00_reg_write(ts->ucb, UCB_TS_CR, ++ UCB_TS_CR_TSMX_POW | UCB_TS_CR_TSPX_POW | ++ UCB_TS_CR_TSMY_GND | UCB_TS_CR_TSPY_GND | ++ UCB_TS_CR_MODE_PRES | UCB_TS_CR_BIAS_ENA); ++ ++ return ucb1x00_adc_read(ts->ucb, UCB_ADC_INP_TSPY, ts->adcsync); ++ } ++} ++ ++/* ++ * Switch to X position mode and measure Y plate. We switch the plate ++ * configuration in pressure mode, then switch to position mode. This ++ * gives a faster response time. Even so, we need to wait about 55us ++ * for things to stabilise. ++ */ ++static inline unsigned int ucb1x00_ts_read_xpos(struct ucb1x00_ts *ts) ++{ ++ if (machine_is_collie()) ++ ucb1x00_io_write(ts->ucb, 0, COLLIE_TC35143_GPIO_TBL_CHK); ++ else { ++ ucb1x00_reg_write(ts->ucb, UCB_TS_CR, ++ UCB_TS_CR_TSMX_GND | UCB_TS_CR_TSPX_POW | ++ UCB_TS_CR_MODE_PRES | UCB_TS_CR_BIAS_ENA); ++ ucb1x00_reg_write(ts->ucb, UCB_TS_CR, ++ UCB_TS_CR_TSMX_GND | UCB_TS_CR_TSPX_POW | ++ UCB_TS_CR_MODE_PRES | UCB_TS_CR_BIAS_ENA); ++ } ++ ucb1x00_reg_write(ts->ucb, UCB_TS_CR, ++ UCB_TS_CR_TSMX_GND | UCB_TS_CR_TSPX_POW | ++ UCB_TS_CR_MODE_POS | UCB_TS_CR_BIAS_ENA); ++ ++ udelay(55); ++ ++ return ucb1x00_adc_read(ts->ucb, UCB_ADC_INP_TSPY, ts->adcsync); ++} ++ ++/* ++ * Switch to Y position mode and measure X plate. We switch the plate ++ * configuration in pressure mode, then switch to position mode. This ++ * gives a faster response time. Even so, we need to wait about 55us ++ * for things to stabilise. ++ */ ++static inline unsigned int ucb1x00_ts_read_ypos(struct ucb1x00_ts *ts) ++{ ++ if (machine_is_collie()) ++ ucb1x00_io_write(ts->ucb, 0, COLLIE_TC35143_GPIO_TBL_CHK); ++ else { ++ ucb1x00_reg_write(ts->ucb, UCB_TS_CR, ++ UCB_TS_CR_TSMY_GND | UCB_TS_CR_TSPY_POW | ++ UCB_TS_CR_MODE_PRES | UCB_TS_CR_BIAS_ENA); ++ ucb1x00_reg_write(ts->ucb, UCB_TS_CR, ++ UCB_TS_CR_TSMY_GND | UCB_TS_CR_TSPY_POW | ++ UCB_TS_CR_MODE_PRES | UCB_TS_CR_BIAS_ENA); ++ } ++ ++ ucb1x00_reg_write(ts->ucb, UCB_TS_CR, ++ UCB_TS_CR_TSMY_GND | UCB_TS_CR_TSPY_POW | ++ UCB_TS_CR_MODE_POS | UCB_TS_CR_BIAS_ENA); ++ ++ udelay(55); ++ ++ return ucb1x00_adc_read(ts->ucb, UCB_ADC_INP_TSPX, ts->adcsync); ++} ++ ++/* ++ * Switch to X plate resistance mode. Set MX to ground, PX to ++ * supply. Measure current. ++ */ ++static inline unsigned int ucb1x00_ts_read_xres(struct ucb1x00_ts *ts) ++{ ++ ucb1x00_reg_write(ts->ucb, UCB_TS_CR, ++ UCB_TS_CR_TSMX_GND | UCB_TS_CR_TSPX_POW | ++ UCB_TS_CR_MODE_PRES | UCB_TS_CR_BIAS_ENA); ++ return ucb1x00_adc_read(ts->ucb, 0, ts->adcsync); ++} ++ ++/* ++ * Switch to Y plate resistance mode. Set MY to ground, PY to ++ * supply. Measure current. ++ */ ++static inline unsigned int ucb1x00_ts_read_yres(struct ucb1x00_ts *ts) ++{ ++ ucb1x00_reg_write(ts->ucb, UCB_TS_CR, ++ UCB_TS_CR_TSMY_GND | UCB_TS_CR_TSPY_POW | ++ UCB_TS_CR_MODE_PRES | UCB_TS_CR_BIAS_ENA); ++ return ucb1x00_adc_read(ts->ucb, 0, ts->adcsync); ++} ++ ++static inline int ucb1x00_ts_pen_down(struct ucb1x00_ts *ts) ++{ ++ unsigned int val = ucb1x00_reg_read(ts->ucb, UCB_TS_CR); ++ ++ if (machine_is_collie()) ++ return (!(val & (UCB_TS_CR_TSPX_LOW))); ++ else ++ return (val & (UCB_TS_CR_TSPX_LOW | UCB_TS_CR_TSMX_LOW)); ++} ++ ++/* ++ * This is a RT kernel thread that handles the ADC accesses ++ * (mainly so we can use semaphores in the UCB1200 core code ++ * to serialise accesses to the ADC). ++ */ ++static int ucb1x00_thread(void *_ts) ++{ ++ struct ucb1x00_ts *ts = _ts; ++ DECLARE_WAITQUEUE(wait, current); ++ int valid = 0; ++ ++ set_freezable(); ++ add_wait_queue(&ts->irq_wait, &wait); ++ while (!kthread_should_stop()) { ++ unsigned int x, y, p; ++ signed long timeout; ++ ++ ts->restart = 0; ++ ++ ucb1x00_adc_enable(ts->ucb); ++ ++ x = ucb1x00_ts_read_xpos(ts); ++ y = ucb1x00_ts_read_ypos(ts); ++ p = ucb1x00_ts_read_pressure(ts); ++ ++ /* ++ * Switch back to interrupt mode. ++ */ ++ ucb1x00_ts_mode_int(ts); ++ ucb1x00_adc_disable(ts->ucb); ++ ++ msleep(10); ++ ++ ucb1x00_enable(ts->ucb); ++ ++ ++ if (ucb1x00_ts_pen_down(ts)) { ++ set_current_state(TASK_INTERRUPTIBLE); ++ ++ ucb1x00_enable_irq(ts->ucb, UCB_IRQ_TSPX, machine_is_collie() ? UCB_RISING : UCB_FALLING); ++ ucb1x00_disable(ts->ucb); ++ ++ /* ++ * If we spat out a valid sample set last time, ++ * spit out a "pen off" sample here. ++ */ ++ if (valid) { ++ ucb1x00_ts_event_release(ts); ++ valid = 0; ++ } ++ ++ timeout = MAX_SCHEDULE_TIMEOUT; ++ } else { ++ ucb1x00_disable(ts->ucb); ++ ++ /* ++ * Filtering is policy. Policy belongs in user ++ * space. We therefore leave it to user space ++ * to do any filtering they please. ++ */ ++ if (!ts->restart) { ++ ucb1x00_ts_evt_add(ts, p, x, y); ++ valid = 1; ++ } ++ ++ set_current_state(TASK_INTERRUPTIBLE); ++ timeout = HZ / 100; ++ } ++ ++ try_to_freeze(); ++ ++ schedule_timeout(timeout); ++ } ++ ++ remove_wait_queue(&ts->irq_wait, &wait); ++ ++ ts->rtask = NULL; ++ return 0; ++} ++ ++/* ++ * We only detect touch screen _touches_ with this interrupt ++ * handler, and even then we just schedule our task. ++ */ ++static void ucb1x00_ts_irq(int idx, void *id) ++{ ++ struct ucb1x00_ts *ts = id; ++ ++ ucb1x00_disable_irq(ts->ucb, UCB_IRQ_TSPX, UCB_FALLING); ++ wake_up(&ts->irq_wait); ++} ++ ++static int ucb1x00_ts_open(struct input_dev *idev) ++{ ++ struct ucb1x00_ts *ts = input_get_drvdata(idev); ++ int ret = 0; ++ ++ BUG_ON(ts->rtask); ++ ++ init_waitqueue_head(&ts->irq_wait); ++ ret = ucb1x00_hook_irq(ts->ucb, UCB_IRQ_TSPX, ucb1x00_ts_irq, ts); ++ if (ret < 0) ++ goto out; ++ ++ /* ++ * If we do this at all, we should allow the user to ++ * measure and read the X and Y resistance at any time. ++ */ ++ ucb1x00_adc_enable(ts->ucb); ++ ts->x_res = ucb1x00_ts_read_xres(ts); ++ ts->y_res = ucb1x00_ts_read_yres(ts); ++ ucb1x00_adc_disable(ts->ucb); ++ ++ ts->rtask = kthread_run(ucb1x00_thread, ts, "ktsd"); ++ if (!IS_ERR(ts->rtask)) { ++ ret = 0; ++ } else { ++ ucb1x00_free_irq(ts->ucb, UCB_IRQ_TSPX, ts); ++ ts->rtask = NULL; ++ ret = -EFAULT; ++ } ++ ++ out: ++ return ret; ++} ++ ++/* ++ * Release touchscreen resources. Disable IRQs. ++ */ ++static void ucb1x00_ts_close(struct input_dev *idev) ++{ ++ struct ucb1x00_ts *ts = input_get_drvdata(idev); ++ ++ if (ts->rtask) ++ kthread_stop(ts->rtask); ++ ++ ucb1x00_enable(ts->ucb); ++ ucb1x00_free_irq(ts->ucb, UCB_IRQ_TSPX, ts); ++ ucb1x00_reg_write(ts->ucb, UCB_TS_CR, 0); ++ ucb1x00_disable(ts->ucb); ++} ++ ++#ifdef CONFIG_PM ++static int ucb1x00_ts_resume(struct ucb1x00_dev *dev) ++{ ++ struct ucb1x00_ts *ts = dev->priv; ++ ++ if (ts->rtask != NULL) { ++ /* ++ * Restart the TS thread to ensure the ++ * TS interrupt mode is set up again ++ * after sleep. ++ */ ++ ts->restart = 1; ++ wake_up(&ts->irq_wait); ++ } ++ return 0; ++} ++#else ++#define ucb1x00_ts_resume NULL ++#endif ++ ++ ++/* ++ * Initialisation. ++ */ ++static int ucb1x00_ts_add(struct ucb1x00_dev *dev) ++{ ++ struct ucb1x00_ts *ts; ++ struct input_dev *idev; ++ int err; ++ ++ ts = kzalloc(sizeof(struct ucb1x00_ts), GFP_KERNEL); ++ idev = input_allocate_device(); ++ if (!ts || !idev) { ++ err = -ENOMEM; ++ goto fail; ++ } ++ ++ ts->ucb = dev->ucb; ++ ts->idev = idev; ++ ts->adcsync = adcsync ? UCB_SYNC : UCB_NOSYNC; ++ ++ idev->name = "Touchscreen panel"; ++ idev->id.product = ts->ucb->id; ++ idev->open = ucb1x00_ts_open; ++ idev->close = ucb1x00_ts_close; ++ ++ __set_bit(EV_ABS, idev->evbit); ++ __set_bit(ABS_X, idev->absbit); ++ __set_bit(ABS_Y, idev->absbit); ++ __set_bit(ABS_PRESSURE, idev->absbit); ++ ++ input_set_drvdata(idev, ts); ++ ++ err = input_register_device(idev); ++ if (err) ++ goto fail; ++ ++ dev->priv = ts; ++ ++ return 0; ++ ++ fail: ++ input_free_device(idev); ++ kfree(ts); ++ return err; ++} ++ ++static void ucb1x00_ts_remove(struct ucb1x00_dev *dev) ++{ ++ struct ucb1x00_ts *ts = dev->priv; ++ ++ input_unregister_device(ts->idev); ++ kfree(ts); ++} ++ ++static struct ucb1x00_driver ucb1x00_ts_driver = { ++ .add = ucb1x00_ts_add, ++ .remove = ucb1x00_ts_remove, ++ .resume = ucb1x00_ts_resume, ++}; ++ ++static int __init ucb1x00_ts_init(void) ++{ ++ return ucb1x00_register_driver(&ucb1x00_ts_driver); ++} ++ ++static void __exit ucb1x00_ts_exit(void) ++{ ++ ucb1x00_unregister_driver(&ucb1x00_ts_driver); ++} ++ ++module_param(adcsync, int, 0444); ++module_init(ucb1x00_ts_init); ++module_exit(ucb1x00_ts_exit); ++ ++MODULE_AUTHOR("Russell King <rmk@arm.linux.org.uk>"); ++MODULE_DESCRIPTION("UCB1x00 touchscreen driver"); ++MODULE_LICENSE("GPL"); +diff --git a/drivers/mfd/Kconfig b/drivers/mfd/Kconfig +index 2572773..bbc137d 100644 +--- a/drivers/mfd/Kconfig ++++ b/drivers/mfd/Kconfig +@@ -172,8 +172,5 @@ config MCP_UCB1200 + tristate "Support for UCB1200 / UCB1300" + depends on MCP + +-config MCP_UCB1200_TS +- tristate "Touchscreen interface support" +- depends on MCP_UCB1200 && INPUT + + endmenu +diff --git a/drivers/mfd/Makefile b/drivers/mfd/Makefile +index 9a5ad8a..4981aff 100644 +--- a/drivers/mfd/Makefile ++++ b/drivers/mfd/Makefile +@@ -24,11 +24,10 @@ obj-$(CONFIG_MFD_CORE) += mfd-core.o + obj-$(CONFIG_MCP) += mcp-core.o + obj-$(CONFIG_MCP_SA11X0) += mcp-sa11x0.o + obj-$(CONFIG_MCP_UCB1200) += ucb1x00-core.o +-obj-$(CONFIG_MCP_UCB1200_TS) += ucb1x00-ts.o + + ifeq ($(CONFIG_SA1100_ASSABET),y) + obj-$(CONFIG_MCP_UCB1200) += ucb1x00-assabet.o + endif + obj-$(CONFIG_UCB1400_CORE) += ucb1400_core.o + +-obj-$(CONFIG_PMIC_DA903X) += da903x.o +\ No newline at end of file ++obj-$(CONFIG_PMIC_DA903X) += da903x.o +diff --git a/drivers/mfd/ucb1x00-ts.c b/drivers/mfd/ucb1x00-ts.c +deleted file mode 100644 +index b5feae9..0000000 +--- a/drivers/mfd/ucb1x00-ts.c ++++ /dev/null +@@ -1,438 +0,0 @@ +-/* +- * Touchscreen driver for UCB1x00-based touchscreens +- * +- * Copyright (C) 2001 Russell King, All Rights Reserved. +- * Copyright (C) 2005 Pavel Machek +- * +- * 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. +- * +- * 21-Jan-2002 <jco@ict.es> : +- * +- * Added support for synchronous A/D mode. This mode is useful to +- * avoid noise induced in the touchpanel by the LCD, provided that +- * the UCB1x00 has a valid LCD sync signal routed to its ADCSYNC pin. +- * It is important to note that the signal connected to the ADCSYNC +- * pin should provide pulses even when the LCD is blanked, otherwise +- * a pen touch needed to unblank the LCD will never be read. +- */ +-#include <linux/module.h> +-#include <linux/moduleparam.h> +-#include <linux/init.h> +-#include <linux/smp.h> +-#include <linux/sched.h> +-#include <linux/completion.h> +-#include <linux/delay.h> +-#include <linux/string.h> +-#include <linux/input.h> +-#include <linux/device.h> +-#include <linux/freezer.h> +-#include <linux/slab.h> +-#include <linux/kthread.h> +-#include <linux/mfd/ucb1x00.h> +- +-#include <asm/dma.h> +-#include <mach/collie.h> +-#include <asm/mach-types.h> +- +- +- +-struct ucb1x00_ts { +- struct input_dev *idev; +- struct ucb1x00 *ucb; +- +- wait_queue_head_t irq_wait; +- struct task_struct *rtask; +- u16 x_res; +- u16 y_res; +- +- unsigned int restart:1; +- unsigned int adcsync:1; +-}; +- +-static int adcsync; +- +-static inline void ucb1x00_ts_evt_add(struct ucb1x00_ts *ts, u16 pressure, u16 x, u16 y) +-{ +- struct input_dev *idev = ts->idev; +- +- input_report_abs(idev, ABS_X, x); +- input_report_abs(idev, ABS_Y, y); +- input_report_abs(idev, ABS_PRESSURE, pressure); +- input_sync(idev); +-} +- +-static inline void ucb1x00_ts_event_release(struct ucb1x00_ts *ts) +-{ +- struct input_dev *idev = ts->idev; +- +- input_report_abs(idev, ABS_PRESSURE, 0); +- input_sync(idev); +-} +- +-/* +- * Switch to interrupt mode. +- */ +-static inline void ucb1x00_ts_mode_int(struct ucb1x00_ts *ts) +-{ +- ucb1x00_reg_write(ts->ucb, UCB_TS_CR, +- UCB_TS_CR_TSMX_POW | UCB_TS_CR_TSPX_POW | +- UCB_TS_CR_TSMY_GND | UCB_TS_CR_TSPY_GND | +- UCB_TS_CR_MODE_INT); +-} +- +-/* +- * Switch to pressure mode, and read pressure. We don't need to wait +- * here, since both plates are being driven. +- */ +-static inline unsigned int ucb1x00_ts_read_pressure(struct ucb1x00_ts *ts) +-{ +- if (machine_is_collie()) { +- ucb1x00_io_write(ts->ucb, COLLIE_TC35143_GPIO_TBL_CHK, 0); +- ucb1x00_reg_write(ts->ucb, UCB_TS_CR, +- UCB_TS_CR_TSPX_POW | UCB_TS_CR_TSMX_POW | +- UCB_TS_CR_MODE_POS | UCB_TS_CR_BIAS_ENA); +- +- udelay(55); +- +- return ucb1x00_adc_read(ts->ucb, UCB_ADC_INP_AD2, ts->adcsync); +- } else { +- ucb1x00_reg_write(ts->ucb, UCB_TS_CR, +- UCB_TS_CR_TSMX_POW | UCB_TS_CR_TSPX_POW | +- UCB_TS_CR_TSMY_GND | UCB_TS_CR_TSPY_GND | +- UCB_TS_CR_MODE_PRES | UCB_TS_CR_BIAS_ENA); +- +- return ucb1x00_adc_read(ts->ucb, UCB_ADC_INP_TSPY, ts->adcsync); +- } +-} +- +-/* +- * Switch to X position mode and measure Y plate. We switch the plate +- * configuration in pressure mode, then switch to position mode. This +- * gives a faster response time. Even so, we need to wait about 55us +- * for things to stabilise. +- */ +-static inline unsigned int ucb1x00_ts_read_xpos(struct ucb1x00_ts *ts) +-{ +- if (machine_is_collie()) +- ucb1x00_io_write(ts->ucb, 0, COLLIE_TC35143_GPIO_TBL_CHK); +- else { +- ucb1x00_reg_write(ts->ucb, UCB_TS_CR, +- UCB_TS_CR_TSMX_GND | UCB_TS_CR_TSPX_POW | +- UCB_TS_CR_MODE_PRES | UCB_TS_CR_BIAS_ENA); +- ucb1x00_reg_write(ts->ucb, UCB_TS_CR, +- UCB_TS_CR_TSMX_GND | UCB_TS_CR_TSPX_POW | +- UCB_TS_CR_MODE_PRES | UCB_TS_CR_BIAS_ENA); +- } +- ucb1x00_reg_write(ts->ucb, UCB_TS_CR, +- UCB_TS_CR_TSMX_GND | UCB_TS_CR_TSPX_POW | +- UCB_TS_CR_MODE_POS | UCB_TS_CR_BIAS_ENA); +- +- udelay(55); +- +- return ucb1x00_adc_read(ts->ucb, UCB_ADC_INP_TSPY, ts->adcsync); +-} +- +-/* +- * Switch to Y position mode and measure X plate. We switch the plate +- * configuration in pressure mode, then switch to position mode. This +- * gives a faster response time. Even so, we need to wait about 55us +- * for things to stabilise. +- */ +-static inline unsigned int ucb1x00_ts_read_ypos(struct ucb1x00_ts *ts) +-{ +- if (machine_is_collie()) +- ucb1x00_io_write(ts->ucb, 0, COLLIE_TC35143_GPIO_TBL_CHK); +- else { +- ucb1x00_reg_write(ts->ucb, UCB_TS_CR, +- UCB_TS_CR_TSMY_GND | UCB_TS_CR_TSPY_POW | +- UCB_TS_CR_MODE_PRES | UCB_TS_CR_BIAS_ENA); +- ucb1x00_reg_write(ts->ucb, UCB_TS_CR, +- UCB_TS_CR_TSMY_GND | UCB_TS_CR_TSPY_POW | +- UCB_TS_CR_MODE_PRES | UCB_TS_CR_BIAS_ENA); +- } +- +- ucb1x00_reg_write(ts->ucb, UCB_TS_CR, +- UCB_TS_CR_TSMY_GND | UCB_TS_CR_TSPY_POW | +- UCB_TS_CR_MODE_POS | UCB_TS_CR_BIAS_ENA); +- +- udelay(55); +- +- return ucb1x00_adc_read(ts->ucb, UCB_ADC_INP_TSPX, ts->adcsync); +-} +- +-/* +- * Switch to X plate resistance mode. Set MX to ground, PX to +- * supply. Measure current. +- */ +-static inline unsigned int ucb1x00_ts_read_xres(struct ucb1x00_ts *ts) +-{ +- ucb1x00_reg_write(ts->ucb, UCB_TS_CR, +- UCB_TS_CR_TSMX_GND | UCB_TS_CR_TSPX_POW | +- UCB_TS_CR_MODE_PRES | UCB_TS_CR_BIAS_ENA); +- return ucb1x00_adc_read(ts->ucb, 0, ts->adcsync); +-} +- +-/* +- * Switch to Y plate resistance mode. Set MY to ground, PY to +- * supply. Measure current. +- */ +-static inline unsigned int ucb1x00_ts_read_yres(struct ucb1x00_ts *ts) +-{ +- ucb1x00_reg_write(ts->ucb, UCB_TS_CR, +- UCB_TS_CR_TSMY_GND | UCB_TS_CR_TSPY_POW | +- UCB_TS_CR_MODE_PRES | UCB_TS_CR_BIAS_ENA); +- return ucb1x00_adc_read(ts->ucb, 0, ts->adcsync); +-} +- +-static inline int ucb1x00_ts_pen_down(struct ucb1x00_ts *ts) +-{ +- unsigned int val = ucb1x00_reg_read(ts->ucb, UCB_TS_CR); +- +- if (machine_is_collie()) +- return (!(val & (UCB_TS_CR_TSPX_LOW))); +- else +- return (val & (UCB_TS_CR_TSPX_LOW | UCB_TS_CR_TSMX_LOW)); +-} +- +-/* +- * This is a RT kernel thread that handles the ADC accesses +- * (mainly so we can use semaphores in the UCB1200 core code +- * to serialise accesses to the ADC). +- */ +-static int ucb1x00_thread(void *_ts) +-{ +- struct ucb1x00_ts *ts = _ts; +- DECLARE_WAITQUEUE(wait, current); +- int valid = 0; +- +- set_freezable(); +- add_wait_queue(&ts->irq_wait, &wait); +- while (!kthread_should_stop()) { +- unsigned int x, y, p; +- signed long timeout; +- +- ts->restart = 0; +- +- ucb1x00_adc_enable(ts->ucb); +- +- x = ucb1x00_ts_read_xpos(ts); +- y = ucb1x00_ts_read_ypos(ts); +- p = ucb1x00_ts_read_pressure(ts); +- +- /* +- * Switch back to interrupt mode. +- */ +- ucb1x00_ts_mode_int(ts); +- ucb1x00_adc_disable(ts->ucb); +- +- msleep(10); +- +- ucb1x00_enable(ts->ucb); +- +- +- if (ucb1x00_ts_pen_down(ts)) { +- set_current_state(TASK_INTERRUPTIBLE); +- +- ucb1x00_enable_irq(ts->ucb, UCB_IRQ_TSPX, machine_is_collie() ? UCB_RISING : UCB_FALLING); +- ucb1x00_disable(ts->ucb); +- +- /* +- * If we spat out a valid sample set last time, +- * spit out a "pen off" sample here. +- */ +- if (valid) { +- ucb1x00_ts_event_release(ts); +- valid = 0; +- } +- +- timeout = MAX_SCHEDULE_TIMEOUT; +- } else { +- ucb1x00_disable(ts->ucb); +- +- /* +- * Filtering is policy. Policy belongs in user +- * space. We therefore leave it to user space +- * to do any filtering they please. +- */ +- if (!ts->restart) { +- ucb1x00_ts_evt_add(ts, p, x, y); +- valid = 1; +- } +- +- set_current_state(TASK_INTERRUPTIBLE); +- timeout = HZ / 100; +- } +- +- try_to_freeze(); +- +- schedule_timeout(timeout); +- } +- +- remove_wait_queue(&ts->irq_wait, &wait); +- +- ts->rtask = NULL; +- return 0; +-} +- +-/* +- * We only detect touch screen _touches_ with this interrupt +- * handler, and even then we just schedule our task. +- */ +-static void ucb1x00_ts_irq(int idx, void *id) +-{ +- struct ucb1x00_ts *ts = id; +- +- ucb1x00_disable_irq(ts->ucb, UCB_IRQ_TSPX, UCB_FALLING); +- wake_up(&ts->irq_wait); +-} +- +-static int ucb1x00_ts_open(struct input_dev *idev) +-{ +- struct ucb1x00_ts *ts = input_get_drvdata(idev); +- int ret = 0; +- +- BUG_ON(ts->rtask); +- +- init_waitqueue_head(&ts->irq_wait); +- ret = ucb1x00_hook_irq(ts->ucb, UCB_IRQ_TSPX, ucb1x00_ts_irq, ts); +- if (ret < 0) +- goto out; +- +- /* +- * If we do this at all, we should allow the user to +- * measure and read the X and Y resistance at any time. +- */ +- ucb1x00_adc_enable(ts->ucb); +- ts->x_res = ucb1x00_ts_read_xres(ts); +- ts->y_res = ucb1x00_ts_read_yres(ts); +- ucb1x00_adc_disable(ts->ucb); +- +- ts->rtask = kthread_run(ucb1x00_thread, ts, "ktsd"); +- if (!IS_ERR(ts->rtask)) { +- ret = 0; +- } else { +- ucb1x00_free_irq(ts->ucb, UCB_IRQ_TSPX, ts); +- ts->rtask = NULL; +- ret = -EFAULT; +- } +- +- out: +- return ret; +-} +- +-/* +- * Release touchscreen resources. Disable IRQs. +- */ +-static void ucb1x00_ts_close(struct input_dev *idev) +-{ +- struct ucb1x00_ts *ts = input_get_drvdata(idev); +- +- if (ts->rtask) +- kthread_stop(ts->rtask); +- +- ucb1x00_enable(ts->ucb); +- ucb1x00_free_irq(ts->ucb, UCB_IRQ_TSPX, ts); +- ucb1x00_reg_write(ts->ucb, UCB_TS_CR, 0); +- ucb1x00_disable(ts->ucb); +-} +- +-#ifdef CONFIG_PM +-static int ucb1x00_ts_resume(struct ucb1x00_dev *dev) +-{ +- struct ucb1x00_ts *ts = dev->priv; +- +- if (ts->rtask != NULL) { +- /* +- * Restart the TS thread to ensure the +- * TS interrupt mode is set up again +- * after sleep. +- */ +- ts->restart = 1; +- wake_up(&ts->irq_wait); +- } +- return 0; +-} +-#else +-#define ucb1x00_ts_resume NULL +-#endif +- +- +-/* +- * Initialisation. +- */ +-static int ucb1x00_ts_add(struct ucb1x00_dev *dev) +-{ +- struct ucb1x00_ts *ts; +- struct input_dev *idev; +- int err; +- +- ts = kzalloc(sizeof(struct ucb1x00_ts), GFP_KERNEL); +- idev = input_allocate_device(); +- if (!ts || !idev) { +- err = -ENOMEM; +- goto fail; +- } +- +- ts->ucb = dev->ucb; +- ts->idev = idev; +- ts->adcsync = adcsync ? UCB_SYNC : UCB_NOSYNC; +- +- idev->name = "Touchscreen panel"; +- idev->id.product = ts->ucb->id; +- idev->open = ucb1x00_ts_open; +- idev->close = ucb1x00_ts_close; +- +- __set_bit(EV_ABS, idev->evbit); +- __set_bit(ABS_X, idev->absbit); +- __set_bit(ABS_Y, idev->absbit); +- __set_bit(ABS_PRESSURE, idev->absbit); +- +- input_set_drvdata(idev, ts); +- +- err = input_register_device(idev); +- if (err) +- goto fail; +- +- dev->priv = ts; +- +- return 0; +- +- fail: +- input_free_device(idev); +- kfree(ts); +- return err; +-} +- +-static void ucb1x00_ts_remove(struct ucb1x00_dev *dev) +-{ +- struct ucb1x00_ts *ts = dev->priv; +- +- input_unregister_device(ts->idev); +- kfree(ts); +-} +- +-static struct ucb1x00_driver ucb1x00_ts_driver = { +- .add = ucb1x00_ts_add, +- .remove = ucb1x00_ts_remove, +- .resume = ucb1x00_ts_resume, +-}; +- +-static int __init ucb1x00_ts_init(void) +-{ +- return ucb1x00_register_driver(&ucb1x00_ts_driver); +-} +- +-static void __exit ucb1x00_ts_exit(void) +-{ +- ucb1x00_unregister_driver(&ucb1x00_ts_driver); +-} +- +-module_param(adcsync, int, 0444); +-module_init(ucb1x00_ts_init); +-module_exit(ucb1x00_ts_exit); +- +-MODULE_AUTHOR("Russell King <rmk@arm.linux.org.uk>"); +-MODULE_DESCRIPTION("UCB1x00 touchscreen driver"); +-MODULE_LICENSE("GPL"); +-- +1.5.6.5 + diff --git a/packages/linux/linux-2.6.28/collie/0013-add-collie-touchscreen-driver.patch b/packages/linux/linux-2.6.28/collie/0013-add-collie-touchscreen-driver.patch new file mode 100644 index 0000000000..92159d5649 --- /dev/null +++ b/packages/linux/linux-2.6.28/collie/0013-add-collie-touchscreen-driver.patch @@ -0,0 +1,528 @@ +From 40787f3e48d1cc1e63dc5dd6aeda720f688fc05e Mon Sep 17 00:00:00 2001 +From: Thomas Kunze <thommycheck@gmx.de> +Date: Mon, 20 Oct 2008 17:44:23 +0200 +Subject: [PATCH 13/23] add collie touchscreen driver + +--- + drivers/input/touchscreen/Kconfig | 6 + + drivers/input/touchscreen/Makefile | 1 + + drivers/input/touchscreen/collie-ts.c | 449 +++++++++++++++++++++++++++++++++ + drivers/mfd/Makefile | 1 - + include/linux/mfd/ucb1x00.h | 3 + + 5 files changed, 459 insertions(+), 1 deletions(-) + create mode 100644 drivers/input/touchscreen/collie-ts.c + +diff --git a/drivers/input/touchscreen/Kconfig b/drivers/input/touchscreen/Kconfig +index 3ac8cd6..a9f89ed 100644 +--- a/drivers/input/touchscreen/Kconfig ++++ b/drivers/input/touchscreen/Kconfig +@@ -228,6 +228,12 @@ config TOUCHSCREEN_UCB1200_TS + This enabled support for the Pilips UCB1200 touchscreen interface + and compatible. + ++config TOUCHSCREEN_COLLIE_TS ++ tristate "Touchscreen collie support" ++ depends on MCP_UCB1200 && INPUT && !MCP_UCB1200_TS ++ help ++ Driver for touchscreen on collie - sharp sl-5500. ++ + config TOUCHSCREEN_UCB1400 + tristate "Philips UCB1400 touchscreen" + depends on AC97_BUS +diff --git a/drivers/input/touchscreen/Makefile b/drivers/input/touchscreen/Makefile +index 77ba930..77715cd 100644 +--- a/drivers/input/touchscreen/Makefile ++++ b/drivers/input/touchscreen/Makefile +@@ -26,6 +26,7 @@ obj-$(CONFIG_TOUCHSCREEN_TOUCHIT213) += touchit213.o + obj-$(CONFIG_TOUCHSCREEN_TOUCHRIGHT) += touchright.o + obj-$(CONFIG_TOUCHSCREEN_TOUCHWIN) += touchwin.o + obj-$(CONFIG_TOUCHSCREEN_UCB1200_TS) += ucb1x00-ts.o ++obj-$(CONFIG_TOUCHSCREEN_COLLIE_TS) += collie-ts.o + obj-$(CONFIG_TOUCHSCREEN_UCB1400) += ucb1400_ts.o + obj-$(CONFIG_TOUCHSCREEN_WM97XX) += wm97xx-ts.o + wm97xx-ts-$(CONFIG_TOUCHSCREEN_WM9705) += wm9705.o +diff --git a/drivers/input/touchscreen/collie-ts.c b/drivers/input/touchscreen/collie-ts.c +new file mode 100644 +index 0000000..c7c0272 +--- /dev/null ++++ b/drivers/input/touchscreen/collie-ts.c +@@ -0,0 +1,449 @@ ++/* ++ * Touchscreen driver for UCB1x00-based touchscreens ++ * ++ * Copyright (C) 2001 Russell King, All Rights Reserved. ++ * Copyright (C) 2005 Pavel Machek ++ * ++ * 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. ++ * ++ * 21-Jan-2002 <jco@ict.es> : ++ * ++ * Added support for synchronous A/D mode. This mode is useful to ++ * avoid noise induced in the touchpanel by the LCD, provided that ++ * the UCB1x00 has a valid LCD sync signal routed to its ADCSYNC pin. ++ * It is important to note that the signal connected to the ADCSYNC ++ * pin should provide pulses even when the LCD is blanked, otherwise ++ * a pen touch needed to unblank the LCD will never be read. ++ */ ++#include <linux/module.h> ++#include <linux/moduleparam.h> ++#include <linux/init.h> ++#include <linux/smp.h> ++#include <linux/smp_lock.h> ++#include <linux/sched.h> ++#include <linux/completion.h> ++#include <linux/delay.h> ++#include <linux/string.h> ++#include <linux/input.h> ++#include <linux/device.h> ++#include <linux/freezer.h> ++#include <linux/slab.h> ++#include <linux/kthread.h> ++#include <linux/semaphore.h> ++ ++#include <mach/dma.h> ++#include <mach/collie.h> ++#include <asm/mach-types.h> ++ ++#include <linux/mfd/ucb1x00.h> ++ ++struct ucb1x00_ts { ++ struct input_dev *idev; ++ struct ucb1x00 *ucb; ++ ++ wait_queue_head_t irq_wait; ++ struct task_struct *rtask; ++ u16 x_res; ++ u16 y_res; ++ ++ unsigned int adcsync:1; ++}; ++ ++static int adcsync; ++ ++/********************************** ++ ++ ................ ++ . . = 340 ++ . . ++ . ^. ++ . ^. ++ . ^. ++ . ^. ++ . . ++ . X. = 10 ++ . <<<<<<<< Y . ++ ................ ++ . Sharp =200 ++ . . ++ . - O - . ++ . . ++ ................ ++ ++**********************************/ ++ ++ ++static inline void ucb1x00_ts_evt_add(struct ucb1x00_ts *ts, u16 pressure, u16 x, u16 y) ++{ ++ struct input_dev *idev = ts->idev; ++ ++ input_report_abs(idev, ABS_X, x); ++ input_report_abs(idev, ABS_Y, y); ++ input_report_abs(idev, ABS_PRESSURE, pressure); ++ input_report_key(idev, BTN_TOUCH, 1); ++ input_sync(idev); ++} ++ ++static inline void ucb1x00_ts_event_release(struct ucb1x00_ts *ts) ++{ ++ struct input_dev *idev = ts->idev; ++ ++ input_report_abs(idev, ABS_PRESSURE, 0); ++ input_report_key(idev, BTN_TOUCH, 0); ++ input_sync(idev); ++} ++ ++/* ++ * Switch to interrupt mode. This set touchscreen to interrupt ++ * mode, so that chip is able to send interrupt. ++ */ ++static inline void ucb1x00_ts_mode_int(struct ucb1x00_ts *ts) ++{ ++ ucb1x00_reg_write(ts->ucb, UCB_TS_CR, ++ UCB_TS_CR_TSMX_POW | UCB_TS_CR_TSPX_POW | ++ UCB_TS_CR_TSMY_GND | UCB_TS_CR_TSPY_GND | ++ UCB_TS_CR_MODE_INT); ++} ++ ++/* ++ * Switch to pressure mode, and read pressure. We don't need to wait ++ * here, since both plates are being driven. ++ * ++ * set_read_pressure() in sharp code ++ */ ++static inline void ucb1x00_ts_read_pressure(struct ucb1x00_ts *ts) ++{ ++ ucb1x00_io_write(ts->ucb, COLLIE_TC35143_GPIO_TBL_CHK, 0); ++ ucb1x00_reg_write(ts->ucb, UCB_TS_CR, ++ UCB_TS_CR_TSPX_POW | UCB_TS_CR_TSMX_POW | ++ UCB_TS_CR_MODE_POS | UCB_TS_CR_BIAS_ENA); ++ ++ ucb1x00_reg_write(ts->ucb, UCB_ADC_CR, ts->ucb->adc_cr | ++ UCB_ADC_INP_AD2 | ++ UCB_ADC_SYNC_ENA); ++ udelay(100); ++ ucb1x00_reg_write(ts->ucb, UCB_ADC_CR, ts->ucb->adc_cr | ++ UCB_ADC_INP_AD2 | ++ UCB_ADC_SYNC_ENA | UCB_ADC_START); ++} ++ ++/* ++ * Switch to X position mode and measure Y plate. We switch the plate ++ * configuration in pressure mode, then switch to position mode. This ++ * gives a faster response time. Even so, we need to wait about 55us ++ * for things to stabilise. ++ */ ++static inline void ucb1x00_ts_read_xpos(struct ucb1x00_ts *ts) ++{ ++ ucb1x00_io_write(ts->ucb, 0, COLLIE_TC35143_GPIO_TBL_CHK); ++ ucb1x00_reg_write(ts->ucb, UCB_TS_CR, ++ UCB_TS_CR_TSMX_GND | UCB_TS_CR_TSPX_POW | ++ UCB_TS_CR_MODE_POS | UCB_TS_CR_BIAS_ENA); ++ ++ ++ ucb1x00_reg_write(ts->ucb, UCB_ADC_CR, ts->ucb->adc_cr | ++ UCB_ADC_INP_TSPY | UCB_ADC_SYNC_ENA); ++ udelay(100); ++ ucb1x00_reg_write(ts->ucb, UCB_ADC_CR, ts->ucb->adc_cr | ++ UCB_ADC_INP_TSPY | UCB_ADC_SYNC_ENA | ++ UCB_ADC_START); ++} ++ ++/* ++ * Switch to Y position mode and measure X plate. We switch the plate ++ * configuration in pressure mode, then switch to position mode. This ++ * gives a faster response time. Even so, we need to wait about 55us ++ * for things to stabilise. ++ */ ++static inline void ucb1x00_ts_read_ypos(struct ucb1x00_ts *ts) ++{ ++ ucb1x00_io_write(ts->ucb, 0, COLLIE_TC35143_GPIO_TBL_CHK); ++ ++ ucb1x00_reg_write(ts->ucb, UCB_TS_CR, ++ UCB_TS_CR_TSMY_GND | UCB_TS_CR_TSPY_POW | ++ UCB_TS_CR_MODE_POS | UCB_TS_CR_BIAS_ENA); ++ ++ ++ ucb1x00_reg_write(ts->ucb, UCB_ADC_CR, ts->ucb->adc_cr | ++ UCB_ADC_INP_TSPX | UCB_ADC_SYNC_ENA); ++ udelay(100); ++ ucb1x00_reg_write(ts->ucb, UCB_ADC_CR, ts->ucb->adc_cr | ++ UCB_ADC_INP_TSPX | UCB_ADC_SYNC_ENA | ++ UCB_ADC_START); ++} ++ ++/* ++ * Switch to X plate resistance mode. Set MX to ground, PX to ++ * supply. Measure current. ++ */ ++static inline unsigned int ucb1x00_ts_read_xres(struct ucb1x00_ts *ts) ++{ ++ ucb1x00_reg_write(ts->ucb, UCB_TS_CR, ++ UCB_TS_CR_TSMX_GND | UCB_TS_CR_TSPX_POW | ++ UCB_TS_CR_MODE_PRES | UCB_TS_CR_BIAS_ENA); ++ return ucb1x00_adc_read(ts->ucb, 0, ts->adcsync); ++} ++ ++/* ++ * Switch to Y plate resistance mode. Set MY to ground, PY to ++ * supply. Measure current. ++ */ ++static inline unsigned int ucb1x00_ts_read_yres(struct ucb1x00_ts *ts) ++{ ++ ucb1x00_reg_write(ts->ucb, UCB_TS_CR, ++ UCB_TS_CR_TSMY_GND | UCB_TS_CR_TSPY_POW | ++ UCB_TS_CR_MODE_PRES | UCB_TS_CR_BIAS_ENA); ++ return ucb1x00_adc_read(ts->ucb, 0, ts->adcsync); ++} ++ ++/* ++ * This is a RT kernel thread that handles the ADC accesses ++ * (mainly so we can use semaphores in the UCB1200 core code ++ * to serialise accesses to the ADC). ++ */ ++static int ucb1x00_thread(void *_ts) ++{ ++ struct ucb1x00_ts *ts = _ts; ++ struct task_struct *tsk = current; ++ DECLARE_WAITQUEUE(wait, tsk); ++ int state; ++ ++ /* ++ * We could run as a real-time thread. However, thus far ++ * this doesn't seem to be necessary. ++ */ ++ ++ add_wait_queue(&ts->irq_wait, &wait); ++ ++ while (!kthread_should_stop()) { ++ unsigned int data[3]; ++ ++ for (state=0; state<3; state++) { ++ ++ ucb1x00_adc_enable(ts->ucb); ++ ucb1x00_enable_irq(ts->ucb, UCB_IRQ_ADC, UCB_FALLING); ++ switch (state) { ++ /* Order matters here; last measurement seems to be more noisy then the ++ rest, and we care about pressure least */ ++ case 2: ucb1x00_ts_read_pressure(ts); ++ break; ++ case 0: ucb1x00_ts_read_ypos(ts); ++ break; ++ case 1: ucb1x00_ts_read_xpos(ts); ++ break; ++ } ++ /* wait for adc */ ++ try_to_freeze(); ++ schedule_timeout(1000 * HZ); ++ ucb1x00_disable_irq(ts->ucb, UCB_IRQ_ADC, UCB_FALLING); ++ data[state] = UCB_ADC_DAT(ucb1x00_reg_read(ts->ucb, UCB_ADC_DATA)); ++ ucb1x00_adc_disable(ts->ucb); ++ } ++ ++ /* If not pressed any more, try to sleep! */ ++ if (data[2] < 300) { ++ set_task_state(tsk, TASK_INTERRUPTIBLE); ++ ucb1x00_enable_irq(ts->ucb, UCB_IRQ_TSPX, UCB_RISING); ++ ucb1x00_ts_mode_int(ts); ++ ucb1x00_disable(ts->ucb); ++ ucb1x00_ts_event_release(ts); ++ try_to_freeze(); ++ schedule_timeout(1000 * HZ); ++ ucb1x00_disable_irq(ts->ucb, UCB_IRQ_TSPX, UCB_RISING); ++ ucb1x00_enable(ts->ucb); ++ } else { ++ ucb1x00_ts_evt_add(ts, data[2], data[1], data[0]); ++ } ++ ucb1x00_disable(ts->ucb); ++ msleep(20); ++ ucb1x00_enable(ts->ucb); ++ } ++ ++ remove_wait_queue(&ts->irq_wait, &wait); ++ ++ ts->rtask = NULL; ++ return 0; ++} ++ ++/* ++ * We only detect touch screen _touches_ with this interrupt ++ * handler, and even then we just schedule our task. ++ */ ++static void ucb1x00_ts_irq(int idx, void *id) ++{ ++ struct ucb1x00_ts *ts = id; ++ wake_up(&ts->irq_wait); ++} ++ ++static void ucb1x00_adc_irq(int idx, void *id) ++{ ++ struct ucb1x00_ts *ts = id; ++ wake_up(&ts->irq_wait); ++} ++ ++static int ucb1x00_ts_open(struct input_dev *idev) ++{ ++ struct ucb1x00_ts *ts = input_get_drvdata(idev); ++ int ret = 0; ++ ++ BUG_ON(ts->rtask); ++ ++ init_waitqueue_head(&ts->irq_wait); ++ ++ ret = ucb1x00_hook_irq(ts->ucb, UCB_IRQ_TSPX, ucb1x00_ts_irq, ts); ++ if (ret < 0) ++ return ret; ++ ++ ret = ucb1x00_hook_irq(ts->ucb, UCB_IRQ_ADC, ucb1x00_adc_irq, ts); ++ if (ret < 0) { ++ ucb1x00_free_irq(ts->ucb, UCB_IRQ_TSPX, ts); ++ return ret; ++ } ++ ++ ucb1x00_enable_irq(ts->ucb, UCB_IRQ_TSPX, UCB_RISING); ++ ++ /* ++ * If we do this at all, we should allow the user to ++ * measure and read the X and Y resistance at any time. ++ */ ++ ucb1x00_adc_enable(ts->ucb); ++ ts->x_res = ucb1x00_ts_read_xres(ts); ++ ts->y_res = ucb1x00_ts_read_yres(ts); ++ ucb1x00_adc_disable(ts->ucb); ++ ++ if (machine_is_collie()) { ++ ucb1x00_io_set_dir(ts->ucb, 0, COLLIE_TC35143_GPIO_TBL_CHK); ++ } ++ ++ ts->rtask = kthread_run(ucb1x00_thread, ts, "ktsd"); ++ if (!IS_ERR(ts->rtask)) { ++ ret = 0; ++ } else { ++ ucb1x00_free_irq(ts->ucb, UCB_IRQ_TSPX, ts); ++ ts->rtask = NULL; ++ ret = -EFAULT; ++ } ++ ++ return ret; ++} ++ ++/* ++ * Release touchscreen resources. Disable IRQs. ++ */ ++static void ucb1x00_ts_close(struct input_dev *idev) ++{ ++ struct ucb1x00_ts *ts = input_get_drvdata(idev); ++ ++ if (ts->rtask) ++ kthread_stop(ts->rtask); ++ ++ ucb1x00_enable(ts->ucb); ++ ucb1x00_free_irq(ts->ucb, UCB_IRQ_TSPX, ts); ++ ucb1x00_free_irq(ts->ucb, UCB_IRQ_ADC, ts); ++ ucb1x00_reg_write(ts->ucb, UCB_TS_CR, 0); ++ ucb1x00_disable(ts->ucb); ++} ++ ++#ifdef CONFIG_PM ++static int ucb1x00_ts_resume(struct ucb1x00_dev *dev) ++{ ++ struct ucb1x00_ts *ts = dev->priv; ++ ++ if (ts->rtask != NULL) { ++ /* ++ * Restart the TS thread to ensure the ++ * TS interrupt mode is set up again ++ * after sleep. ++ */ ++ wake_up(&ts->irq_wait); ++ } ++ return 0; ++} ++#else ++#define ucb1x00_ts_resume NULL ++#endif ++ ++ ++/* ++ * Initialisation. ++ */ ++static int ucb1x00_ts_add(struct ucb1x00_dev *dev) ++{ ++ struct ucb1x00_ts *ts; ++ struct input_dev *idev; ++ int err; ++ ++ ts = kzalloc(sizeof(struct ucb1x00_ts), GFP_KERNEL); ++ idev = input_allocate_device(); ++ if (!ts || !idev) { ++ err = -ENOMEM; ++ goto fail; ++ } ++ ++ ts->ucb = dev->ucb; ++ ts->idev = idev; ++ ts->adcsync = adcsync ? UCB_SYNC : UCB_NOSYNC; ++ ++ input_set_drvdata(idev, ts); ++ idev->name = "Touchscreen panel"; ++ idev->id.product = ts->ucb->id; ++ idev->open = ucb1x00_ts_open; ++ idev->close = ucb1x00_ts_close; ++ ++ __set_bit(EV_ABS, idev->evbit); ++ __set_bit(ABS_X, idev->absbit); ++ __set_bit(ABS_Y, idev->absbit); ++ __set_bit(ABS_PRESSURE, idev->absbit); ++ ++ input_set_abs_params(ts->idev, ABS_X, 0, 450, 0, 0); ++ input_set_abs_params(ts->idev, ABS_Y, 200, 800, 0, 0); ++ input_set_abs_params(ts->idev, ABS_PRESSURE, 400, 800, 0, 0); ++ ++ ++ err = input_register_device(idev); ++ if (err) ++ goto fail; ++ ++ dev->priv = ts; ++ ++ return 0; ++ ++ fail: ++ input_free_device(idev); ++ kfree(ts); ++ return err; ++} ++ ++static void ucb1x00_ts_remove(struct ucb1x00_dev *dev) ++{ ++ struct ucb1x00_ts *ts = dev->priv; ++ ++ input_unregister_device(ts->idev); ++ kfree(ts); ++} ++ ++static struct ucb1x00_driver ucb1x00_ts_driver = { ++ .add = ucb1x00_ts_add, ++ .remove = ucb1x00_ts_remove, ++ .resume = ucb1x00_ts_resume, ++}; ++ ++static int __init ucb1x00_ts_init(void) ++{ ++ return ucb1x00_register_driver(&ucb1x00_ts_driver); ++} ++ ++static void __exit ucb1x00_ts_exit(void) ++{ ++ ucb1x00_unregister_driver(&ucb1x00_ts_driver); ++} ++ ++module_param(adcsync, int, 0444); ++module_init(ucb1x00_ts_init); ++module_exit(ucb1x00_ts_exit); ++ ++MODULE_AUTHOR("Russell King <rmk@arm.linux.org.uk>"); ++MODULE_DESCRIPTION("UCB1x00 touchscreen driver"); ++MODULE_LICENSE("GPL"); +diff --git a/drivers/mfd/Makefile b/drivers/mfd/Makefile +index 4981aff..7bbba6e 100644 +--- a/drivers/mfd/Makefile ++++ b/drivers/mfd/Makefile +@@ -24,7 +24,6 @@ obj-$(CONFIG_MFD_CORE) += mfd-core.o + obj-$(CONFIG_MCP) += mcp-core.o + obj-$(CONFIG_MCP_SA11X0) += mcp-sa11x0.o + obj-$(CONFIG_MCP_UCB1200) += ucb1x00-core.o +- + ifeq ($(CONFIG_SA1100_ASSABET),y) + obj-$(CONFIG_MCP_UCB1200) += ucb1x00-assabet.o + endif +diff --git a/include/linux/mfd/ucb1x00.h b/include/linux/mfd/ucb1x00.h +index eac3463..70eb763 100644 +--- a/include/linux/mfd/ucb1x00.h ++++ b/include/linux/mfd/ucb1x00.h +@@ -35,7 +35,10 @@ + #define UCB_IE_TCLIP (1 << 14) + #define UCB_IE_ACLIP (1 << 15) + ++/* UCB1200 irqs */ ++#define UCB_IRQ_ADC 11 + #define UCB_IRQ_TSPX 12 ++#define UCB_IRQ_TSMX 13 + + #define UCB_TC_A 0x05 + #define UCB_TC_A_LOOP (1 << 7) /* UCB1200 */ +-- +1.5.6.5 + diff --git a/packages/linux/linux-2.6.28/collie/0014-collie-locomo-led-change-default-trigger.patch b/packages/linux/linux-2.6.28/collie/0014-collie-locomo-led-change-default-trigger.patch new file mode 100644 index 0000000000..4d2828e53a --- /dev/null +++ b/packages/linux/linux-2.6.28/collie/0014-collie-locomo-led-change-default-trigger.patch @@ -0,0 +1,27 @@ +From 047e4432e024fbec1e308e3c496822f52ce63ecb Mon Sep 17 00:00:00 2001 +From: Thomas Kunze <thommycheck@gmx.de> +Date: Tue, 10 Feb 2009 13:21:42 +0100 +Subject: [PATCH 14/23] collie: locomo-led change default trigger + +Collie uses now the powersupply framework. Change the +default led-trigger of locomo-led to reflect that. +--- + drivers/leds/leds-locomo.c | 2 +- + 1 files changed, 1 insertions(+), 1 deletions(-) + +diff --git a/drivers/leds/leds-locomo.c b/drivers/leds/leds-locomo.c +index 5d91362..1f7c10f 100644 +--- a/drivers/leds/leds-locomo.c ++++ b/drivers/leds/leds-locomo.c +@@ -44,7 +44,7 @@ static void locomoled_brightness_set1(struct led_classdev *led_cdev, + + static struct led_classdev locomo_led0 = { + .name = "locomo:amber:charge", +- .default_trigger = "sharpsl-charge", ++ .default_trigger = "main-battery-charging", + .brightness_set = locomoled_brightness_set0, + }; + +-- +1.5.6.5 + diff --git a/packages/linux/linux-2.6.28/collie/0015-SA1100-make-gpio_to_irq-and-reverse-a-macro.patch b/packages/linux/linux-2.6.28/collie/0015-SA1100-make-gpio_to_irq-and-reverse-a-macro.patch new file mode 100644 index 0000000000..99d0314a46 --- /dev/null +++ b/packages/linux/linux-2.6.28/collie/0015-SA1100-make-gpio_to_irq-and-reverse-a-macro.patch @@ -0,0 +1,43 @@ +From 87e4ecb2702d0d1a800da0ba81cd867b0f150410 Mon Sep 17 00:00:00 2001 +From: Thomas Kunze <thommycheck@gmx.de> +Date: Mon, 9 Feb 2009 23:14:44 +0100 +Subject: [PATCH 15/23] SA1100: make gpio_to_irq and reverse a macro + +The function can't be used for static initialisations so +convert them to macros. +--- + arch/arm/mach-sa1100/include/mach/gpio.h | 19 ++++--------------- + 1 files changed, 4 insertions(+), 15 deletions(-) + +diff --git a/arch/arm/mach-sa1100/include/mach/gpio.h b/arch/arm/mach-sa1100/include/mach/gpio.h +index 582a0c9..7befc10 100644 +--- a/arch/arm/mach-sa1100/include/mach/gpio.h ++++ b/arch/arm/mach-sa1100/include/mach/gpio.h +@@ -49,20 +49,9 @@ static inline void gpio_set_value(unsigned gpio, int value) + + #define gpio_cansleep __gpio_cansleep + +-static inline unsigned gpio_to_irq(unsigned gpio) +-{ +- if (gpio < 11) +- return IRQ_GPIO0 + gpio; +- else +- return IRQ_GPIO11 - 11 + gpio; +-} +- +-static inline unsigned irq_to_gpio(unsigned irq) +-{ +- if (irq < IRQ_GPIO11_27) +- return irq - IRQ_GPIO0; +- else +- return irq - IRQ_GPIO11 + 11; +-} ++#define gpio_to_irq(gpio) ((gpio < 11) ? (IRQ_GPIO0 + gpio) : \ ++ (IRQ_GPIO11 - 11 + gpio)) ++#define irq_to_gpio(irq) ((irq < IRQ_GPIO11_27) ? (irq - IRQ_GPIO0) : \ ++ (irq - IRQ_GPIO11 + 11)) + + #endif +-- +1.5.6.5 + diff --git a/packages/linux/linux-2.6.28/collie/0016-add-gpiolib-support-to-ucb1x00.patch b/packages/linux/linux-2.6.28/collie/0016-add-gpiolib-support-to-ucb1x00.patch new file mode 100644 index 0000000000..aab08a66c9 --- /dev/null +++ b/packages/linux/linux-2.6.28/collie/0016-add-gpiolib-support-to-ucb1x00.patch @@ -0,0 +1,242 @@ +From 1de1b5c2860d889a9422f187ad90d8e38b2431fd Mon Sep 17 00:00:00 2001 +From: Thomas Kunze <thommycheck@gmx.de> +Date: Tue, 10 Feb 2009 14:50:56 +0100 +Subject: [PATCH 16/23] add gpiolib support to ucb1x00 + +The old access methods to the gpios will be removed when +all users has been converted. (mainly ucb1x00-ts) +--- + arch/arm/mach-sa1100/include/mach/mcp.h | 1 + + drivers/mfd/mcp-sa11x0.c | 1 + + drivers/mfd/ucb1x00-core.c | 87 ++++++++++++++++++++++++++++++- + include/linux/mfd/mcp.h | 1 + + include/linux/mfd/ucb1x00.h | 3 + + 5 files changed, 91 insertions(+), 2 deletions(-) + +diff --git a/arch/arm/mach-sa1100/include/mach/mcp.h b/arch/arm/mach-sa1100/include/mach/mcp.h +index fb8b09a..ed1a331 100644 +--- a/arch/arm/mach-sa1100/include/mach/mcp.h ++++ b/arch/arm/mach-sa1100/include/mach/mcp.h +@@ -16,6 +16,7 @@ struct mcp_plat_data { + u32 mccr0; + u32 mccr1; + unsigned int sclk_rate; ++ int gpio_base; + }; + + #endif +diff --git a/drivers/mfd/mcp-sa11x0.c b/drivers/mfd/mcp-sa11x0.c +index 88c81cf..dfa59eb 100644 +--- a/drivers/mfd/mcp-sa11x0.c ++++ b/drivers/mfd/mcp-sa11x0.c +@@ -163,6 +163,7 @@ static int mcp_sa11x0_probe(struct platform_device *pdev) + mcp->dma_audio_wr = DMA_Ser4MCP0Wr; + mcp->dma_telco_rd = DMA_Ser4MCP1Rd; + mcp->dma_telco_wr = DMA_Ser4MCP1Wr; ++ mcp->gpio_base = data->gpio_base; + + platform_set_drvdata(pdev, mcp); + +diff --git a/drivers/mfd/ucb1x00-core.c b/drivers/mfd/ucb1x00-core.c +index bc2c1ba..b9c3f3d 100644 +--- a/drivers/mfd/ucb1x00-core.c ++++ b/drivers/mfd/ucb1x00-core.c +@@ -25,11 +25,11 @@ + #include <linux/device.h> + #include <linux/mutex.h> + #include <linux/mfd/ucb1x00.h> ++#include <linux/gpio.h> + + #include <asm/dma.h> + #include <mach/hardware.h> + +- + static DEFINE_MUTEX(ucb1x00_mutex); + static LIST_HEAD(ucb1x00_drivers); + static LIST_HEAD(ucb1x00_devices); +@@ -107,6 +107,60 @@ unsigned int ucb1x00_io_read(struct ucb1x00 *ucb) + return ucb1x00_reg_read(ucb, UCB_IO_DATA); + } + ++static void ucb1x00_gpio_set(struct gpio_chip *chip, unsigned offset, int value) ++{ ++ struct ucb1x00 *ucb = container_of(chip, struct ucb1x00, gpio); ++ unsigned long flags; ++ ++ spin_lock_irqsave(&ucb->io_lock, flags); ++ if (value) ++ ucb->io_out |= 1 << offset; ++ else ++ ucb->io_out &= ~(1 << offset); ++ ++ ucb1x00_reg_write(ucb, UCB_IO_DATA, ucb->io_out); ++ spin_unlock_irqrestore(&ucb->io_lock, flags); ++} ++ ++static int ucb1x00_gpio_get(struct gpio_chip *chip, unsigned offset) ++{ ++ struct ucb1x00 *ucb = container_of(chip, struct ucb1x00, gpio); ++ return ucb1x00_reg_read(ucb, UCB_IO_DATA) & (1 << offset); ++} ++ ++static int ucb1x00_gpio_direction_input(struct gpio_chip *chip, unsigned offset) ++{ ++ struct ucb1x00 *ucb = container_of(chip, struct ucb1x00, gpio); ++ unsigned long flags; ++ ++ spin_lock_irqsave(&ucb->io_lock, flags); ++ ucb->io_dir &= ~(1 << offset); ++ ucb1x00_reg_write(ucb, UCB_IO_DIR, ucb->io_dir); ++ spin_unlock_irqrestore(&ucb->io_lock, flags); ++ ++ return 0; ++} ++ ++static int ucb1x00_gpio_direction_output(struct gpio_chip *chip, unsigned offset ++ , int value) ++{ ++ struct ucb1x00 *ucb = container_of(chip, struct ucb1x00, gpio); ++ unsigned long flags; ++ ++ spin_lock_irqsave(&ucb->io_lock, flags); ++ ucb->io_dir |= (1 << offset); ++ ucb1x00_reg_write(ucb, UCB_IO_DIR, ucb->io_dir); ++ ++ if (value) ++ ucb->io_out |= 1 << offset; ++ else ++ ucb->io_out &= ~(1 << offset); ++ ucb1x00_reg_write(ucb, UCB_IO_DATA, ucb->io_out); ++ spin_unlock_irqrestore(&ucb->io_lock, flags); ++ ++ return 0; ++} ++ + /* + * UCB1300 data sheet says we must: + * 1. enable ADC => 5us (including reference startup time) +@@ -475,6 +529,7 @@ static int ucb1x00_probe(struct mcp *mcp) + struct ucb1x00_driver *drv; + unsigned int id; + int ret = -ENODEV; ++ int temp; + + mcp_enable(mcp); + id = mcp_reg_read(mcp, UCB_ID); +@@ -507,12 +562,27 @@ static int ucb1x00_probe(struct mcp *mcp) + goto err_free; + } + ++ ucb->gpio.base = -1; ++ if (mcp->gpio_base != 0) { ++ ucb->gpio.label = dev_name(&ucb->dev); ++ ucb->gpio.base = mcp->gpio_base; ++ ucb->gpio.ngpio = 10; ++ ucb->gpio.set = ucb1x00_gpio_set; ++ ucb->gpio.get = ucb1x00_gpio_get; ++ ucb->gpio.direction_input = ucb1x00_gpio_direction_input; ++ ucb->gpio.direction_output = ucb1x00_gpio_direction_output; ++ ret = gpiochip_add(&ucb->gpio); ++ if (ret) ++ goto err_free; ++ } else ++ dev_info(&ucb->dev, "gpio_base not set so no gpiolib support"); ++ + ret = request_irq(ucb->irq, ucb1x00_irq, IRQF_TRIGGER_RISING, + "UCB1x00", ucb); + if (ret) { + printk(KERN_ERR "ucb1x00: unable to grab irq%d: %d\n", + ucb->irq, ret); +- goto err_free; ++ goto err_gpio; + } + + mcp_set_drvdata(mcp, ucb); +@@ -521,6 +591,7 @@ static int ucb1x00_probe(struct mcp *mcp) + if (ret) + goto err_irq; + ++ + INIT_LIST_HEAD(&ucb->devs); + mutex_lock(&ucb1x00_mutex); + list_add(&ucb->node, &ucb1x00_devices); +@@ -528,10 +599,14 @@ static int ucb1x00_probe(struct mcp *mcp) + ucb1x00_add_dev(ucb, drv); + } + mutex_unlock(&ucb1x00_mutex); ++ + goto out; + + err_irq: + free_irq(ucb->irq, ucb); ++ err_gpio: ++ if (ucb->gpio.base != -1) ++ temp = gpiochip_remove(&ucb->gpio); + err_free: + kfree(ucb); + err_disable: +@@ -544,6 +619,7 @@ static void ucb1x00_remove(struct mcp *mcp) + { + struct ucb1x00 *ucb = mcp_get_drvdata(mcp); + struct list_head *l, *n; ++ int ret; + + mutex_lock(&ucb1x00_mutex); + list_del(&ucb->node); +@@ -553,6 +629,12 @@ static void ucb1x00_remove(struct mcp *mcp) + } + mutex_unlock(&ucb1x00_mutex); + ++ if (ucb->gpio.base != -1) { ++ ret = gpiochip_remove(&ucb->gpio); ++ if (ret) ++ dev_err(&ucb->dev, "Can't remove gpio chip: %d\n", ret); ++ } ++ + free_irq(ucb->irq, ucb); + device_unregister(&ucb->dev); + } +@@ -603,6 +685,7 @@ static int ucb1x00_resume(struct mcp *mcp) + struct ucb1x00 *ucb = mcp_get_drvdata(mcp); + struct ucb1x00_dev *dev; + ++ ucb1x00_reg_write(ucb, UCB_IO_DIR, ucb->io_dir); + mutex_lock(&ucb1x00_mutex); + list_for_each_entry(dev, &ucb->devs, dev_node) { + if (dev->drv->resume) +diff --git a/include/linux/mfd/mcp.h b/include/linux/mfd/mcp.h +index be95e09..ee49670 100644 +--- a/include/linux/mfd/mcp.h ++++ b/include/linux/mfd/mcp.h +@@ -26,6 +26,7 @@ struct mcp { + dma_device_t dma_telco_rd; + dma_device_t dma_telco_wr; + struct device attached_device; ++ int gpio_base; + }; + + struct mcp_ops { +diff --git a/include/linux/mfd/ucb1x00.h b/include/linux/mfd/ucb1x00.h +index 70eb763..b13171e 100644 +--- a/include/linux/mfd/ucb1x00.h ++++ b/include/linux/mfd/ucb1x00.h +@@ -11,6 +11,8 @@ + #define UCB1200_H + + #include <linux/mfd/mcp.h> ++#include <linux/gpio.h> ++ + #define UCB_IO_DATA 0x00 + #define UCB_IO_DIR 0x01 + +@@ -126,6 +128,7 @@ struct ucb1x00 { + struct device dev; + struct list_head node; + struct list_head devs; ++ struct gpio_chip gpio; + }; + + struct ucb1x00_driver; +-- +1.5.6.5 + diff --git a/packages/linux/linux-2.6.28/collie/0017-collie-convert-to-gpiolib-for-ucb1x00.patch b/packages/linux/linux-2.6.28/collie/0017-collie-convert-to-gpiolib-for-ucb1x00.patch new file mode 100644 index 0000000000..c08c21a977 --- /dev/null +++ b/packages/linux/linux-2.6.28/collie/0017-collie-convert-to-gpiolib-for-ucb1x00.patch @@ -0,0 +1,137 @@ +From c1bf0dcce68a5e01213e18c9ca1fd49efad4ddff Mon Sep 17 00:00:00 2001 +From: Thomas Kunze <thommycheck@gmx.de> +Date: Tue, 10 Feb 2009 18:15:34 +0100 +Subject: [PATCH 17/23] collie: convert to gpiolib for ucb1x00 + +Only the parts used for collie_battery are converted. +The rest will be cleaned up later. + +Conflicts: + + arch/arm/mach-sa1100/collie.c + arch/arm/mach-sa1100/include/mach/collie.h +--- + arch/arm/mach-sa1100/collie.c | 3 +- + arch/arm/mach-sa1100/include/mach/collie.h | 68 ++++++++++++++------------- + 2 files changed, 37 insertions(+), 34 deletions(-) + +diff --git a/arch/arm/mach-sa1100/collie.c b/arch/arm/mach-sa1100/collie.c +index ec673b8..4b52f30 100644 +--- a/arch/arm/mach-sa1100/collie.c ++++ b/arch/arm/mach-sa1100/collie.c +@@ -87,6 +87,7 @@ static struct scoop_pcmcia_config collie_pcmcia_config = { + static struct mcp_plat_data collie_mcp_data = { + .mccr0 = MCCR0_ADM | MCCR0_ExtClk, + .sclk_rate = 9216000, ++ .gpio_base = COLLIE_TC35143_GPIO_BASE, + }; + + #ifdef CONFIG_SHARP_LOCOMO +@@ -256,7 +257,7 @@ static void __init collie_init(void) + PPC_LDD6 | PPC_LDD7 | PPC_L_PCLK | PPC_L_LCLK | PPC_L_FCLK | PPC_L_BIAS | + PPC_TXD1 | PPC_TXD2 | PPC_TXD3 | PPC_TXD4 | PPC_SCLK | PPC_SFRM; + +- PWER = COLLIE_GPIO_AC_IN | COLLIE_GPIO_CO | COLLIE_GPIO_ON_KEY | ++ PWER = COLLIE_GPIO_AC_IN_ | COLLIE_GPIO_CO_ | COLLIE_GPIO_ON_KEY | + COLLIE_GPIO_WAKEUP | COLLIE_GPIO_nREMOCON_INT | PWER_RTC; + + PGSR = COLLIE_GPIO_nREMOCON_ON; +diff --git a/arch/arm/mach-sa1100/include/mach/collie.h b/arch/arm/mach-sa1100/include/mach/collie.h +index 799c930..bba8978 100644 +--- a/arch/arm/mach-sa1100/include/mach/collie.h ++++ b/arch/arm/mach-sa1100/include/mach/collie.h +@@ -15,7 +15,7 @@ + + + #define COLLIE_SCOOP_GPIO_BASE (GPIO_MAX + 1) +-#define COLLIE_SCP_CHARGE_ON SCOOP_GPCR_PA11 ++#define COLLIE_GPIO_CHARGE_ON (COLLIE_SCOOP_GPIO_BASE) + #define COLLIE_SCP_DIAG_BOOT1 SCOOP_GPCR_PA12 + #define COLLIE_SCP_DIAG_BOOT2 SCOOP_GPCR_PA13 + #define COLLIE_SCP_MUTE_L SCOOP_GPCR_PA14 +@@ -25,28 +25,29 @@ + #define COLLIE_GPIO_VPEN (COLLIE_SCOOP_GPIO_BASE + 7) + #define COLLIE_GPIO_LB_VOL_CHG (COLLIE_SCOOP_GPIO_BASE + 8) + +-#define COLLIE_SCOOP_IO_DIR ( COLLIE_SCP_CHARGE_ON | COLLIE_SCP_MUTE_L | COLLIE_SCP_MUTE_R | \ ++#define COLLIE_SCOOP_IO_DIR (COLLIE_SCP_MUTE_L | COLLIE_SCP_MUTE_R | \ + COLLIE_SCP_5VON | COLLIE_SCP_AMP_ON ) +-#define COLLIE_SCOOP_IO_OUT ( COLLIE_SCP_MUTE_L | COLLIE_SCP_MUTE_R | \ +- COLLIE_SCP_CHARGE_ON ) ++#define COLLIE_SCOOP_IO_OUT (COLLIE_SCP_MUTE_L | COLLIE_SCP_MUTE_R) + + /* GPIOs for which the generic definition doesn't say much */ + +-#define COLLIE_GPIO_ON_KEY GPIO_GPIO (0) +-#define COLLIE_GPIO_AC_IN GPIO_GPIO (1) +-#define COLLIE_GPIO_SDIO_INT GPIO_GPIO (11) +-#define COLLIE_GPIO_CF_IRQ GPIO_GPIO (14) +-#define COLLIE_GPIO_nREMOCON_INT GPIO_GPIO (15) +-#define COLLIE_GPIO_UCB1x00_RESET GPIO_GPIO (16) +-#define COLLIE_GPIO_nMIC_ON GPIO_GPIO (17) +-#define COLLIE_GPIO_nREMOCON_ON GPIO_GPIO (18) +-#define COLLIE_GPIO_CO GPIO_GPIO (20) +-#define COLLIE_GPIO_MCP_CLK GPIO_GPIO (21) +-#define COLLIE_GPIO_CF_CD GPIO_GPIO (22) +-#define COLLIE_GPIO_UCB1x00_IRQ GPIO_GPIO (23) +-#define COLLIE_GPIO_WAKEUP GPIO_GPIO (24) +-#define COLLIE_GPIO_GA_INT GPIO_GPIO (25) +-#define COLLIE_GPIO_MAIN_BAT_LOW GPIO_GPIO (26) ++#define COLLIE_GPIO_ON_KEY GPIO_GPIO(0) ++#define COLLIE_GPIO_AC_IN (1) ++#define COLLIE_GPIO_AC_IN_ GPIO_GPIO(1) ++#define COLLIE_GPIO_SDIO_INT GPIO_GPIO(11) ++#define COLLIE_GPIO_CF_IRQ GPIO_GPIO(14) ++#define COLLIE_GPIO_nREMOCON_INT GPIO_GPIO(15) ++#define COLLIE_GPIO_UCB1x00_RESET GPIO_GPIO(16) ++#define COLLIE_GPIO_nMIC_ON GPIO_GPIO(17) ++#define COLLIE_GPIO_nREMOCON_ON GPIO_GPIO(18) ++#define COLLIE_GPIO_CO (20) ++#define COLLIE_GPIO_CO_ GPIO_GPIO(20) ++#define COLLIE_GPIO_MCP_CLK GPIO_GPIO(21) ++#define COLLIE_GPIO_CF_CD GPIO_GPIO(22) ++#define COLLIE_GPIO_UCB1x00_IRQ GPIO_GPIO(23) ++#define COLLIE_GPIO_WAKEUP GPIO_GPIO(24) ++#define COLLIE_GPIO_GA_INT GPIO_GPIO(25) ++#define COLLIE_GPIO_MAIN_BAT_LOW (26) + + /* Interrupts */ + +@@ -70,19 +71,20 @@ + #define COLLIE_LCM_IRQ_GPIO_nSD_WP IRQ_LOCOMO_GPIO14 + + /* GPIO's on the TC35143AF (Toshiba Analog Frontend) */ +-#define COLLIE_TC35143_GPIO_VERSION0 UCB_IO_0 /* GPIO0=Version */ +-#define COLLIE_TC35143_GPIO_TBL_CHK UCB_IO_1 /* GPIO1=TBL_CHK */ +-#define COLLIE_TC35143_GPIO_VPEN_ON UCB_IO_2 /* GPIO2=VPNE_ON */ +-#define COLLIE_TC35143_GPIO_IR_ON UCB_IO_3 /* GPIO3=IR_ON */ +-#define COLLIE_TC35143_GPIO_AMP_ON UCB_IO_4 /* GPIO4=AMP_ON */ +-#define COLLIE_TC35143_GPIO_VERSION1 UCB_IO_5 /* GPIO5=Version */ +-#define COLLIE_TC35143_GPIO_FS8KLPF UCB_IO_5 /* GPIO5=fs 8k LPF */ +-#define COLLIE_TC35143_GPIO_BUZZER_BIAS UCB_IO_6 /* GPIO6=BUZZER BIAS */ +-#define COLLIE_TC35143_GPIO_MBAT_ON UCB_IO_7 /* GPIO7=MBAT_ON */ +-#define COLLIE_TC35143_GPIO_BBAT_ON UCB_IO_8 /* GPIO8=BBAT_ON */ +-#define COLLIE_TC35143_GPIO_TMP_ON UCB_IO_9 /* GPIO9=TMP_ON */ +-#define COLLIE_TC35143_GPIO_IN ( UCB_IO_0 | UCB_IO_2 | UCB_IO_5 ) +-#define COLLIE_TC35143_GPIO_OUT ( UCB_IO_1 | UCB_IO_3 | UCB_IO_4 | UCB_IO_6 | \ +- UCB_IO_7 | UCB_IO_8 | UCB_IO_9 ) ++#define COLLIE_TC35143_GPIO_BASE (GPIO_MAX + 13) ++#define COLLIE_TC35143_GPIO_VERSION0 UCB_IO_0 ++#define COLLIE_TC35143_GPIO_TBL_CHK UCB_IO_1 ++#define COLLIE_TC35143_GPIO_VPEN_ON UCB_IO_2 ++#define COLLIE_TC35143_GPIO_IR_ON UCB_IO_3 ++#define COLLIE_TC35143_GPIO_AMP_ON UCB_IO_4 ++#define COLLIE_TC35143_GPIO_VERSION1 UCB_IO_5 ++#define COLLIE_TC35143_GPIO_FS8KLPF UCB_IO_5 ++#define COLLIE_TC35143_GPIO_BUZZER_BIAS UCB_IO_6 ++#define COLLIE_GPIO_MBAT_ON (COLLIE_TC35143_GPIO_BASE + 7) ++#define COLLIE_GPIO_BBAT_ON (COLLIE_TC35143_GPIO_BASE + 8) ++#define COLLIE_GPIO_TMP_ON (COLLIE_TC35143_GPIO_BASE + 9) ++#define COLLIE_TC35143_GPIO_IN (UCB_IO_0 | UCB_IO_2 | UCB_IO_5) ++#define COLLIE_TC35143_GPIO_OUT (UCB_IO_1 | UCB_IO_3 | UCB_IO_4 \ ++ | UCB_IO_6) + + #endif +-- +1.5.6.5 + diff --git a/packages/linux/linux-2.6.28/collie/0018-collie-add-battery-driver.patch b/packages/linux/linux-2.6.28/collie/0018-collie-add-battery-driver.patch new file mode 100644 index 0000000000..b28db63d87 --- /dev/null +++ b/packages/linux/linux-2.6.28/collie/0018-collie-add-battery-driver.patch @@ -0,0 +1,473 @@ +From a2cf77eaf64b201a00b9682c25596ef0bcda8dc4 Mon Sep 17 00:00:00 2001 +From: Thomas Kunze <thommycheck@gmx.de> +Date: Tue, 10 Feb 2009 18:16:03 +0100 +Subject: [PATCH 18/23] collie: add battery driver + +This driver is based on tosa_battery.c. + +Conflicts: + + drivers/power/Makefile +--- + drivers/power/Kconfig | 7 + + drivers/power/Makefile | 1 + + drivers/power/collie_battery.c | 418 ++++++++++++++++++++++++++++++++++++++++ + 3 files changed, 426 insertions(+), 0 deletions(-) + create mode 100644 drivers/power/collie_battery.c + +diff --git a/drivers/power/Kconfig b/drivers/power/Kconfig +index 8e0c2b4..a945046 100644 +--- a/drivers/power/Kconfig ++++ b/drivers/power/Kconfig +@@ -56,6 +56,13 @@ config BATTERY_TOSA + Say Y to enable support for the battery on the Sharp Zaurus + SL-6000 (tosa) models. + ++config BATTERY_COLLIE ++ tristate "Sharp SL-5500 (collie) battery" ++ depends on SA1100_COLLIE && MCP_UCB1200 ++ help ++ Say Y to enable support for the battery on the Sharp Zaurus ++ SL-5500 (collie) models. ++ + config BATTERY_WM97XX + bool "WM97xx generic battery driver" + depends on TOUCHSCREEN_WM97XX=y +diff --git a/drivers/power/Makefile b/drivers/power/Makefile +index e8f1ece..51a7263 100644 +--- a/drivers/power/Makefile ++++ b/drivers/power/Makefile +@@ -21,5 +21,6 @@ obj-$(CONFIG_BATTERY_DS2760) += ds2760_battery.o + obj-$(CONFIG_BATTERY_PMU) += pmu_battery.o + obj-$(CONFIG_BATTERY_OLPC) += olpc_battery.o + obj-$(CONFIG_BATTERY_TOSA) += tosa_battery.o ++obj-$(CONFIG_BATTERY_COLLIE) += collie_battery.o + obj-$(CONFIG_BATTERY_WM97XX) += wm97xx_battery.o + obj-$(CONFIG_BATTERY_BQ27x00) += bq27x00_battery.o +diff --git a/drivers/power/collie_battery.c b/drivers/power/collie_battery.c +new file mode 100644 +index 0000000..039f41a +--- /dev/null ++++ b/drivers/power/collie_battery.c +@@ -0,0 +1,418 @@ ++/* ++ * Battery and Power Management code for the Sharp SL-5x00 ++ * ++ * Copyright (C) 2009 Thomas Kunze ++ * ++ * based on tosa_battery.c ++ * ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License version 2 as ++ * published by the Free Software Foundation. ++ * ++ */ ++#include <linux/kernel.h> ++#include <linux/module.h> ++#include <linux/power_supply.h> ++#include <linux/delay.h> ++#include <linux/spinlock.h> ++#include <linux/interrupt.h> ++#include <linux/gpio.h> ++#include <linux/mfd/ucb1x00.h> ++ ++#include <asm/mach/sharpsl_param.h> ++#include <asm/mach-types.h> ++#include <mach/collie.h> ++ ++static DEFINE_MUTEX(bat_lock); /* protects gpio pins */ ++static struct work_struct bat_work; ++static struct ucb1x00 *ucb; ++ ++struct collie_bat { ++ int status; ++ struct power_supply psy; ++ int full_chrg; ++ ++ struct mutex work_lock; /* protects data */ ++ ++ bool (*is_present)(struct collie_bat *bat); ++ int gpio_full; ++ int gpio_charge_on; ++ ++ int technology; ++ ++ int gpio_bat; ++ int adc_bat; ++ int adc_bat_divider; ++ int bat_max; ++ int bat_min; ++ ++ int gpio_temp; ++ int adc_temp; ++ int adc_temp_divider; ++}; ++ ++static struct collie_bat collie_bat_main; ++ ++static unsigned long collie_read_bat(struct collie_bat *bat) ++{ ++ unsigned long value = 0; ++ ++ if (bat->gpio_bat < 0 || bat->adc_bat < 0) ++ return 0; ++ mutex_lock(&bat_lock); ++ gpio_set_value(bat->gpio_bat, 1); ++ msleep(5); ++ ucb1x00_adc_enable(ucb); ++ value = ucb1x00_adc_read(ucb, bat->adc_bat, UCB_SYNC); ++ ucb1x00_adc_disable(ucb); ++ gpio_set_value(bat->gpio_bat, 0); ++ mutex_unlock(&bat_lock); ++ value = value * 1000000 / bat->adc_bat_divider; ++ ++ return value; ++} ++ ++static unsigned long collie_read_temp(struct collie_bat *bat) ++{ ++ unsigned long value = 0; ++ if (bat->gpio_temp < 0 || bat->adc_temp < 0) ++ return 0; ++ ++ mutex_lock(&bat_lock); ++ gpio_set_value(bat->gpio_temp, 1); ++ msleep(5); ++ ucb1x00_adc_enable(ucb); ++ value = ucb1x00_adc_read(ucb, bat->adc_temp, UCB_SYNC); ++ ucb1x00_adc_disable(ucb); ++ gpio_set_value(bat->gpio_temp, 0); ++ mutex_unlock(&bat_lock); ++ ++ value = value * 10000 / bat->adc_temp_divider; ++ ++ return value; ++} ++ ++static int collie_bat_get_property(struct power_supply *psy, ++ enum power_supply_property psp, ++ union power_supply_propval *val) ++{ ++ int ret = 0; ++ struct collie_bat *bat = container_of(psy, struct collie_bat, psy); ++ ++ if (bat->is_present && !bat->is_present(bat) ++ && psp != POWER_SUPPLY_PROP_PRESENT) { ++ return -ENODEV; ++ } ++ ++ switch (psp) { ++ case POWER_SUPPLY_PROP_STATUS: ++ val->intval = bat->status; ++ break; ++ case POWER_SUPPLY_PROP_TECHNOLOGY: ++ val->intval = bat->technology; ++ break; ++ case POWER_SUPPLY_PROP_VOLTAGE_NOW: ++ val->intval = collie_read_bat(bat); ++ break; ++ case POWER_SUPPLY_PROP_VOLTAGE_MAX: ++ if (bat->full_chrg == -1) ++ val->intval = bat->bat_max; ++ else ++ val->intval = bat->full_chrg; ++ break; ++ case POWER_SUPPLY_PROP_VOLTAGE_MAX_DESIGN: ++ val->intval = bat->bat_max; ++ break; ++ case POWER_SUPPLY_PROP_VOLTAGE_MIN_DESIGN: ++ val->intval = bat->bat_min; ++ break; ++ case POWER_SUPPLY_PROP_TEMP: ++ val->intval = collie_read_temp(bat); ++ break; ++ case POWER_SUPPLY_PROP_PRESENT: ++ val->intval = bat->is_present ? bat->is_present(bat) : 1; ++ break; ++ default: ++ ret = -EINVAL; ++ break; ++ } ++ return ret; ++} ++ ++static void collie_bat_external_power_changed(struct power_supply *psy) ++{ ++ schedule_work(&bat_work); ++} ++ ++static irqreturn_t collie_bat_gpio_isr(int irq, void *data) ++{ ++ pr_info("collie_bat_gpio irq: %d\n", gpio_get_value(irq_to_gpio(irq))); ++ schedule_work(&bat_work); ++ return IRQ_HANDLED; ++} ++ ++static void collie_bat_update(struct collie_bat *bat) ++{ ++ int old; ++ struct power_supply *psy = &bat->psy; ++ ++ mutex_lock(&bat->work_lock); ++ ++ old = bat->status; ++ ++ if (bat->is_present && !bat->is_present(bat)) { ++ printk(KERN_NOTICE "%s not present\n", psy->name); ++ bat->status = POWER_SUPPLY_STATUS_UNKNOWN; ++ bat->full_chrg = -1; ++ } else if (power_supply_am_i_supplied(psy)) { ++ if (bat->status == POWER_SUPPLY_STATUS_DISCHARGING) { ++ gpio_set_value(bat->gpio_charge_on, 1); ++ mdelay(15); ++ } ++ ++ if (gpio_get_value(bat->gpio_full)) { ++ if (old == POWER_SUPPLY_STATUS_CHARGING || ++ bat->full_chrg == -1) ++ bat->full_chrg = collie_read_bat(bat); ++ ++ gpio_set_value(bat->gpio_charge_on, 0); ++ bat->status = POWER_SUPPLY_STATUS_FULL; ++ } else { ++ gpio_set_value(bat->gpio_charge_on, 1); ++ bat->status = POWER_SUPPLY_STATUS_CHARGING; ++ } ++ } else { ++ gpio_set_value(bat->gpio_charge_on, 0); ++ bat->status = POWER_SUPPLY_STATUS_DISCHARGING; ++ } ++ ++ if (old != bat->status) ++ power_supply_changed(psy); ++ ++ mutex_unlock(&bat->work_lock); ++} ++ ++static void collie_bat_work(struct work_struct *work) ++{ ++ collie_bat_update(&collie_bat_main); ++} ++ ++ ++static enum power_supply_property collie_bat_main_props[] = { ++ POWER_SUPPLY_PROP_STATUS, ++ POWER_SUPPLY_PROP_TECHNOLOGY, ++ POWER_SUPPLY_PROP_VOLTAGE_MIN_DESIGN, ++ POWER_SUPPLY_PROP_VOLTAGE_NOW, ++ POWER_SUPPLY_PROP_VOLTAGE_MAX_DESIGN, ++ POWER_SUPPLY_PROP_VOLTAGE_MAX, ++ POWER_SUPPLY_PROP_PRESENT, ++ POWER_SUPPLY_PROP_TEMP, ++}; ++ ++static enum power_supply_property collie_bat_bu_props[] = { ++ POWER_SUPPLY_PROP_STATUS, ++ POWER_SUPPLY_PROP_TECHNOLOGY, ++ POWER_SUPPLY_PROP_VOLTAGE_MIN_DESIGN, ++ POWER_SUPPLY_PROP_VOLTAGE_NOW, ++ POWER_SUPPLY_PROP_VOLTAGE_MAX_DESIGN, ++ POWER_SUPPLY_PROP_VOLTAGE_MAX, ++ POWER_SUPPLY_PROP_PRESENT, ++}; ++ ++static struct collie_bat collie_bat_main = { ++ .status = POWER_SUPPLY_STATUS_DISCHARGING, ++ .full_chrg = -1, ++ .psy = { ++ .name = "main-battery", ++ .type = POWER_SUPPLY_TYPE_BATTERY, ++ .properties = collie_bat_main_props, ++ .num_properties = ARRAY_SIZE(collie_bat_main_props), ++ .get_property = collie_bat_get_property, ++ .external_power_changed = collie_bat_external_power_changed, ++ .use_for_apm = 1, ++ }, ++ ++ .gpio_full = COLLIE_GPIO_CO, ++ .gpio_charge_on = COLLIE_GPIO_CHARGE_ON, ++ ++ .technology = POWER_SUPPLY_TECHNOLOGY_LIPO, ++ ++ .gpio_bat = COLLIE_GPIO_MBAT_ON, ++ .adc_bat = UCB_ADC_INP_AD1, ++ .adc_bat_divider = 155, ++ .bat_max = 4310000, ++ .bat_min = 1551 * 1000000 / 414, ++ ++ .gpio_temp = COLLIE_GPIO_TMP_ON, ++ .adc_temp = UCB_ADC_INP_AD0, ++ .adc_temp_divider = 10000, ++}; ++ ++static struct collie_bat collie_bat_bu = { ++ .status = POWER_SUPPLY_STATUS_UNKNOWN, ++ .full_chrg = -1, ++ ++ .psy = { ++ .name = "backup-battery", ++ .type = POWER_SUPPLY_TYPE_BATTERY, ++ .properties = collie_bat_bu_props, ++ .num_properties = ARRAY_SIZE(collie_bat_bu_props), ++ .get_property = collie_bat_get_property, ++ .external_power_changed = collie_bat_external_power_changed, ++ }, ++ ++ .gpio_full = -1, ++ .gpio_charge_on = -1, ++ ++ .technology = POWER_SUPPLY_TECHNOLOGY_LiMn, ++ ++ .gpio_bat = COLLIE_GPIO_BBAT_ON, ++ .adc_bat = UCB_ADC_INP_AD1, ++ .adc_bat_divider = 155, ++ .bat_max = 3000000, ++ .bat_min = 1900000, ++ ++ .gpio_temp = -1, ++ .adc_temp = -1, ++ .adc_temp_divider = -1, ++}; ++ ++static struct { ++ int gpio; ++ char *name; ++ bool output; ++ int value; ++} gpios[] = { ++ { COLLIE_GPIO_CO, "main battery full", 0, 0 }, ++ { COLLIE_GPIO_MAIN_BAT_LOW, "main battery low", 0, 0 }, ++ { COLLIE_GPIO_CHARGE_ON, "main charge on", 1, 0 }, ++ { COLLIE_GPIO_MBAT_ON, "main battery", 1, 0 }, ++ { COLLIE_GPIO_TMP_ON, "main battery temp", 1, 0 }, ++ { COLLIE_GPIO_BBAT_ON, "backup battery", 1, 0 }, ++}; ++ ++#ifdef CONFIG_PM ++static int collie_bat_suspend(struct ucb1x00_dev *dev, pm_message_t state) ++{ ++ /* flush all pending status updates */ ++ flush_scheduled_work(); ++ return 0; ++} ++ ++static int collie_bat_resume(struct ucb1x00_dev *dev) ++{ ++ /* things may have changed while we were away */ ++ schedule_work(&bat_work); ++ return 0; ++} ++#else ++#define collie_bat_suspend NULL ++#define collie_bat_resume NULL ++#endif ++ ++static int __devinit collie_bat_probe(struct ucb1x00_dev *dev) ++{ ++ int ret; ++ int i; ++ ++ if (!machine_is_collie()) ++ return -ENODEV; ++ ++ ucb = dev->ucb; ++ ++ for (i = 0; i < ARRAY_SIZE(gpios); i++) { ++ ret = gpio_request(gpios[i].gpio, gpios[i].name); ++ if (ret) { ++ i--; ++ goto err_gpio; ++ } ++ ++ if (gpios[i].output) ++ ret = gpio_direction_output(gpios[i].gpio, ++ gpios[i].value); ++ else ++ ret = gpio_direction_input(gpios[i].gpio); ++ ++ if (ret) ++ goto err_gpio; ++ } ++ ++ mutex_init(&collie_bat_main.work_lock); ++ ++ INIT_WORK(&bat_work, collie_bat_work); ++ ++ ret = power_supply_register(&dev->ucb->dev, &collie_bat_main.psy); ++ if (ret) ++ goto err_psy_reg_main; ++ ret = power_supply_register(&dev->ucb->dev, &collie_bat_bu.psy); ++ if (ret) ++ goto err_psy_reg_bu; ++ ++ ret = request_irq(gpio_to_irq(COLLIE_GPIO_CO), ++ collie_bat_gpio_isr, ++ IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING, ++ "main full", &collie_bat_main); ++ if (!ret) { ++ schedule_work(&bat_work); ++ return 0; ++ } ++ power_supply_unregister(&collie_bat_bu.psy); ++err_psy_reg_bu: ++ power_supply_unregister(&collie_bat_main.psy); ++err_psy_reg_main: ++ ++ /* see comment in collie_bat_remove */ ++ flush_scheduled_work(); ++ ++ i--; ++err_gpio: ++ for (; i >= 0; i--) ++ gpio_free(gpios[i].gpio); ++ ++ return ret; ++} ++ ++static void __devexit collie_bat_remove(struct ucb1x00_dev *dev) ++{ ++ int i; ++ ++ free_irq(gpio_to_irq(COLLIE_GPIO_CO), &collie_bat_main); ++ ++ power_supply_unregister(&collie_bat_bu.psy); ++ power_supply_unregister(&collie_bat_main.psy); ++ ++ /* ++ * now flush all pending work. ++ * we won't get any more schedules, since all ++ * sources (isr and external_power_changed) ++ * are unregistered now. ++ */ ++ flush_scheduled_work(); ++ ++ for (i = ARRAY_SIZE(gpios) - 1; i >= 0; i--) ++ gpio_free(gpios[i].gpio); ++} ++ ++static struct ucb1x00_driver collie_bat_driver = { ++ .add = collie_bat_probe, ++ .remove = __devexit_p(collie_bat_remove), ++ .suspend = collie_bat_suspend, ++ .resume = collie_bat_resume, ++}; ++ ++static int __init collie_bat_init(void) ++{ ++ return ucb1x00_register_driver(&collie_bat_driver); ++} ++ ++static void __exit collie_bat_exit(void) ++{ ++ ucb1x00_unregister_driver(&collie_bat_driver); ++} ++ ++module_init(collie_bat_init); ++module_exit(collie_bat_exit); ++ ++MODULE_LICENSE("GPL"); ++MODULE_AUTHOR("Thomas Kunze"); ++MODULE_DESCRIPTION("Collie battery driver"); +-- +1.5.6.5 + diff --git a/packages/linux/linux-2.6.28/collie/0019-collie-support-pda_power-driver.patch b/packages/linux/linux-2.6.28/collie/0019-collie-support-pda_power-driver.patch new file mode 100644 index 0000000000..7d74cb72af --- /dev/null +++ b/packages/linux/linux-2.6.28/collie/0019-collie-support-pda_power-driver.patch @@ -0,0 +1,103 @@ +From c1a769bcd789ef7284ee4ece4324274278ee6401 Mon Sep 17 00:00:00 2001 +From: Thomas Kunze <thommycheck@gmx.de> +Date: Tue, 10 Feb 2009 13:48:32 +0100 +Subject: [PATCH 19/23] collie: support pda_power driver + +This add the pda-power platform device to collie. +--- + arch/arm/mach-sa1100/collie.c | 65 +++++++++++++++++++++++++++++++++++++++++ + 1 files changed, 65 insertions(+), 0 deletions(-) + +diff --git a/arch/arm/mach-sa1100/collie.c b/arch/arm/mach-sa1100/collie.c +index 4b52f30..7da2f28 100644 +--- a/arch/arm/mach-sa1100/collie.c ++++ b/arch/arm/mach-sa1100/collie.c +@@ -26,6 +26,7 @@ + #include <linux/mtd/partitions.h> + #include <linux/timer.h> + #include <linux/gpio.h> ++#include <linux/pda_power.h> + + #include <mach/hardware.h> + #include <asm/mach-types.h> +@@ -90,6 +91,69 @@ static struct mcp_plat_data collie_mcp_data = { + .gpio_base = COLLIE_TC35143_GPIO_BASE, + }; + ++/* ++ * Collie AC IN ++ */ ++static int collie_power_init(struct device *dev) ++{ ++ int ret = gpio_request(COLLIE_GPIO_AC_IN, "ac in"); ++ if (ret) ++ goto err_gpio_req; ++ ++ ret = gpio_direction_input(COLLIE_GPIO_AC_IN); ++ if (ret) ++ goto err_gpio_in; ++ ++ return 0; ++ ++err_gpio_in: ++ gpio_free(COLLIE_GPIO_AC_IN); ++err_gpio_req: ++ return ret; ++} ++ ++static void collie_power_exit(struct device *dev) ++{ ++ gpio_free(COLLIE_GPIO_AC_IN); ++} ++ ++static int collie_power_ac_online(void) ++{ ++ return gpio_get_value(COLLIE_GPIO_AC_IN) == 2; ++} ++ ++static char *collie_ac_supplied_to[] = { ++ "main-battery", ++ "backup-battery", ++}; ++ ++static struct pda_power_pdata collie_power_data = { ++ .init = collie_power_init, ++ .is_ac_online = collie_power_ac_online, ++ .exit = collie_power_exit, ++ .supplied_to = collie_ac_supplied_to, ++ .num_supplicants = ARRAY_SIZE(collie_ac_supplied_to), ++}; ++ ++static struct resource collie_power_resource[] = { ++ { ++ .name = "ac", ++ .start = gpio_to_irq(COLLIE_GPIO_AC_IN), ++ .end = gpio_to_irq(COLLIE_GPIO_AC_IN), ++ .flags = IORESOURCE_IRQ | ++ IORESOURCE_IRQ_HIGHEDGE | ++ IORESOURCE_IRQ_LOWEDGE, ++ }, ++}; ++ ++static struct platform_device collie_power_device = { ++ .name = "pda-power", ++ .id = -1, ++ .dev.platform_data = &collie_power_data, ++ .resource = collie_power_resource, ++ .num_resources = ARRAY_SIZE(collie_power_resource), ++}; ++ + #ifdef CONFIG_SHARP_LOCOMO + /* + * low-level UART features. +@@ -180,6 +244,7 @@ struct platform_device collie_locomo_device = { + static struct platform_device *devices[] __initdata = { + &collie_locomo_device, + &colliescoop_device, ++ &collie_power_device, + }; + + static struct mtd_partition collie_partitions[] = { +-- +1.5.6.5 + diff --git a/packages/linux/linux-2.6.28/collie/0020-remove-collie_pm.c.patch b/packages/linux/linux-2.6.28/collie/0020-remove-collie_pm.c.patch new file mode 100644 index 0000000000..490e333976 --- /dev/null +++ b/packages/linux/linux-2.6.28/collie/0020-remove-collie_pm.c.patch @@ -0,0 +1,323 @@ +From 702663223fdc1e3f73e9adbcb1415713b2c92652 Mon Sep 17 00:00:00 2001 +From: Thomas Kunze <thommycheck@gmx.de> +Date: Tue, 10 Feb 2009 18:16:57 +0100 +Subject: [PATCH 20/23] remove collie_pm.c + +This file was unused. The new battery driver makes it +obsolete. So remove it + +Conflicts: + + arch/arm/mach-sa1100/collie_pm.c +--- + arch/arm/mach-sa1100/collie_pm.c | 298 -------------------------------------- + 1 files changed, 0 insertions(+), 298 deletions(-) + delete mode 100644 arch/arm/mach-sa1100/collie_pm.c + +diff --git a/arch/arm/mach-sa1100/collie_pm.c b/arch/arm/mach-sa1100/collie_pm.c +deleted file mode 100644 +index 65b8b31..0000000 +--- a/arch/arm/mach-sa1100/collie_pm.c ++++ /dev/null +@@ -1,298 +0,0 @@ +-/* +- * Based on spitz_pm.c and sharp code. +- * +- * Copyright (C) 2001 SHARP +- * Copyright 2005 Pavel Machek <pavel@suse.cz> +- * +- * Distribute under GPLv2. +- * +- * Li-ion batteries are angry beasts, and they like to explode. This driver is not finished, +- * and sometimes charges them when it should not. If it makes angry lithium to come your way... +- * ...well, you have been warned. +- * +- * Actually, this should be quite safe, it seems sharp leaves charger enabled by default, +- * and my collie did not explode (yet). +- */ +- +-#include <linux/module.h> +-#include <linux/stat.h> +-#include <linux/init.h> +-#include <linux/kernel.h> +-#include <linux/delay.h> +-#include <linux/interrupt.h> +-#include <linux/device.h> +-#include <linux/platform_device.h> +-#include <linux/mfd/ucb1x00.h> +- +-#include <asm/irq.h> +-#include <mach/hardware.h> +-#include <asm/hardware/scoop.h> +-#include <asm/dma.h> +-#include <mach/collie.h> +-#include <asm/mach/sharpsl_param.h> +-#include <asm/hardware/sharpsl_pm.h> +- +- +-static struct ucb1x00 *ucb; +-static int ad_revise; +- +-#define ADCtoPower(x) ((330 * x * 2) / 1024) +- +-static void collie_charger_init(void) +-{ +- int err; +- +- if (sharpsl_param.adadj != -1) +- ad_revise = sharpsl_param.adadj; +- +- /* Register interrupt handler. */ +- if ((err = request_irq(COLLIE_IRQ_GPIO_AC_IN, sharpsl_ac_isr, IRQF_DISABLED, +- "ACIN", sharpsl_ac_isr))) { +- printk("Could not get irq %d.\n", COLLIE_IRQ_GPIO_AC_IN); +- return; +- } +- if ((err = request_irq(COLLIE_IRQ_GPIO_CO, sharpsl_chrg_full_isr, IRQF_DISABLED, +- "CO", sharpsl_chrg_full_isr))) { +- free_irq(COLLIE_IRQ_GPIO_AC_IN, sharpsl_ac_isr); +- printk("Could not get irq %d.\n", COLLIE_IRQ_GPIO_CO); +- return; +- } +- +- ucb1x00_io_set_dir(ucb, 0, COLLIE_TC35143_GPIO_MBAT_ON | COLLIE_TC35143_GPIO_TMP_ON | +- COLLIE_TC35143_GPIO_BBAT_ON); +- return; +-} +- +-static void collie_measure_temp(int on) +-{ +- if (on) +- ucb1x00_io_write(ucb, COLLIE_TC35143_GPIO_TMP_ON, 0); +- else +- ucb1x00_io_write(ucb, 0, COLLIE_TC35143_GPIO_TMP_ON); +-} +- +-static void collie_charge(int on) +-{ +- extern struct platform_device colliescoop_device; +- +- /* Zaurus seems to contain LTC1731; it should know when to +- * stop charging itself, so setting charge on should be +- * relatively harmless (as long as it is not done too often). +- */ +- if (on) { +- set_scoop_gpio(&colliescoop_device.dev, COLLIE_SCP_CHARGE_ON); +- } else { +- reset_scoop_gpio(&colliescoop_device.dev, COLLIE_SCP_CHARGE_ON); +- } +-} +- +-static void collie_discharge(int on) +-{ +-} +- +-static void collie_discharge1(int on) +-{ +-} +- +-static void collie_presuspend(void) +-{ +-} +- +-static void collie_postsuspend(void) +-{ +-} +- +-static int collie_should_wakeup(unsigned int resume_on_alarm) +-{ +- return 0; +-} +- +-static unsigned long collie_charger_wakeup(void) +-{ +- return 0; +-} +- +-int collie_read_backup_battery(void) +-{ +- int voltage; +- +- ucb1x00_adc_enable(ucb); +- +- ucb1x00_io_write(ucb, COLLIE_TC35143_GPIO_BBAT_ON, 0); +- voltage = ucb1x00_adc_read(ucb, UCB_ADC_INP_AD1, UCB_SYNC); +- +- ucb1x00_io_write(ucb, 0, COLLIE_TC35143_GPIO_BBAT_ON); +- ucb1x00_adc_disable(ucb); +- +- printk("Backup battery = %d(%d)\n", ADCtoPower(voltage), voltage); +- +- return ADCtoPower(voltage); +-} +- +-int collie_read_main_battery(void) +-{ +- int voltage, voltage_rev, voltage_volts; +- +- ucb1x00_adc_enable(ucb); +- ucb1x00_io_write(ucb, 0, COLLIE_TC35143_GPIO_BBAT_ON); +- ucb1x00_io_write(ucb, COLLIE_TC35143_GPIO_MBAT_ON, 0); +- +- mdelay(1); +- voltage = ucb1x00_adc_read(ucb, UCB_ADC_INP_AD1, UCB_SYNC); +- +- ucb1x00_io_write(ucb, 0, COLLIE_TC35143_GPIO_MBAT_ON); +- ucb1x00_adc_disable(ucb); +- +- voltage_rev = voltage + ((ad_revise * voltage) / 652); +- voltage_volts = ADCtoPower(voltage_rev); +- +- printk("Main battery = %d(%d)\n", voltage_volts, voltage); +- +- if (voltage != -1) +- return voltage_volts; +- else +- return voltage; +-} +- +-int collie_read_temp(void) +-{ +- int voltage; +- +- /* According to Sharp, temp must be > 973, main battery must be < 465, +- FIXME: sharpsl_pm.c has both conditions negated? FIXME: values +- are way out of range? */ +- +- ucb1x00_adc_enable(ucb); +- ucb1x00_io_write(ucb, COLLIE_TC35143_GPIO_TMP_ON, 0); +- /* >1010 = battery removed, 460 = 22C ?, higher = lower temp ? */ +- voltage = ucb1x00_adc_read(ucb, UCB_ADC_INP_AD0, UCB_SYNC); +- ucb1x00_io_write(ucb, 0, COLLIE_TC35143_GPIO_TMP_ON); +- ucb1x00_adc_disable(ucb); +- +- printk("Battery temp = %d\n", voltage); +- return voltage; +-} +- +-static unsigned long read_devdata(int which) +-{ +- switch (which) { +- case SHARPSL_BATT_VOLT: +- return collie_read_main_battery(); +- case SHARPSL_BATT_TEMP: +- return collie_read_temp(); +- case SHARPSL_ACIN_VOLT: +- return 500; +- case SHARPSL_STATUS_ACIN: { +- int ret = GPLR & COLLIE_GPIO_AC_IN; +- printk("AC status = %d\n", ret); +- return ret; +- } +- case SHARPSL_STATUS_FATAL: { +- int ret = GPLR & COLLIE_GPIO_MAIN_BAT_LOW; +- printk("Fatal bat = %d\n", ret); +- return ret; +- } +- default: +- return ~0; +- } +-} +- +-struct battery_thresh collie_battery_levels_acin[] = { +- { 420, 100}, +- { 417, 95}, +- { 415, 90}, +- { 413, 80}, +- { 411, 75}, +- { 408, 70}, +- { 406, 60}, +- { 403, 50}, +- { 398, 40}, +- { 391, 25}, +- { 10, 5}, +- { 0, 0}, +-}; +- +-struct battery_thresh collie_battery_levels[] = { +- { 394, 100}, +- { 390, 95}, +- { 380, 90}, +- { 370, 80}, +- { 368, 75}, /* From sharp code: battery high with frontlight */ +- { 366, 70}, /* 60..90 -- fake values invented by me for testing */ +- { 364, 60}, +- { 362, 50}, +- { 360, 40}, +- { 358, 25}, /* From sharp code: battery low with frontlight */ +- { 356, 5}, /* From sharp code: battery verylow with frontlight */ +- { 0, 0}, +-}; +- +-struct sharpsl_charger_machinfo collie_pm_machinfo = { +- .init = collie_charger_init, +- .read_devdata = read_devdata, +- .discharge = collie_discharge, +- .discharge1 = collie_discharge1, +- .charge = collie_charge, +- .measure_temp = collie_measure_temp, +- .presuspend = collie_presuspend, +- .postsuspend = collie_postsuspend, +- .charger_wakeup = collie_charger_wakeup, +- .should_wakeup = collie_should_wakeup, +- .bat_levels = 12, +- .bat_levels_noac = collie_battery_levels, +- .bat_levels_acin = collie_battery_levels_acin, +- .status_high_acin = 368, +- .status_low_acin = 358, +- .status_high_noac = 368, +- .status_low_noac = 358, +- .charge_on_volt = 350, /* spitz uses 2.90V, but lets play it safe. */ +- .charge_on_temp = 550, +- .charge_acin_high = 550, /* collie does not seem to have sensor for this, anyway */ +- .charge_acin_low = 450, /* ignored, too */ +- .fatal_acin_volt = 356, +- .fatal_noacin_volt = 356, +- +- .batfull_irq = 1, /* We do not want periodical charge restarts */ +-}; +- +-static int __init collie_pm_ucb_add(struct ucb1x00_dev *pdev) +-{ +- sharpsl_pm.machinfo = &collie_pm_machinfo; +- ucb = pdev->ucb; +- return 0; +-} +- +-static struct ucb1x00_driver collie_pm_ucb_driver = { +- .add = collie_pm_ucb_add, +-}; +- +-static struct platform_device *collie_pm_device; +- +-static int __init collie_pm_init(void) +-{ +- int ret; +- +- collie_pm_device = platform_device_alloc("sharpsl-pm", -1); +- if (!collie_pm_device) +- return -ENOMEM; +- +- collie_pm_device->dev.platform_data = &collie_pm_machinfo; +- ret = platform_device_add(collie_pm_device); +- +- if (ret) +- platform_device_put(collie_pm_device); +- +- if (!ret) +- ret = ucb1x00_register_driver(&collie_pm_ucb_driver); +- +- return ret; +-} +- +-static void __exit collie_pm_exit(void) +-{ +- ucb1x00_unregister_driver(&collie_pm_ucb_driver); +- platform_device_unregister(collie_pm_device); +-} +- +-module_init(collie_pm_init); +-module_exit(collie_pm_exit); +-- +1.5.6.5 + diff --git a/packages/linux/linux-2.6.28/collie/0021-mmc-trivial-annotation-of-blocks.patch b/packages/linux/linux-2.6.28/collie/0021-mmc-trivial-annotation-of-blocks.patch new file mode 100644 index 0000000000..c40be53d9b --- /dev/null +++ b/packages/linux/linux-2.6.28/collie/0021-mmc-trivial-annotation-of-blocks.patch @@ -0,0 +1,40 @@ +From 0057c3469772d6cddcaa486abe46a2957bc62a2c Mon Sep 17 00:00:00 2001 +From: Harvey Harrison <harvey.harrison@gmail.com> +Date: Wed, 22 Oct 2008 17:09:00 -0700 +Subject: [PATCH 21/23] mmc: trivial annotation of 'blocks' + +sg_init_one is reading a be32, annotate as such. + +Signed-off-by: Harvey Harrison <harvey.harrison@gmail.com> +Signed-off-by: Pierre Ossman <drzeus@drzeus.cx> +--- + drivers/mmc/card/block.c | 6 ++---- + 1 files changed, 2 insertions(+), 4 deletions(-) + +diff --git a/drivers/mmc/card/block.c b/drivers/mmc/card/block.c +index 3d067c3..903c8aa 100644 +--- a/drivers/mmc/card/block.c ++++ b/drivers/mmc/card/block.c +@@ -145,7 +145,7 @@ struct mmc_blk_request { + static u32 mmc_sd_num_wr_blocks(struct mmc_card *card) + { + int err; +- u32 blocks; ++ __be32 blocks; + + struct mmc_request mrq; + struct mmc_command cmd; +@@ -204,9 +204,7 @@ static u32 mmc_sd_num_wr_blocks(struct mmc_card *card) + if (cmd.error || data.error) + return (u32)-1; + +- blocks = ntohl(blocks); +- +- return blocks; ++ return ntohl(blocks); + } + + static int mmc_blk_issue_rq(struct mmc_queue *mq, struct request *req) +-- +1.5.6.5 + diff --git a/packages/linux/linux-2.6.28/collie/0022-mmc_block-print-better-error-messages.patch b/packages/linux/linux-2.6.28/collie/0022-mmc_block-print-better-error-messages.patch new file mode 100644 index 0000000000..b6cef07c19 --- /dev/null +++ b/packages/linux/linux-2.6.28/collie/0022-mmc_block-print-better-error-messages.patch @@ -0,0 +1,93 @@ +From d71af40a7a15a2ee7040fa0d5c8ac1bc19873c7d Mon Sep 17 00:00:00 2001 +From: Adrian Hunter <ext-adrian.hunter@nokia.com> +Date: Thu, 16 Oct 2008 12:55:25 +0300 +Subject: [PATCH 22/23] mmc_block: print better error messages + +Add command response and card status to error +messages. + +Signed-off-by: Adrian Hunter <ext-adrian.hunter@nokia.com> +Signed-off-by: Pierre Ossman <drzeus@drzeus.cx> +--- + drivers/mmc/card/block.c | 44 +++++++++++++++++++++++++++++++++++++------- + 1 files changed, 37 insertions(+), 7 deletions(-) + +diff --git a/drivers/mmc/card/block.c b/drivers/mmc/card/block.c +index 903c8aa..cc9b3ab 100644 +--- a/drivers/mmc/card/block.c ++++ b/drivers/mmc/card/block.c +@@ -207,6 +207,23 @@ static u32 mmc_sd_num_wr_blocks(struct mmc_card *card) + return ntohl(blocks); + } + ++static u32 get_card_status(struct mmc_card *card, struct request *req) ++{ ++ struct mmc_command cmd; ++ int err; ++ ++ memset(&cmd, 0, sizeof(struct mmc_command)); ++ cmd.opcode = MMC_SEND_STATUS; ++ if (!mmc_host_is_spi(card->host)) ++ cmd.arg = card->rca << 16; ++ cmd.flags = MMC_RSP_SPI_R2 | MMC_RSP_R1 | MMC_CMD_AC; ++ err = mmc_wait_for_cmd(card->host, &cmd, 0); ++ if (err) ++ printk(KERN_ERR "%s: error %d sending status comand", ++ req->rq_disk->disk_name, err); ++ return cmd.resp[0]; ++} ++ + static int mmc_blk_issue_rq(struct mmc_queue *mq, struct request *req) + { + struct mmc_blk_data *md = mq->data; +@@ -218,7 +235,7 @@ static int mmc_blk_issue_rq(struct mmc_queue *mq, struct request *req) + + do { + struct mmc_command cmd; +- u32 readcmd, writecmd; ++ u32 readcmd, writecmd, status = 0; + + memset(&brq, 0, sizeof(struct mmc_blk_request)); + brq.mrq.cmd = &brq.cmd; +@@ -273,19 +290,32 @@ static int mmc_blk_issue_rq(struct mmc_queue *mq, struct request *req) + * until later as we need to wait for the card to leave + * programming mode even when things go wrong. + */ ++ if (brq.cmd.error || brq.data.error || brq.stop.error) ++ status = get_card_status(card, req); ++ + if (brq.cmd.error) { +- printk(KERN_ERR "%s: error %d sending read/write command\n", +- req->rq_disk->disk_name, brq.cmd.error); ++ printk(KERN_ERR "%s: error %d sending read/write " ++ "command, response %#x, card status %#x\n", ++ req->rq_disk->disk_name, brq.cmd.error, ++ brq.cmd.resp[0], status); + } + + if (brq.data.error) { +- printk(KERN_ERR "%s: error %d transferring data\n", +- req->rq_disk->disk_name, brq.data.error); ++ if (brq.data.error == -ETIMEDOUT && brq.mrq.stop) ++ /* 'Stop' response contains card status */ ++ status = brq.mrq.stop->resp[0]; ++ printk(KERN_ERR "%s: error %d transferring data," ++ " sector %u, nr %u, card status %#x\n", ++ req->rq_disk->disk_name, brq.data.error, ++ (unsigned)req->sector, ++ (unsigned)req->nr_sectors, status); + } + + if (brq.stop.error) { +- printk(KERN_ERR "%s: error %d sending stop command\n", +- req->rq_disk->disk_name, brq.stop.error); ++ printk(KERN_ERR "%s: error %d sending stop command, " ++ "response %#x, card status %#x\n", ++ req->rq_disk->disk_name, brq.stop.error, ++ brq.stop.resp[0], status); + } + + if (!mmc_host_is_spi(card->host) && rq_data_dir(req) != READ) { +-- +1.5.6.5 + diff --git a/packages/linux/linux-2.6.28/collie/0023-mmc_block-ensure-all-sectors-that-do-not-have-error.patch b/packages/linux/linux-2.6.28/collie/0023-mmc_block-ensure-all-sectors-that-do-not-have-error.patch new file mode 100644 index 0000000000..3ff32b0a94 --- /dev/null +++ b/packages/linux/linux-2.6.28/collie/0023-mmc_block-ensure-all-sectors-that-do-not-have-error.patch @@ -0,0 +1,148 @@ +From fba35a4bb8f9cabcd374e19a2a34ee5496d971d2 Mon Sep 17 00:00:00 2001 +From: Adrian Hunter <ext-adrian.hunter@nokia.com> +Date: Wed, 31 Dec 2008 18:21:17 +0100 +Subject: [PATCH 23/23] mmc_block: ensure all sectors that do not have errors are read + +If a card encounters an ECC error while reading a sector it will +timeout. Instead of reporting the entire I/O request as having +an error, redo the I/O one sector at a time so that all readable +sectors are provided to the upper layers. + +Signed-off-by: Adrian Hunter <ext-adrian.hunter@nokia.com> +Signed-off-by: Pierre Ossman <drzeus@drzeus.cx> +--- + drivers/mmc/card/block.c | 76 +++++++++++++++++++++++++++++++++++---------- + 1 files changed, 59 insertions(+), 17 deletions(-) + +diff --git a/drivers/mmc/card/block.c b/drivers/mmc/card/block.c +index cc9b3ab..45b1f43 100644 +--- a/drivers/mmc/card/block.c ++++ b/drivers/mmc/card/block.c +@@ -229,7 +229,7 @@ static int mmc_blk_issue_rq(struct mmc_queue *mq, struct request *req) + struct mmc_blk_data *md = mq->data; + struct mmc_card *card = md->queue.card; + struct mmc_blk_request brq; +- int ret = 1; ++ int ret = 1, disable_multi = 0; + + mmc_claim_host(card->host); + +@@ -251,6 +251,14 @@ static int mmc_blk_issue_rq(struct mmc_queue *mq, struct request *req) + brq.stop.flags = MMC_RSP_SPI_R1B | MMC_RSP_R1B | MMC_CMD_AC; + brq.data.blocks = req->nr_sectors; + ++ /* ++ * After a read error, we redo the request one sector at a time ++ * in order to accurately determine which sectors can be read ++ * successfully. ++ */ ++ if (disable_multi && brq.data.blocks > 1) ++ brq.data.blocks = 1; ++ + if (brq.data.blocks > 1) { + /* SPI multiblock writes terminate using a special + * token, not a STOP_TRANSMISSION request. +@@ -279,6 +287,25 @@ static int mmc_blk_issue_rq(struct mmc_queue *mq, struct request *req) + brq.data.sg = mq->sg; + brq.data.sg_len = mmc_queue_map_sg(mq); + ++ /* ++ * Adjust the sg list so it is the same size as the ++ * request. ++ */ ++ if (brq.data.blocks != req->nr_sectors) { ++ int i, data_size = brq.data.blocks << 9; ++ struct scatterlist *sg; ++ ++ for_each_sg(brq.data.sg, sg, brq.data.sg_len, i) { ++ data_size -= sg->length; ++ if (data_size <= 0) { ++ sg->length += data_size; ++ i++; ++ break; ++ } ++ } ++ brq.data.sg_len = i; ++ } ++ + mmc_queue_bounce_pre(mq); + + mmc_wait_for_req(card->host, &brq.mrq); +@@ -290,8 +317,16 @@ static int mmc_blk_issue_rq(struct mmc_queue *mq, struct request *req) + * until later as we need to wait for the card to leave + * programming mode even when things go wrong. + */ +- if (brq.cmd.error || brq.data.error || brq.stop.error) ++ if (brq.cmd.error || brq.data.error || brq.stop.error) { ++ if (brq.data.blocks > 1 && rq_data_dir(req) == READ) { ++ /* Redo read one sector at a time */ ++ printk(KERN_WARNING "%s: retrying using single " ++ "block read\n", req->rq_disk->disk_name); ++ disable_multi = 1; ++ continue; ++ } + status = get_card_status(card, req); ++ } + + if (brq.cmd.error) { + printk(KERN_ERR "%s: error %d sending read/write " +@@ -348,8 +383,20 @@ static int mmc_blk_issue_rq(struct mmc_queue *mq, struct request *req) + #endif + } + +- if (brq.cmd.error || brq.data.error || brq.stop.error) ++ if (brq.cmd.error || brq.stop.error || brq.data.error) { ++ if (rq_data_dir(req) == READ) { ++ /* ++ * After an error, we redo I/O one sector at a ++ * time, so we only reach here after trying to ++ * read a single sector. ++ */ ++ spin_lock_irq(&md->lock); ++ ret = __blk_end_request(req, -EIO, brq.data.blksz); ++ spin_unlock_irq(&md->lock); ++ continue; ++ } + goto cmd_err; ++ } + + /* + * A block was successfully transferred. +@@ -371,25 +418,20 @@ static int mmc_blk_issue_rq(struct mmc_queue *mq, struct request *req) + * If the card is not SD, we can still ok written sectors + * as reported by the controller (which might be less than + * the real number of written sectors, but never more). +- * +- * For reads we just fail the entire chunk as that should +- * be safe in all cases. + */ +- if (rq_data_dir(req) != READ) { +- if (mmc_card_sd(card)) { +- u32 blocks; ++ if (mmc_card_sd(card)) { ++ u32 blocks; + +- blocks = mmc_sd_num_wr_blocks(card); +- if (blocks != (u32)-1) { +- spin_lock_irq(&md->lock); +- ret = __blk_end_request(req, 0, blocks << 9); +- spin_unlock_irq(&md->lock); +- } +- } else { ++ blocks = mmc_sd_num_wr_blocks(card); ++ if (blocks != (u32)-1) { + spin_lock_irq(&md->lock); +- ret = __blk_end_request(req, 0, brq.data.bytes_xfered); ++ ret = __blk_end_request(req, 0, blocks << 9); + spin_unlock_irq(&md->lock); + } ++ } else { ++ spin_lock_irq(&md->lock); ++ ret = __blk_end_request(req, 0, brq.data.bytes_xfered); ++ spin_unlock_irq(&md->lock); + } + + mmc_release_host(card->host); +-- +1.5.6.5 + diff --git a/packages/linux/linux-2.6.28/collie/defconfig b/packages/linux/linux-2.6.28/collie/defconfig new file mode 100644 index 0000000000..e815c97e42 --- /dev/null +++ b/packages/linux/linux-2.6.28/collie/defconfig @@ -0,0 +1,1677 @@ +# +# Automatically generated make config: don't edit +# Linux kernel version: 2.6.28 +# Fri Feb 13 10:42:04 2009 +# +CONFIG_ARM=y +CONFIG_SYS_SUPPORTS_APM_EMULATION=y +CONFIG_GENERIC_GPIO=y +CONFIG_GENERIC_TIME=y +CONFIG_GENERIC_CLOCKEVENTS=y +CONFIG_MMU=y +# CONFIG_NO_IOPORT is not set +CONFIG_GENERIC_HARDIRQS=y +CONFIG_STACKTRACE_SUPPORT=y +CONFIG_HAVE_LATENCYTOP_SUPPORT=y +CONFIG_LOCKDEP_SUPPORT=y +CONFIG_TRACE_IRQFLAGS_SUPPORT=y +CONFIG_HARDIRQS_SW_RESEND=y +CONFIG_GENERIC_IRQ_PROBE=y +CONFIG_RWSEM_GENERIC_SPINLOCK=y +# CONFIG_ARCH_HAS_ILOG2_U32 is not set +# CONFIG_ARCH_HAS_ILOG2_U64 is not set +CONFIG_GENERIC_HWEIGHT=y +CONFIG_GENERIC_CALIBRATE_DELAY=y +CONFIG_ARCH_MTD_XIP=y +CONFIG_GENERIC_HARDIRQS_NO__DO_IRQ=y +CONFIG_VECTORS_BASE=0xffff0000 +CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" + +# +# General setup +# +CONFIG_EXPERIMENTAL=y +CONFIG_BROKEN_ON_SMP=y +CONFIG_LOCK_KERNEL=y +CONFIG_INIT_ENV_ARG_LIMIT=32 +CONFIG_LOCALVERSION="" +# CONFIG_LOCALVERSION_AUTO is not set +CONFIG_SWAP=y +CONFIG_SYSVIPC=y +CONFIG_SYSVIPC_SYSCTL=y +# CONFIG_POSIX_MQUEUE is not set +CONFIG_BSD_PROCESS_ACCT=y +CONFIG_BSD_PROCESS_ACCT_V3=y +# CONFIG_TASKSTATS is not set +# CONFIG_AUDIT is not set +# CONFIG_IKCONFIG is not set +CONFIG_LOG_BUF_SHIFT=14 +# CONFIG_CGROUPS is not set +# CONFIG_GROUP_SCHED is not set +# CONFIG_USER_SCHED is not set +# CONFIG_CGROUP_SCHED is not set +CONFIG_SYSFS_DEPRECATED=y +CONFIG_SYSFS_DEPRECATED_V2=y +# CONFIG_RELAY is not set +# CONFIG_NAMESPACES is not set +# CONFIG_BLK_DEV_INITRD is not set +CONFIG_CC_OPTIMIZE_FOR_SIZE=y +CONFIG_SYSCTL=y +CONFIG_EMBEDDED=y +CONFIG_UID16=y +CONFIG_SYSCTL_SYSCALL=y +CONFIG_KALLSYMS=y +# CONFIG_KALLSYMS_ALL is not set +# CONFIG_KALLSYMS_EXTRA_PASS is not set +CONFIG_HOTPLUG=y +CONFIG_PRINTK=y +CONFIG_BUG=y +CONFIG_ELF_CORE=y +CONFIG_COMPAT_BRK=y +CONFIG_BASE_FULL=y +CONFIG_FUTEX=y +CONFIG_ANON_INODES=y +CONFIG_EPOLL=y +CONFIG_SIGNALFD=y +CONFIG_TIMERFD=y +CONFIG_EVENTFD=y +CONFIG_SHMEM=y +CONFIG_AIO=y +CONFIG_VM_EVENT_COUNTERS=y +CONFIG_SLAB=y +# CONFIG_SLUB is not set +# CONFIG_SLOB is not set +CONFIG_PROFILING=y +# CONFIG_MARKERS is not set +CONFIG_OPROFILE=m +CONFIG_HAVE_OPROFILE=y +# CONFIG_KPROBES is not set +CONFIG_HAVE_KPROBES=y +CONFIG_HAVE_KRETPROBES=y +CONFIG_HAVE_CLK=y +CONFIG_HAVE_GENERIC_DMA_COHERENT=y +CONFIG_SLABINFO=y +CONFIG_RT_MUTEXES=y +# CONFIG_TINY_SHMEM is not set +CONFIG_BASE_SMALL=0 +CONFIG_MODULES=y +# CONFIG_MODULE_FORCE_LOAD is not set +CONFIG_MODULE_UNLOAD=y +CONFIG_MODULE_FORCE_UNLOAD=y +# CONFIG_MODVERSIONS is not set +# CONFIG_MODULE_SRCVERSION_ALL is not set +CONFIG_KMOD=y +CONFIG_BLOCK=y +# CONFIG_LBD is not set +# CONFIG_BLK_DEV_IO_TRACE is not set +# CONFIG_LSF is not set +# CONFIG_BLK_DEV_BSG is not set +# CONFIG_BLK_DEV_INTEGRITY is not set + +# +# IO Schedulers +# +CONFIG_IOSCHED_NOOP=y +CONFIG_IOSCHED_AS=y +CONFIG_IOSCHED_DEADLINE=m +CONFIG_IOSCHED_CFQ=m +CONFIG_DEFAULT_AS=y +# CONFIG_DEFAULT_DEADLINE is not set +# CONFIG_DEFAULT_CFQ is not set +# CONFIG_DEFAULT_NOOP is not set +CONFIG_DEFAULT_IOSCHED="anticipatory" +CONFIG_CLASSIC_RCU=y +CONFIG_FREEZER=y + +# +# System Type +# +# CONFIG_ARCH_AAEC2000 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_CLPS7500 is not set +# CONFIG_ARCH_CLPS711X 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_H720X is not set +# CONFIG_ARCH_IMX is not set +# CONFIG_ARCH_IOP13XX is not set +# CONFIG_ARCH_IOP32X is not set +# CONFIG_ARCH_IOP33X is not set +# CONFIG_ARCH_IXP23XX is not set +# CONFIG_ARCH_IXP2000 is not set +# CONFIG_ARCH_IXP4XX is not set +# CONFIG_ARCH_L7200 is not set +# CONFIG_ARCH_KIRKWOOD is not set +# CONFIG_ARCH_KS8695 is not set +# CONFIG_ARCH_NS9XXX is not set +# CONFIG_ARCH_LOKI is not set +# CONFIG_ARCH_MV78XX0 is not set +# CONFIG_ARCH_MXC is not set +# CONFIG_ARCH_ORION5X is not set +# CONFIG_ARCH_PNX4008 is not set +# CONFIG_ARCH_PXA is not set +# CONFIG_ARCH_RPC is not set +CONFIG_ARCH_SA1100=y +# CONFIG_ARCH_S3C2410 is not set +# CONFIG_ARCH_SHARK is not set +# CONFIG_ARCH_LH7A40X is not set +# CONFIG_ARCH_DAVINCI is not set +# CONFIG_ARCH_OMAP is not set +# CONFIG_ARCH_MSM is not set + +# +# SA11x0 Implementations +# +# CONFIG_SA1100_ASSABET is not set +# CONFIG_SA1100_CERF is not set +CONFIG_SA1100_COLLIE=y +# CONFIG_SA1100_H3100 is not set +# CONFIG_SA1100_H3600 is not set +# CONFIG_SA1100_H3800 is not set +# CONFIG_SA1100_BADGE4 is not set +# CONFIG_SA1100_JORNADA720 is not set +# CONFIG_SA1100_HACKKIT is not set +# CONFIG_SA1100_LART is not set +# CONFIG_SA1100_PLEB is not set +# CONFIG_SA1100_SHANNON is not set +# CONFIG_SA1100_SIMPAD is not set +# CONFIG_SA1100_SSP is not set + +# +# Boot options +# + +# +# Power management +# + +# +# Processor Type +# +CONFIG_CPU_32=y +CONFIG_CPU_SA1100=y +CONFIG_CPU_32v4=y +CONFIG_CPU_ABRT_EV4=y +CONFIG_CPU_PABRT_NOIFAR=y +CONFIG_CPU_CACHE_V4WB=y +CONFIG_CPU_CACHE_VIVT=y +CONFIG_CPU_TLB_V4WB=y +CONFIG_CPU_CP15=y +CONFIG_CPU_CP15_MMU=y + +# +# Processor Features +# +# CONFIG_CPU_ICACHE_DISABLE is not set +# CONFIG_CPU_DCACHE_DISABLE is not set +# CONFIG_OUTER_CACHE is not set +CONFIG_SHARP_LOCOMO=y +CONFIG_SHARP_PARAM=y +CONFIG_SHARP_SCOOP=y + +# +# Bus support +# +CONFIG_ISA=y +# CONFIG_PCI_SYSCALL is not set +# CONFIG_ARCH_SUPPORTS_MSI is not set +CONFIG_PCCARD=y +# CONFIG_PCMCIA_DEBUG is not set +CONFIG_PCMCIA=y +CONFIG_PCMCIA_LOAD_CIS=y +CONFIG_PCMCIA_IOCTL=y + +# +# PC-card bridges +# +# CONFIG_I82365 is not set +# CONFIG_TCIC is not set +CONFIG_PCMCIA_SA1100=y + +# +# Kernel Features +# +CONFIG_TICK_ONESHOT=y +CONFIG_NO_HZ=y +CONFIG_HIGH_RES_TIMERS=y +CONFIG_GENERIC_CLOCKEVENTS_BUILD=y +CONFIG_VMSPLIT_3G=y +# CONFIG_VMSPLIT_2G is not set +# CONFIG_VMSPLIT_1G is not set +CONFIG_PAGE_OFFSET=0xC0000000 +CONFIG_PREEMPT=y +CONFIG_HZ=100 +# CONFIG_AEABI is not set +CONFIG_ARCH_SPARSEMEM_ENABLE=y +CONFIG_ARCH_SPARSEMEM_DEFAULT=y +# CONFIG_ARCH_SELECT_MEMORY_MODEL is not set +CONFIG_SELECT_MEMORY_MODEL=y +# CONFIG_FLATMEM_MANUAL is not set +# CONFIG_DISCONTIGMEM_MANUAL is not set +CONFIG_SPARSEMEM_MANUAL=y +CONFIG_SPARSEMEM=y +CONFIG_HAVE_MEMORY_PRESENT=y +CONFIG_SPARSEMEM_EXTREME=y +CONFIG_PAGEFLAGS_EXTENDED=y +CONFIG_SPLIT_PTLOCK_CPUS=4096 +# CONFIG_RESOURCES_64BIT is not set +# CONFIG_PHYS_ADDR_T_64BIT is not set +CONFIG_ZONE_DMA_FLAG=0 +CONFIG_VIRT_TO_BUS=y +CONFIG_UNEVICTABLE_LRU=y +# CONFIG_LEDS is not set +CONFIG_ALIGNMENT_TRAP=y + +# +# Boot options +# +CONFIG_ZBOOT_ROM_TEXT=0x0 +CONFIG_ZBOOT_ROM_BSS=0x0 +CONFIG_CMDLINE="console=ttySA0,115200n8 console=tty1 root=/dev/mmcblk0p1 rootfstype=ext2 rootdelay=3 mem=64M fbcon=rotate:1 debug" +# CONFIG_XIP_KERNEL is not set +CONFIG_KEXEC=y +CONFIG_ATAGS_PROC=y + +# +# CPU Power Management +# +# CONFIG_CPU_FREQ is not set +# CONFIG_CPU_IDLE is not set + +# +# Floating point emulation +# + +# +# At least one emulation must be selected +# +CONFIG_FPE_NWFPE=y +# CONFIG_FPE_NWFPE_XP is not set +# CONFIG_FPE_FASTFPE is not set + +# +# Userspace binary formats +# +CONFIG_BINFMT_ELF=y +# CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set +CONFIG_HAVE_AOUT=y +CONFIG_BINFMT_AOUT=m +CONFIG_BINFMT_MISC=m +# CONFIG_ARTHUR is not set + +# +# Power management options +# +CONFIG_PM=y +# CONFIG_PM_DEBUG is not set +CONFIG_PM_SLEEP=y +CONFIG_SUSPEND=y +CONFIG_SUSPEND_FREEZER=y +CONFIG_APM_EMULATION=y +CONFIG_ARCH_SUSPEND_POSSIBLE=y +CONFIG_NET=y + +# +# Networking options +# +CONFIG_PACKET=y +CONFIG_PACKET_MMAP=y +CONFIG_UNIX=y +CONFIG_XFRM=y +CONFIG_XFRM_USER=m +# CONFIG_XFRM_SUB_POLICY is not set +# CONFIG_XFRM_MIGRATE is not set +# CONFIG_XFRM_STATISTICS is not set +CONFIG_XFRM_IPCOMP=m +# CONFIG_NET_KEY is not set +CONFIG_INET=y +# CONFIG_IP_MULTICAST is not set +# CONFIG_IP_ADVANCED_ROUTER is not set +# CONFIG_ASK_IP_FIB_HASH is not set +# CONFIG_IP_FIB_TRIE is not set +CONFIG_IP_FIB_HASH=y +# CONFIG_IP_PNP is not set +# CONFIG_NET_IPIP is not set +# CONFIG_NET_IPGRE is not set +# CONFIG_ARPD is not set +CONFIG_SYN_COOKIES=y +# CONFIG_INET_AH is not set +# CONFIG_INET_ESP is not set +# CONFIG_INET_IPCOMP is not set +# CONFIG_INET_XFRM_TUNNEL is not set +CONFIG_INET_TUNNEL=m +CONFIG_INET_XFRM_MODE_TRANSPORT=m +CONFIG_INET_XFRM_MODE_TUNNEL=m +CONFIG_INET_XFRM_MODE_BEET=m +# CONFIG_INET_LRO is not set +CONFIG_INET_DIAG=m +CONFIG_INET_TCP_DIAG=m +# CONFIG_TCP_CONG_ADVANCED is not set +CONFIG_TCP_CONG_CUBIC=y +# CONFIG_DEFAULT_BIC is not set +# CONFIG_DEFAULT_CUBIC is not set +# CONFIG_DEFAULT_HTCP is not set +# CONFIG_DEFAULT_VEGAS is not set +# CONFIG_DEFAULT_WESTWOOD is not set +# CONFIG_DEFAULT_RENO is not set +CONFIG_DEFAULT_TCP_CONG="cubic" +# CONFIG_TCP_MD5SIG is not set +CONFIG_IPV6=m +# CONFIG_IPV6_PRIVACY is not set +# CONFIG_IPV6_ROUTER_PREF is not set +# CONFIG_IPV6_OPTIMISTIC_DAD is not set +CONFIG_INET6_AH=m +CONFIG_INET6_ESP=m +CONFIG_INET6_IPCOMP=m +# CONFIG_IPV6_MIP6 is not set +CONFIG_INET6_XFRM_TUNNEL=m +CONFIG_INET6_TUNNEL=m +CONFIG_INET6_XFRM_MODE_TRANSPORT=m +CONFIG_INET6_XFRM_MODE_TUNNEL=m +CONFIG_INET6_XFRM_MODE_BEET=m +# CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION is not set +CONFIG_IPV6_SIT=m +CONFIG_IPV6_NDISC_NODETYPE=y +CONFIG_IPV6_TUNNEL=m +# CONFIG_IPV6_MULTIPLE_TABLES is not set +# CONFIG_IPV6_MROUTE is not set +# CONFIG_NETWORK_SECMARK is not set +CONFIG_NETFILTER=y +# CONFIG_NETFILTER_DEBUG is not set +CONFIG_NETFILTER_ADVANCED=y + +# +# Core Netfilter Configuration +# +# CONFIG_NETFILTER_NETLINK_QUEUE is not set +# CONFIG_NETFILTER_NETLINK_LOG is not set +# CONFIG_NF_CONNTRACK is not set +CONFIG_NETFILTER_XTABLES=m +# CONFIG_NETFILTER_XT_TARGET_CLASSIFY is not set +# CONFIG_NETFILTER_XT_TARGET_DSCP is not set +# CONFIG_NETFILTER_XT_TARGET_MARK is not set +# CONFIG_NETFILTER_XT_TARGET_NFLOG is not set +# CONFIG_NETFILTER_XT_TARGET_NFQUEUE is not set +# CONFIG_NETFILTER_XT_TARGET_RATEEST is not set +# CONFIG_NETFILTER_XT_TARGET_TRACE is not set +# CONFIG_NETFILTER_XT_TARGET_TCPMSS is not set +# CONFIG_NETFILTER_XT_TARGET_TCPOPTSTRIP is not set +# CONFIG_NETFILTER_XT_MATCH_COMMENT is not set +# CONFIG_NETFILTER_XT_MATCH_DCCP is not set +# CONFIG_NETFILTER_XT_MATCH_DSCP is not set +# CONFIG_NETFILTER_XT_MATCH_ESP is not set +# CONFIG_NETFILTER_XT_MATCH_HASHLIMIT is not set +# CONFIG_NETFILTER_XT_MATCH_IPRANGE is not set +# CONFIG_NETFILTER_XT_MATCH_LENGTH is not set +# CONFIG_NETFILTER_XT_MATCH_LIMIT is not set +# CONFIG_NETFILTER_XT_MATCH_MAC is not set +# CONFIG_NETFILTER_XT_MATCH_MARK is not set +# CONFIG_NETFILTER_XT_MATCH_MULTIPORT is not set +# CONFIG_NETFILTER_XT_MATCH_OWNER is not set +# CONFIG_NETFILTER_XT_MATCH_POLICY is not set +# CONFIG_NETFILTER_XT_MATCH_PKTTYPE is not set +# CONFIG_NETFILTER_XT_MATCH_QUOTA is not set +# CONFIG_NETFILTER_XT_MATCH_RATEEST is not set +# CONFIG_NETFILTER_XT_MATCH_REALM is not set +# CONFIG_NETFILTER_XT_MATCH_RECENT is not set +# CONFIG_NETFILTER_XT_MATCH_SCTP is not set +# CONFIG_NETFILTER_XT_MATCH_STATISTIC is not set +# CONFIG_NETFILTER_XT_MATCH_STRING is not set +# CONFIG_NETFILTER_XT_MATCH_TCPMSS is not set +# CONFIG_NETFILTER_XT_MATCH_TIME is not set +# CONFIG_NETFILTER_XT_MATCH_U32 is not set +# CONFIG_IP_VS is not set + +# +# IP: Netfilter Configuration +# +# CONFIG_NF_DEFRAG_IPV4 is not set +CONFIG_IP_NF_QUEUE=m +CONFIG_IP_NF_IPTABLES=m +CONFIG_IP_NF_MATCH_ADDRTYPE=m +CONFIG_IP_NF_MATCH_AH=m +CONFIG_IP_NF_MATCH_ECN=m +CONFIG_IP_NF_MATCH_TTL=m +CONFIG_IP_NF_FILTER=m +CONFIG_IP_NF_TARGET_REJECT=m +CONFIG_IP_NF_TARGET_LOG=m +CONFIG_IP_NF_TARGET_ULOG=m +CONFIG_IP_NF_MANGLE=m +CONFIG_IP_NF_TARGET_ECN=m +CONFIG_IP_NF_TARGET_TTL=m +CONFIG_IP_NF_RAW=m +CONFIG_IP_NF_ARPTABLES=m +CONFIG_IP_NF_ARPFILTER=m +CONFIG_IP_NF_ARP_MANGLE=m + +# +# IPv6: Netfilter Configuration +# +# CONFIG_IP6_NF_QUEUE is not set +# CONFIG_IP6_NF_IPTABLES is not set +# CONFIG_IP_DCCP is not set +# CONFIG_IP_SCTP is not set +# CONFIG_SCTP_HMAC_NONE is not set +# CONFIG_SCTP_HMAC_SHA1 is not set +# CONFIG_SCTP_HMAC_MD5 is not set +# CONFIG_TIPC is not set +# CONFIG_ATM is not set +# CONFIG_BRIDGE is not set +# CONFIG_NET_DSA is not set +# CONFIG_VLAN_8021Q is not set +# CONFIG_DECNET is not set +# 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_ECONET is not set +# CONFIG_WAN_ROUTER is not set +# CONFIG_NET_SCHED is not set + +# +# Network testing +# +# CONFIG_NET_PKTGEN is not set +# CONFIG_HAMRADIO is not set +# CONFIG_CAN is not set +CONFIG_IRDA=m + +# +# IrDA protocols +# +CONFIG_IRLAN=m +CONFIG_IRNET=m +CONFIG_IRCOMM=m +# CONFIG_IRDA_ULTRA is not set + +# +# IrDA options +# +# CONFIG_IRDA_CACHE_LAST_LSAP is not set +# CONFIG_IRDA_FAST_RR is not set +# CONFIG_IRDA_DEBUG is not set + +# +# Infrared-port device drivers +# + +# +# SIR device drivers +# +# CONFIG_IRTTY_SIR is not set + +# +# Dongle support +# + +# +# FIR device drivers +# +# CONFIG_SA1100_FIR is not set +CONFIG_BT=m +CONFIG_BT_L2CAP=m +CONFIG_BT_SCO=m +CONFIG_BT_RFCOMM=m +CONFIG_BT_RFCOMM_TTY=y +CONFIG_BT_BNEP=m +CONFIG_BT_BNEP_MC_FILTER=y +CONFIG_BT_BNEP_PROTO_FILTER=y +CONFIG_BT_HIDP=m + +# +# Bluetooth device drivers +# +# CONFIG_BT_HCIBTSDIO is not set +CONFIG_BT_HCIUART=m +CONFIG_BT_HCIUART_H4=y +CONFIG_BT_HCIUART_BCSP=y +# CONFIG_BT_HCIUART_LL is not set +# CONFIG_BT_HCIDTL1 is not set +# CONFIG_BT_HCIBT3C is not set +# CONFIG_BT_HCIBLUECARD is not set +# CONFIG_BT_HCIBTUART is not set +CONFIG_BT_HCIVHCI=m +# CONFIG_AF_RXRPC is not set +# CONFIG_PHONET is not set +CONFIG_WIRELESS=y +CONFIG_CFG80211=y +CONFIG_NL80211=y +CONFIG_WIRELESS_OLD_REGULATORY=y +CONFIG_WIRELESS_EXT=y +CONFIG_WIRELESS_EXT_SYSFS=y +CONFIG_MAC80211=y + +# +# Rate control algorithm selection +# +# CONFIG_MAC80211_RC_PID is not set +CONFIG_MAC80211_RC_MINSTREL=y +# CONFIG_MAC80211_RC_DEFAULT_PID is not set +CONFIG_MAC80211_RC_DEFAULT_MINSTREL=y +CONFIG_MAC80211_RC_DEFAULT="minstrel" +# CONFIG_MAC80211_MESH is not set +# CONFIG_MAC80211_LEDS is not set +# CONFIG_MAC80211_DEBUGFS is not set +# CONFIG_MAC80211_DEBUG_MENU is not set +CONFIG_IEEE80211=y +# CONFIG_IEEE80211_DEBUG is not set +CONFIG_IEEE80211_CRYPT_WEP=y +CONFIG_IEEE80211_CRYPT_CCMP=y +CONFIG_IEEE80211_CRYPT_TKIP=y +# CONFIG_RFKILL is not set +# CONFIG_NET_9P is not set + +# +# Device Drivers +# + +# +# Generic Driver Options +# +CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" +CONFIG_STANDALONE=y +CONFIG_PREVENT_FIRMWARE_BUILD=y +CONFIG_FW_LOADER=y +CONFIG_FIRMWARE_IN_KERNEL=y +CONFIG_EXTRA_FIRMWARE="" +# CONFIG_DEBUG_DRIVER is not set +# CONFIG_DEBUG_DEVRES is not set +# CONFIG_SYS_HYPERVISOR is not set +# CONFIG_CONNECTOR is not set +CONFIG_MTD=y +CONFIG_MTD_DEBUG=y +CONFIG_MTD_DEBUG_VERBOSE=0 +# CONFIG_MTD_CONCAT is not set +CONFIG_MTD_PARTITIONS=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_CHAR=y +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_MTD_OOPS is not set + +# +# RAM/ROM/Flash chip drivers +# +# CONFIG_MTD_CFI is not set +# CONFIG_MTD_JEDECPROBE is not set +CONFIG_MTD_MAP_BANK_WIDTH_1=y +CONFIG_MTD_MAP_BANK_WIDTH_2=y +CONFIG_MTD_MAP_BANK_WIDTH_4=y +# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set +# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set +# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set +CONFIG_MTD_CFI_I1=y +CONFIG_MTD_CFI_I2=y +# CONFIG_MTD_CFI_I4 is not set +# CONFIG_MTD_CFI_I8 is not set +# CONFIG_MTD_RAM is not set +# CONFIG_MTD_ROM is not set +# CONFIG_MTD_ABSENT is not set +CONFIG_MTD_SHARP=y + +# +# Mapping drivers for chip access +# +CONFIG_MTD_COMPLEX_MAPPINGS=y +CONFIG_MTD_SA1100=y +# 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_SLRAM is not set +# CONFIG_MTD_PHRAM is not set +# CONFIG_MTD_MTDRAM is not set +# CONFIG_MTD_BLOCK2MTD is not set + +# +# Disk-On-Chip Device Drivers +# +# CONFIG_MTD_DOC2000 is not set +# CONFIG_MTD_DOC2001 is not set +# CONFIG_MTD_DOC2001PLUS is not set +# CONFIG_MTD_NAND is not set +# CONFIG_MTD_ONENAND is not set + +# +# UBI - Unsorted block images +# +CONFIG_MTD_UBI=m +CONFIG_MTD_UBI_WL_THRESHOLD=4096 +CONFIG_MTD_UBI_BEB_RESERVE=1 +# CONFIG_MTD_UBI_GLUEBI is not set + +# +# UBI debugging options +# +# CONFIG_MTD_UBI_DEBUG is not set +# CONFIG_PARPORT is not set +# CONFIG_PNP is not set +CONFIG_BLK_DEV=y +# CONFIG_BLK_DEV_COW_COMMON is not set +CONFIG_BLK_DEV_LOOP=y +CONFIG_BLK_DEV_CRYPTOLOOP=m +CONFIG_BLK_DEV_NBD=m +CONFIG_BLK_DEV_RAM=m +CONFIG_BLK_DEV_RAM_COUNT=16 +CONFIG_BLK_DEV_RAM_SIZE=4096 +# CONFIG_BLK_DEV_XIP is not set +CONFIG_CDROM_PKTCDVD=m +CONFIG_CDROM_PKTCDVD_BUFFERS=8 +# CONFIG_CDROM_PKTCDVD_WCACHE is not set +CONFIG_ATA_OVER_ETH=m +# CONFIG_MISC_DEVICES is not set +CONFIG_HAVE_IDE=y +CONFIG_IDE=y + +# +# Please see Documentation/ide/ide.txt for help/info on IDE drives +# +# CONFIG_BLK_DEV_IDE_SATA is not set +CONFIG_IDE_GD=y +CONFIG_IDE_GD_ATA=y +# CONFIG_IDE_GD_ATAPI is not set +CONFIG_BLK_DEV_IDECS=y +# CONFIG_BLK_DEV_IDECD is not set +# CONFIG_BLK_DEV_IDETAPE is not set +# CONFIG_BLK_DEV_IDESCSI is not set +# CONFIG_IDE_TASK_IOCTL is not set +CONFIG_IDE_PROC_FS=y + +# +# IDE chipset support/bugfixes +# +# CONFIG_BLK_DEV_PLATFORM is not set +# CONFIG_BLK_DEV_IDEDMA is not set + +# +# SCSI device support +# +# CONFIG_RAID_ATTRS is not set +CONFIG_SCSI=m +CONFIG_SCSI_DMA=y +# CONFIG_SCSI_TGT is not set +# CONFIG_SCSI_NETLINK is not set +CONFIG_SCSI_PROC_FS=y + +# +# SCSI support type (disk, tape, CD-ROM) +# +CONFIG_BLK_DEV_SD=m +CONFIG_CHR_DEV_ST=m +CONFIG_CHR_DEV_OSST=m +CONFIG_BLK_DEV_SR=m +# CONFIG_BLK_DEV_SR_VENDOR is not set +CONFIG_CHR_DEV_SG=m +# CONFIG_CHR_DEV_SCH is not set + +# +# Some SCSI devices (e.g. CD jukebox) support multiple LUNs +# +CONFIG_SCSI_MULTI_LUN=y +# CONFIG_SCSI_CONSTANTS is not set +# CONFIG_SCSI_LOGGING is not set +# CONFIG_SCSI_SCAN_ASYNC is not set +CONFIG_SCSI_WAIT_SCAN=m + +# +# 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_LIBSAS is not set +# CONFIG_SCSI_SRP_ATTRS is not set +CONFIG_SCSI_LOWLEVEL=y +# CONFIG_ISCSI_TCP is not set +# CONFIG_SCSI_AHA152X is not set +# CONFIG_SCSI_AIC7XXX_OLD is not set +# CONFIG_SCSI_ADVANSYS is not set +# CONFIG_SCSI_IN2000 is not set +# CONFIG_SCSI_DTC3280 is not set +# CONFIG_SCSI_FUTURE_DOMAIN is not set +# CONFIG_SCSI_GENERIC_NCR5380 is not set +# CONFIG_SCSI_GENERIC_NCR5380_MMIO is not set +# CONFIG_SCSI_NCR53C406A is not set +# CONFIG_SCSI_PAS16 is not set +# CONFIG_SCSI_QLOGIC_FAS is not set +# CONFIG_SCSI_SYM53C416 is not set +# CONFIG_SCSI_T128 is not set +# CONFIG_SCSI_DEBUG is not set +# CONFIG_SCSI_LOWLEVEL_PCMCIA is not set +# CONFIG_SCSI_DH is not set +# CONFIG_ATA is not set +CONFIG_MD=y +# CONFIG_BLK_DEV_MD is not set +CONFIG_BLK_DEV_DM=m +# CONFIG_DM_DEBUG is not set +CONFIG_DM_CRYPT=m +CONFIG_DM_SNAPSHOT=m +CONFIG_DM_MIRROR=m +CONFIG_DM_ZERO=m +CONFIG_DM_MULTIPATH=m +# CONFIG_DM_DELAY is not set +# CONFIG_DM_UEVENT is not set +CONFIG_NETDEVICES=y +# CONFIG_DUMMY is not set +# CONFIG_BONDING is not set +# CONFIG_MACVLAN is not set +# CONFIG_EQUALIZER is not set +CONFIG_TUN=m +# CONFIG_VETH is not set +# CONFIG_ARCNET is not set +# CONFIG_NET_ETHERNET is not set +CONFIG_MII=m +# CONFIG_NETDEV_1000 is not set +# CONFIG_NETDEV_10000 is not set +# CONFIG_TR is not set + +# +# Wireless LAN +# +# CONFIG_WLAN_PRE80211 is not set +CONFIG_WLAN_80211=y +CONFIG_PCMCIA_RAYCS=m +CONFIG_LIBERTAS=m +CONFIG_LIBERTAS_CS=m +CONFIG_LIBERTAS_SDIO=m +# CONFIG_LIBERTAS_DEBUG is not set +CONFIG_LIBERTAS_THINFIRM=m +CONFIG_HERMES=m +CONFIG_PCMCIA_HERMES=m +CONFIG_PCMCIA_SPECTRUM=m +CONFIG_ATMEL=m +CONFIG_PCMCIA_ATMEL=m +CONFIG_AIRO_CS=m +CONFIG_PCMCIA_WL3501=m +CONFIG_MAC80211_HWSIM=m +CONFIG_P54_COMMON=m +# CONFIG_IWLWIFI_LEDS is not set +CONFIG_HOSTAP=m +CONFIG_HOSTAP_FIRMWARE=y +# CONFIG_HOSTAP_FIRMWARE_NVRAM is not set +CONFIG_HOSTAP_CS=m +CONFIG_B43=m +# CONFIG_B43_PCMCIA is not set +# CONFIG_B43_DEBUG is not set +CONFIG_B43LEGACY=m +# CONFIG_B43LEGACY_DEBUG is not set +CONFIG_B43LEGACY_DMA=y +CONFIG_B43LEGACY_PIO=y +CONFIG_B43LEGACY_DMA_AND_PIO_MODE=y +# CONFIG_B43LEGACY_DMA_MODE is not set +# CONFIG_B43LEGACY_PIO_MODE is not set +CONFIG_RT2X00=m +CONFIG_NET_PCMCIA=y +CONFIG_PCMCIA_3C589=m +CONFIG_PCMCIA_3C574=m +CONFIG_PCMCIA_FMVJ18X=m +CONFIG_PCMCIA_PCNET=m +CONFIG_PCMCIA_NMCLAN=m +CONFIG_PCMCIA_SMC91C92=m +CONFIG_PCMCIA_XIRC2PS=m +CONFIG_PCMCIA_AXNET=m +# CONFIG_WAN is not set +CONFIG_PPP=m +# CONFIG_PPP_MULTILINK is not set +# CONFIG_PPP_FILTER is not set +CONFIG_PPP_ASYNC=m +# CONFIG_PPP_SYNC_TTY is not set +CONFIG_PPP_DEFLATE=m +CONFIG_PPP_BSDCOMP=m +# CONFIG_PPP_MPPE is not set +# CONFIG_PPPOE is not set +# CONFIG_PPPOL2TP is not set +# CONFIG_SLIP is not set +CONFIG_SLHC=m +# CONFIG_NETCONSOLE is not set +# CONFIG_NETPOLL is not set +# CONFIG_NET_POLL_CONTROLLER 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 + +# +# Userland interfaces +# +CONFIG_INPUT_MOUSEDEV=m +# CONFIG_INPUT_MOUSEDEV_PSAUX is not set +CONFIG_INPUT_MOUSEDEV_SCREEN_X=640 +CONFIG_INPUT_MOUSEDEV_SCREEN_Y=480 +# CONFIG_INPUT_JOYDEV is not set +CONFIG_INPUT_EVDEV=y +# CONFIG_INPUT_EVBUG is not set +CONFIG_INPUT_APMPOWER=y + +# +# Input Device Drivers +# +CONFIG_INPUT_KEYBOARD=y +# CONFIG_KEYBOARD_ATKBD is not set +# CONFIG_KEYBOARD_SUNKBD is not set +# CONFIG_KEYBOARD_LKKBD is not set +CONFIG_KEYBOARD_LOCOMO=y +# CONFIG_KEYBOARD_XTKBD is not set +# CONFIG_KEYBOARD_NEWTON is not set +# CONFIG_KEYBOARD_STOWAWAY is not set +# CONFIG_KEYBOARD_GPIO is not set +# CONFIG_INPUT_MOUSE is not set +# CONFIG_INPUT_JOYSTICK is not set +# CONFIG_INPUT_TABLET is not set +CONFIG_INPUT_TOUCHSCREEN=y +# CONFIG_TOUCHSCREEN_ADS7846 is not set +# CONFIG_TOUCHSCREEN_FUJITSU is not set +# CONFIG_TOUCHSCREEN_GUNZE is not set +# CONFIG_TOUCHSCREEN_ELO is not set +# CONFIG_TOUCHSCREEN_MTOUCH is not set +# CONFIG_TOUCHSCREEN_INEXIO is not set +# CONFIG_TOUCHSCREEN_MK712 is not set +# CONFIG_TOUCHSCREEN_HTCPEN is not set +# CONFIG_TOUCHSCREEN_PENMOUNT is not set +# CONFIG_TOUCHSCREEN_TOUCHRIGHT is not set +# CONFIG_TOUCHSCREEN_TOUCHWIN is not set +# CONFIG_TOUCHSCREEN_UCB1200_TS is not set +CONFIG_TOUCHSCREEN_COLLIE_TS=y +# CONFIG_TOUCHSCREEN_USB_COMPOSITE is not set +# CONFIG_TOUCHSCREEN_TOUCHIT213 is not set +CONFIG_INPUT_MISC=y +# CONFIG_INPUT_ATI_REMOTE is not set +# CONFIG_INPUT_ATI_REMOTE2 is not set +# CONFIG_INPUT_KEYSPAN_REMOTE is not set +# CONFIG_INPUT_POWERMATE is not set +# CONFIG_INPUT_YEALINK is not set +# CONFIG_INPUT_CM109 is not set +CONFIG_INPUT_UINPUT=m + +# +# Hardware I/O ports +# +# CONFIG_SERIO is not set +# CONFIG_GAMEPORT is not set + +# +# Character devices +# +CONFIG_VT=y +CONFIG_CONSOLE_TRANSLATIONS=y +CONFIG_VT_CONSOLE=y +CONFIG_HW_CONSOLE=y +# CONFIG_VT_HW_CONSOLE_BINDING is not set +CONFIG_DEVKMEM=y +# CONFIG_SERIAL_NONSTANDARD is not set + +# +# Serial drivers +# +CONFIG_SERIAL_8250=m +# CONFIG_SERIAL_8250_CS is not set +CONFIG_SERIAL_8250_NR_UARTS=4 +CONFIG_SERIAL_8250_RUNTIME_UARTS=4 +# CONFIG_SERIAL_8250_EXTENDED is not set + +# +# Non-8250 serial port support +# +CONFIG_SERIAL_SA1100=y +CONFIG_SERIAL_SA1100_CONSOLE=y +CONFIG_SERIAL_CORE=y +CONFIG_SERIAL_CORE_CONSOLE=y +CONFIG_UNIX98_PTYS=y +# CONFIG_LEGACY_PTYS is not set +# CONFIG_IPMI_HANDLER is not set +CONFIG_HW_RANDOM=m +# CONFIG_NVRAM is not set +# CONFIG_DTLK is not set +# CONFIG_R3964 is not set + +# +# PCMCIA character devices +# +# CONFIG_SYNCLINK_CS is not set +# CONFIG_CARDMAN_4000 is not set +# CONFIG_CARDMAN_4040 is not set +# CONFIG_IPWIRELESS is not set +# CONFIG_RAW_DRIVER is not set +# CONFIG_TCG_TPM is not set +CONFIG_DEVPORT=y +# CONFIG_I2C is not set +CONFIG_SPI=y +# CONFIG_SPI_DEBUG is not set +CONFIG_SPI_MASTER=y + +# +# SPI Master Controller Drivers +# +# CONFIG_SPI_BITBANG is not set +CONFIG_SPI_LOCOMO=y + +# +# SPI Protocol Masters +# +# CONFIG_SPI_AT25 is not set +# CONFIG_SPI_SPIDEV is not set +# CONFIG_SPI_TLE62X0 is not set +CONFIG_ARCH_REQUIRE_GPIOLIB=y +CONFIG_GPIOLIB=y +# CONFIG_DEBUG_GPIO is not set +# CONFIG_GPIO_SYSFS is not set + +# +# Memory mapped GPIO expanders: +# + +# +# I2C GPIO expanders: +# + +# +# PCI GPIO expanders: +# + +# +# SPI GPIO expanders: +# +# CONFIG_GPIO_MAX7301 is not set +# CONFIG_GPIO_MCP23S08 is not set +# CONFIG_W1 is not set +CONFIG_POWER_SUPPLY=y +# CONFIG_POWER_SUPPLY_DEBUG is not set +CONFIG_PDA_POWER=y +CONFIG_APM_POWER=y +# CONFIG_BATTERY_DS2760 is not set +CONFIG_BATTERY_COLLIE=y +# CONFIG_HWMON is not set +# CONFIG_THERMAL is not set +# CONFIG_THERMAL_HWMON is not set +CONFIG_WATCHDOG=y +# CONFIG_WATCHDOG_NOWAYOUT is not set + +# +# Watchdog Device Drivers +# +# CONFIG_SOFT_WATCHDOG is not set +CONFIG_SA1100_WATCHDOG=m + +# +# ISA-based Watchdog Cards +# +# CONFIG_PCWATCHDOG is not set +# CONFIG_MIXCOMWD is not set +# CONFIG_WDT is not set +CONFIG_SSB_POSSIBLE=y + +# +# Sonics Silicon Backplane +# +CONFIG_SSB=m +CONFIG_SSB_PCMCIAHOST_POSSIBLE=y +# CONFIG_SSB_PCMCIAHOST is not set +# CONFIG_SSB_SILENT is not set +# CONFIG_SSB_DEBUG is not set + +# +# Multifunction device drivers +# +# CONFIG_MFD_CORE is not set +# CONFIG_MFD_SM501 is not set +# CONFIG_MFD_ASIC3 is not set +# CONFIG_HTC_EGPIO is not set +# CONFIG_HTC_PASIC3 is not set +# CONFIG_MFD_TMIO is not set +# CONFIG_MFD_T7L66XB is not set +# CONFIG_MFD_TC6387XB is not set +# CONFIG_MFD_TC6393XB is not set + +# +# Multimedia Capabilities Port drivers +# +CONFIG_MCP=y +CONFIG_MCP_SA11X0=y +CONFIG_MCP_UCB1200=y + +# +# Multimedia devices +# + +# +# Multimedia core support +# +# CONFIG_VIDEO_DEV is not set +# CONFIG_DVB_CORE is not set +# CONFIG_VIDEO_MEDIA is not set + +# +# Multimedia drivers +# +# CONFIG_DAB is not set + +# +# Graphics support +# +# 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 is not set +# CONFIG_FB_TILEBLITTING is not set + +# +# Frame buffer hardware drivers +# +CONFIG_FB_SA1100=y +# CONFIG_FB_S1D13XXX is not set +# CONFIG_FB_VIRTUAL is not set +# CONFIG_FB_METRONOME is not set +# CONFIG_FB_MB862XX is not set +CONFIG_BACKLIGHT_LCD_SUPPORT=y +# CONFIG_LCD_CLASS_DEVICE is not set +CONFIG_BACKLIGHT_CLASS_DEVICE=y +# CONFIG_BACKLIGHT_CORGI is not set +CONFIG_BACKLIGHT_LOCOMO=y + +# +# Display device support +# +# CONFIG_DISPLAY_SUPPORT is not set + +# +# Console display driver support +# +# CONFIG_VGA_CONSOLE is not set +# CONFIG_MDA_CONSOLE is not set +CONFIG_DUMMY_CONSOLE=y +CONFIG_FRAMEBUFFER_CONSOLE=y +# CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY is not set +CONFIG_FRAMEBUFFER_CONSOLE_ROTATION=y +CONFIG_FONTS=y +CONFIG_FONT_8x8=y +# CONFIG_FONT_8x16 is not set +# CONFIG_FONT_6x11 is not set +# CONFIG_FONT_7x14 is not set +# CONFIG_FONT_PEARL_8x8 is not set +# CONFIG_FONT_ACORN_8x8 is not set +# CONFIG_FONT_MINI_4x6 is not set +# CONFIG_FONT_SUN8x16 is not set +# CONFIG_FONT_SUN12x22 is not set +# CONFIG_FONT_10x18 is not set +CONFIG_LOGO=y +# CONFIG_LOGO_LINUX_MONO is not set +# CONFIG_LOGO_LINUX_VGA16 is not set +CONFIG_LOGO_LINUX_CLUT224=y +# CONFIG_SOUND is not set +# CONFIG_HID_SUPPORT is not set +CONFIG_HID=m +CONFIG_USB_SUPPORT=y +CONFIG_USB_ARCH_HAS_HCD=y +# CONFIG_USB_ARCH_HAS_OHCI is not set +# CONFIG_USB_ARCH_HAS_EHCI is not set +# CONFIG_USB is not set +# CONFIG_USB_OTG_WHITELIST is not set +# CONFIG_USB_OTG_BLACKLIST_HUB is not set +# CONFIG_USB_MUSB_HDRC is not set +# CONFIG_USB_GADGET_MUSB_HDRC is not set + +# +# NOTE: USB_STORAGE depends on SCSI but BLK_DEV_SD may also be needed; +# +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_SELECTED=y +# CONFIG_USB_GADGET_AT91 is not set +# CONFIG_USB_GADGET_ATMEL_USBA is not set +# CONFIG_USB_GADGET_FSL_USB2 is not set +# CONFIG_USB_GADGET_LH7A40X is not set +# CONFIG_USB_GADGET_OMAP is not set +# CONFIG_USB_GADGET_PXA25X is not set +# CONFIG_USB_GADGET_PXA27X is not set +# CONFIG_USB_GADGET_S3C2410 is not set +# CONFIG_USB_GADGET_M66592 is not set +# CONFIG_USB_GADGET_AMD5536UDC is not set +# CONFIG_USB_GADGET_FSL_QE is not set +# CONFIG_USB_GADGET_NET2280 is not set +# CONFIG_USB_GADGET_GOKU is not set +CONFIG_USB_GADGET_SA1100=y +CONFIG_USB_SA1100=y +# CONFIG_USB_GADGET_DUMMY_HCD is not set +# CONFIG_USB_GADGET_DUALSPEED is not set +CONFIG_USB_ZERO=m +CONFIG_USB_ETH=m +# CONFIG_USB_ETH_RNDIS is not set +CONFIG_USB_GADGETFS=m +CONFIG_USB_FILE_STORAGE=m +# CONFIG_USB_FILE_STORAGE_TEST is not set +CONFIG_USB_G_SERIAL=m +# CONFIG_USB_MIDI_GADGET is not set +CONFIG_USB_G_PRINTER=m +CONFIG_USB_CDC_COMPOSITE=m +CONFIG_MMC=y +# CONFIG_MMC_DEBUG is not set +CONFIG_MMC_UNSAFE_RESUME=y + +# +# MMC/SD/SDIO Card Drivers +# +CONFIG_MMC_BLOCK=y +# CONFIG_MMC_BLOCK_BOUNCE is not set +CONFIG_SDIO_UART=m +CONFIG_MMC_TEST=m + +# +# MMC/SD/SDIO Host Controller Drivers +# +CONFIG_MMC_SDHCI=y +CONFIG_MMC_SPI=y +# CONFIG_MEMSTICK is not set +# CONFIG_ACCESSIBILITY is not set +CONFIG_NEW_LEDS=y +CONFIG_LEDS_CLASS=y + +# +# LED drivers +# +CONFIG_LEDS_LOCOMO=y +# CONFIG_LEDS_GPIO is not set + +# +# LED Triggers +# +CONFIG_LEDS_TRIGGERS=y +CONFIG_LEDS_TRIGGER_TIMER=m +CONFIG_LEDS_TRIGGER_IDE_DISK=y +CONFIG_LEDS_TRIGGER_HEARTBEAT=m +CONFIG_LEDS_TRIGGER_BACKLIGHT=m +CONFIG_LEDS_TRIGGER_DEFAULT_ON=m +CONFIG_RTC_LIB=y +CONFIG_RTC_CLASS=y +CONFIG_RTC_HCTOSYS=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 + +# +# SPI RTC drivers +# +# 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 + +# +# 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_BQ4802 is not set +# CONFIG_RTC_DRV_V3020 is not set + +# +# on-CPU RTC drivers +# +# CONFIG_RTC_DRV_SA1100 is not set +# CONFIG_DMADEVICES is not set +# CONFIG_REGULATOR is not set +CONFIG_UIO=m +CONFIG_UIO_PDRV=m +CONFIG_UIO_PDRV_GENIRQ=m +CONFIG_UIO_SMX=m +CONFIG_UIO_SERCOS3=m + +# +# File systems +# +CONFIG_EXT2_FS=y +# CONFIG_EXT2_FS_XATTR is not set +# CONFIG_EXT2_FS_XIP is not set +CONFIG_EXT3_FS=y +# CONFIG_EXT3_FS_XATTR is not set +CONFIG_EXT4_FS=m +# CONFIG_EXT4DEV_COMPAT is not set +CONFIG_EXT4_FS_XATTR=y +# CONFIG_EXT4_FS_POSIX_ACL is not set +# CONFIG_EXT4_FS_SECURITY is not set +CONFIG_JBD=y +# CONFIG_JBD_DEBUG is not set +CONFIG_JBD2=m +# CONFIG_JBD2_DEBUG is not set +CONFIG_FS_MBCACHE=m +CONFIG_REISERFS_FS=m +# CONFIG_REISERFS_CHECK is not set +# CONFIG_REISERFS_PROC_INFO is not set +# CONFIG_REISERFS_FS_XATTR is not set +CONFIG_JFS_FS=m +# CONFIG_JFS_POSIX_ACL is not set +# CONFIG_JFS_SECURITY is not set +# CONFIG_JFS_DEBUG is not set +# CONFIG_JFS_STATISTICS is not set +CONFIG_FS_POSIX_ACL=y +CONFIG_FILE_LOCKING=y +CONFIG_XFS_FS=m +# CONFIG_XFS_QUOTA is not set +# CONFIG_XFS_POSIX_ACL is not set +# CONFIG_XFS_RT is not set +# CONFIG_XFS_DEBUG is not set +CONFIG_OCFS2_FS=m +CONFIG_OCFS2_FS_O2CB=m +CONFIG_OCFS2_FS_STATS=y +CONFIG_OCFS2_DEBUG_MASKLOG=y +# CONFIG_OCFS2_DEBUG_FS is not set +# CONFIG_OCFS2_COMPAT_JBD is not set +CONFIG_DNOTIFY=y +CONFIG_INOTIFY=y +CONFIG_INOTIFY_USER=y +# CONFIG_QUOTA is not set +# CONFIG_AUTOFS_FS is not set +# CONFIG_AUTOFS4_FS is not set +CONFIG_FUSE_FS=m + +# +# CD-ROM/DVD Filesystems +# +CONFIG_ISO9660_FS=m +# CONFIG_JOLIET is not set +# CONFIG_ZISOFS is not set +CONFIG_UDF_FS=m +CONFIG_UDF_NLS=y + +# +# DOS/FAT/NT Filesystems +# +CONFIG_FAT_FS=y +CONFIG_MSDOS_FS=m +CONFIG_VFAT_FS=y +CONFIG_FAT_DEFAULT_CODEPAGE=437 +CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1" +CONFIG_NTFS_FS=m +# CONFIG_NTFS_DEBUG is not set +# CONFIG_NTFS_RW 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 is not set +# CONFIG_HUGETLB_PAGE is not set +CONFIG_CONFIGFS_FS=m + +# +# Miscellaneous filesystems +# +# 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=y +CONFIG_JFFS2_FS_DEBUG=0 +CONFIG_JFFS2_FS_WRITEBUFFER=y +# CONFIG_JFFS2_FS_WBUF_VERIFY is not set +# CONFIG_JFFS2_SUMMARY is not set +# CONFIG_JFFS2_FS_XATTR is not set +CONFIG_JFFS2_COMPRESSION_OPTIONS=y +CONFIG_JFFS2_ZLIB=y +CONFIG_JFFS2_LZO=y +CONFIG_JFFS2_RTIME=y +CONFIG_JFFS2_RUBIN=y +# CONFIG_JFFS2_CMODE_NONE is not set +CONFIG_JFFS2_CMODE_PRIORITY=y +# CONFIG_JFFS2_CMODE_SIZE is not set +# CONFIG_JFFS2_CMODE_FAVOURLZO is not set +# CONFIG_UBIFS_FS is not set +CONFIG_CRAMFS=m +# 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_ROMFS_FS is not set +# CONFIG_SYSV_FS is not set +# CONFIG_UFS_FS is not set +CONFIG_NETWORK_FILESYSTEMS=y +CONFIG_NFS_FS=y +CONFIG_NFS_V3=y +# CONFIG_NFS_V3_ACL is not set +CONFIG_NFS_V4=y +CONFIG_NFSD=m +CONFIG_NFSD_V3=y +# CONFIG_NFSD_V3_ACL is not set +CONFIG_NFSD_V4=y +CONFIG_LOCKD=y +CONFIG_LOCKD_V4=y +CONFIG_EXPORTFS=m +CONFIG_NFS_COMMON=y +CONFIG_SUNRPC=y +CONFIG_SUNRPC_GSS=y +# CONFIG_SUNRPC_REGISTER_V4 is not set +CONFIG_RPCSEC_GSS_KRB5=y +# CONFIG_RPCSEC_GSS_SPKM3 is not set +CONFIG_SMB_FS=m +CONFIG_SMB_NLS_DEFAULT=y +CONFIG_SMB_NLS_REMOTE="cp437" +CONFIG_CIFS=m +# CONFIG_CIFS_STATS is not set +# CONFIG_CIFS_WEAK_PW_HASH is not set +# CONFIG_CIFS_XATTR is not set +# CONFIG_CIFS_DEBUG2 is not set +# CONFIG_CIFS_EXPERIMENTAL is not set +# CONFIG_NCP_FS is not set +# CONFIG_CODA_FS is not set +# CONFIG_AFS_FS is not set + +# +# Partition Types +# +CONFIG_PARTITION_ADVANCED=y +# CONFIG_ACORN_PARTITION is not set +# CONFIG_OSF_PARTITION is not set +# CONFIG_AMIGA_PARTITION is not set +# CONFIG_ATARI_PARTITION is not set +# CONFIG_MAC_PARTITION is not set +CONFIG_MSDOS_PARTITION=y +# CONFIG_BSD_DISKLABEL is not set +# CONFIG_MINIX_SUBPARTITION is not set +# CONFIG_SOLARIS_X86_PARTITION is not set +# CONFIG_UNIXWARE_DISKLABEL is not set +# CONFIG_LDM_PARTITION is not set +# CONFIG_SGI_PARTITION is not set +# CONFIG_ULTRIX_PARTITION is not set +# CONFIG_SUN_PARTITION is not set +# CONFIG_KARMA_PARTITION is not set +# CONFIG_EFI_PARTITION is not set +# CONFIG_SYSV68_PARTITION is not set +CONFIG_NLS=y +CONFIG_NLS_DEFAULT="cp437" +CONFIG_NLS_CODEPAGE_437=y +CONFIG_NLS_CODEPAGE_737=m +CONFIG_NLS_CODEPAGE_775=m +CONFIG_NLS_CODEPAGE_850=m +CONFIG_NLS_CODEPAGE_852=m +CONFIG_NLS_CODEPAGE_855=m +CONFIG_NLS_CODEPAGE_857=m +CONFIG_NLS_CODEPAGE_860=m +CONFIG_NLS_CODEPAGE_861=m +CONFIG_NLS_CODEPAGE_862=m +CONFIG_NLS_CODEPAGE_863=m +CONFIG_NLS_CODEPAGE_864=m +CONFIG_NLS_CODEPAGE_865=m +CONFIG_NLS_CODEPAGE_866=m +CONFIG_NLS_CODEPAGE_869=m +CONFIG_NLS_CODEPAGE_936=m +CONFIG_NLS_CODEPAGE_950=m +CONFIG_NLS_CODEPAGE_932=m +CONFIG_NLS_CODEPAGE_949=m +CONFIG_NLS_CODEPAGE_874=m +CONFIG_NLS_ISO8859_8=m +CONFIG_NLS_CODEPAGE_1250=m +CONFIG_NLS_CODEPAGE_1251=m +CONFIG_NLS_ASCII=m +CONFIG_NLS_ISO8859_1=y +CONFIG_NLS_ISO8859_2=m +CONFIG_NLS_ISO8859_3=m +CONFIG_NLS_ISO8859_4=m +CONFIG_NLS_ISO8859_5=m +CONFIG_NLS_ISO8859_6=m +CONFIG_NLS_ISO8859_7=m +CONFIG_NLS_ISO8859_9=m +CONFIG_NLS_ISO8859_13=m +CONFIG_NLS_ISO8859_14=m +CONFIG_NLS_ISO8859_15=m +CONFIG_NLS_KOI8_R=m +CONFIG_NLS_KOI8_U=m +CONFIG_NLS_UTF8=y +# CONFIG_DLM is not set + +# +# Kernel hacking +# +# CONFIG_PRINTK_TIME is not set +CONFIG_ENABLE_WARN_DEPRECATED=y +CONFIG_ENABLE_MUST_CHECK=y +CONFIG_FRAME_WARN=1024 +CONFIG_MAGIC_SYSRQ=y +# CONFIG_UNUSED_SYMBOLS is not set +CONFIG_DEBUG_FS=y +# CONFIG_HEADERS_CHECK is not set +CONFIG_DEBUG_KERNEL=y +# CONFIG_DEBUG_SHIRQ is not set +# CONFIG_DETECT_SOFTLOCKUP is not set +# CONFIG_SCHED_DEBUG is not set +# CONFIG_SCHEDSTATS is not set +CONFIG_TIMER_STATS=y +# CONFIG_DEBUG_OBJECTS is not set +# CONFIG_DEBUG_SLAB is not set +# CONFIG_DEBUG_PREEMPT is not set +# 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_SPINLOCK_SLEEP is not set +# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set +# CONFIG_DEBUG_KOBJECT is not set +CONFIG_DEBUG_BUGVERBOSE=y +# CONFIG_DEBUG_INFO 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_DEBUG_SG is not set +CONFIG_FRAME_POINTER=y +# CONFIG_BOOT_PRINTK_DELAY is not set +# CONFIG_RCU_TORTURE_TEST is not set +# CONFIG_RCU_CPU_STALL_DETECTOR is not set +# CONFIG_BACKTRACE_SELF_TEST is not set +# CONFIG_DEBUG_BLOCK_EXT_DEVT is not set +# CONFIG_FAULT_INJECTION is not set +# CONFIG_LATENCYTOP is not set +CONFIG_SYSCTL_SYSCALL_CHECK=y +CONFIG_HAVE_FUNCTION_TRACER=y + +# +# Tracers +# +# CONFIG_FUNCTION_TRACER is not set +# CONFIG_IRQSOFF_TRACER is not set +# CONFIG_PREEMPT_TRACER is not set +# CONFIG_SCHED_TRACER is not set +# CONFIG_CONTEXT_SWITCH_TRACER is not set +# CONFIG_BOOT_TRACER is not set +# CONFIG_STACK_TRACER is not set +# CONFIG_DYNAMIC_PRINTK_DEBUG is not set +# CONFIG_SAMPLES is not set +CONFIG_HAVE_ARCH_KGDB=y +# CONFIG_KGDB is not set +# CONFIG_DEBUG_USER is not set +CONFIG_DEBUG_ERRORS=y +# CONFIG_DEBUG_STACK_USAGE is not set +# CONFIG_DEBUG_LL is not set + +# +# Security options +# +# CONFIG_KEYS is not set +# CONFIG_SECURITY is not set +# CONFIG_SECURITYFS is not set +# CONFIG_SECURITY_FILE_CAPABILITIES is not set +CONFIG_CRYPTO=y + +# +# Crypto core or helper +# +# CONFIG_CRYPTO_FIPS is not set +CONFIG_CRYPTO_ALGAPI=y +CONFIG_CRYPTO_ALGAPI2=y +CONFIG_CRYPTO_AEAD=m +CONFIG_CRYPTO_AEAD2=y +CONFIG_CRYPTO_BLKCIPHER=y +CONFIG_CRYPTO_BLKCIPHER2=y +CONFIG_CRYPTO_HASH=m +CONFIG_CRYPTO_HASH2=y +CONFIG_CRYPTO_RNG2=y +CONFIG_CRYPTO_MANAGER=y +CONFIG_CRYPTO_MANAGER2=y +# CONFIG_CRYPTO_GF128MUL is not set +CONFIG_CRYPTO_NULL=m +# CONFIG_CRYPTO_CRYPTD is not set +CONFIG_CRYPTO_AUTHENC=m +CONFIG_CRYPTO_TEST=m + +# +# 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=m +# CONFIG_CRYPTO_XTS is not set + +# +# Hash modes +# +CONFIG_CRYPTO_HMAC=m +# CONFIG_CRYPTO_XCBC is not set + +# +# Digest +# +CONFIG_CRYPTO_CRC32C=m +CONFIG_CRYPTO_MD4=m +CONFIG_CRYPTO_MD5=y +CONFIG_CRYPTO_MICHAEL_MIC=y +# 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=m +CONFIG_CRYPTO_SHA256=m +CONFIG_CRYPTO_SHA512=m +# CONFIG_CRYPTO_TGR192 is not set +CONFIG_CRYPTO_WP512=m + +# +# Ciphers +# +CONFIG_CRYPTO_AES=y +CONFIG_CRYPTO_ANUBIS=m +CONFIG_CRYPTO_ARC4=y +CONFIG_CRYPTO_BLOWFISH=m +CONFIG_CRYPTO_CAMELLIA=m +CONFIG_CRYPTO_CAST5=m +CONFIG_CRYPTO_CAST6=m +CONFIG_CRYPTO_DES=y +# CONFIG_CRYPTO_FCRYPT is not set +CONFIG_CRYPTO_KHAZAD=m +# CONFIG_CRYPTO_SALSA20 is not set +# CONFIG_CRYPTO_SEED is not set +CONFIG_CRYPTO_SERPENT=m +CONFIG_CRYPTO_TEA=m +CONFIG_CRYPTO_TWOFISH=m +CONFIG_CRYPTO_TWOFISH_COMMON=m + +# +# Compression +# +CONFIG_CRYPTO_DEFLATE=m +CONFIG_CRYPTO_LZO=m + +# +# Random Number Generation +# +# CONFIG_CRYPTO_ANSI_CPRNG is not set +# CONFIG_CRYPTO_HW is not set + +# +# Library routines +# +CONFIG_BITREVERSE=y +CONFIG_CRC_CCITT=y +CONFIG_CRC16=m +# CONFIG_CRC_T10DIF is not set +CONFIG_CRC_ITU_T=y +CONFIG_CRC32=y +CONFIG_CRC7=y +CONFIG_LIBCRC32C=m +CONFIG_ZLIB_INFLATE=y +CONFIG_ZLIB_DEFLATE=y +CONFIG_LZO_COMPRESS=y +CONFIG_LZO_DECOMPRESS=y +CONFIG_PLIST=y +CONFIG_HAS_IOMEM=y +CONFIG_HAS_IOPORT=y +CONFIG_HAS_DMA=y diff --git a/packages/linux/linux-2.6.28/at91sam9263ek/linux-2.6.28-at91.patch.bz2 b/packages/linux/linux-2.6.28/linux-2.6.28-at91.patch.bz2 Binary files differindex 7069c54dd4..7069c54dd4 100644 --- a/packages/linux/linux-2.6.28/at91sam9263ek/linux-2.6.28-at91.patch.bz2 +++ b/packages/linux/linux-2.6.28/linux-2.6.28-at91.patch.bz2 diff --git a/packages/linux/linux-2.6.28/at91sam9263ek/linux-2.6.28-exp.patch.bz2 b/packages/linux/linux-2.6.28/linux-2.6.28-exp.patch.bz2 Binary files differindex 9417b3aab6..9417b3aab6 100644 --- a/packages/linux/linux-2.6.28/at91sam9263ek/linux-2.6.28-exp.patch.bz2 +++ b/packages/linux/linux-2.6.28/linux-2.6.28-exp.patch.bz2 diff --git a/packages/linux/linux-2.6.28/ronetix-pm9263/defconfig b/packages/linux/linux-2.6.28/ronetix-pm9263/defconfig new file mode 100644 index 0000000000..ec5bf7a39a --- /dev/null +++ b/packages/linux/linux-2.6.28/ronetix-pm9263/defconfig @@ -0,0 +1,1438 @@ +# +# Automatically generated make config: don't edit +# Linux kernel version: 2.6.28 +# Tue Dec 30 15:28:55 2008 +# +CONFIG_ARM=y +CONFIG_SYS_SUPPORTS_APM_EMULATION=y +CONFIG_GENERIC_GPIO=y +CONFIG_GENERIC_TIME=y +CONFIG_GENERIC_CLOCKEVENTS=y +CONFIG_MMU=y +# CONFIG_NO_IOPORT is not set +CONFIG_GENERIC_HARDIRQS=y +CONFIG_STACKTRACE_SUPPORT=y +CONFIG_HAVE_LATENCYTOP_SUPPORT=y +CONFIG_LOCKDEP_SUPPORT=y +CONFIG_TRACE_IRQFLAGS_SUPPORT=y +CONFIG_HARDIRQS_SW_RESEND=y +CONFIG_GENERIC_IRQ_PROBE=y +CONFIG_RWSEM_GENERIC_SPINLOCK=y +# CONFIG_ARCH_HAS_ILOG2_U32 is not set +# CONFIG_ARCH_HAS_ILOG2_U64 is not set +CONFIG_GENERIC_HWEIGHT=y +CONFIG_GENERIC_CALIBRATE_DELAY=y +CONFIG_GENERIC_HARDIRQS_NO__DO_IRQ=y +CONFIG_VECTORS_BASE=0xffff0000 +CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" + +# +# General setup +# +CONFIG_EXPERIMENTAL=y +CONFIG_BROKEN_ON_SMP=y +CONFIG_INIT_ENV_ARG_LIMIT=32 +CONFIG_LOCALVERSION="-pm9263" +# CONFIG_LOCALVERSION_AUTO is not set +# CONFIG_SWAP is not set +CONFIG_SYSVIPC=y +CONFIG_SYSVIPC_SYSCTL=y +# CONFIG_POSIX_MQUEUE is not set +# CONFIG_BSD_PROCESS_ACCT is not set +# CONFIG_TASKSTATS is not set +# CONFIG_AUDIT is not set +# CONFIG_IKCONFIG is not set +CONFIG_LOG_BUF_SHIFT=14 +# CONFIG_CGROUPS is not set +# CONFIG_GROUP_SCHED is not set +CONFIG_SYSFS_DEPRECATED=y +CONFIG_SYSFS_DEPRECATED_V2=y +# CONFIG_RELAY is not set +CONFIG_NAMESPACES=y +# CONFIG_UTS_NS is not set +# CONFIG_IPC_NS is not set +# CONFIG_USER_NS is not set +# CONFIG_PID_NS is not set +CONFIG_BLK_DEV_INITRD=y +CONFIG_INITRAMFS_SOURCE="" +CONFIG_CC_OPTIMIZE_FOR_SIZE=y +CONFIG_SYSCTL=y +# CONFIG_EMBEDDED is not set +CONFIG_UID16=y +CONFIG_SYSCTL_SYSCALL=y +CONFIG_KALLSYMS=y +# CONFIG_KALLSYMS_ALL is not set +# CONFIG_KALLSYMS_EXTRA_PASS is not set +CONFIG_HOTPLUG=y +CONFIG_PRINTK=y +CONFIG_BUG=y +CONFIG_ELF_CORE=y +CONFIG_COMPAT_BRK=y +CONFIG_BASE_FULL=y +CONFIG_FUTEX=y +CONFIG_ANON_INODES=y +CONFIG_EPOLL=y +CONFIG_SIGNALFD=y +CONFIG_TIMERFD=y +CONFIG_EVENTFD=y +CONFIG_SHMEM=y +CONFIG_AIO=y +CONFIG_VM_EVENT_COUNTERS=y +CONFIG_SLAB=y +# CONFIG_SLUB is not set +# CONFIG_SLOB is not set +# CONFIG_PROFILING is not set +# CONFIG_MARKERS is not set +CONFIG_HAVE_OPROFILE=y +# CONFIG_KPROBES is not set +CONFIG_HAVE_KPROBES=y +CONFIG_HAVE_KRETPROBES=y +CONFIG_HAVE_CLK=y +CONFIG_HAVE_GENERIC_DMA_COHERENT=y +CONFIG_SLABINFO=y +CONFIG_RT_MUTEXES=y +# CONFIG_TINY_SHMEM is not set +CONFIG_BASE_SMALL=0 +CONFIG_MODULES=y +# CONFIG_MODULE_FORCE_LOAD is not set +CONFIG_MODULE_UNLOAD=y +# CONFIG_MODULE_FORCE_UNLOAD is not set +# CONFIG_MODVERSIONS is not set +# CONFIG_MODULE_SRCVERSION_ALL is not set +CONFIG_KMOD=y +CONFIG_BLOCK=y +# CONFIG_LBD is not set +# CONFIG_BLK_DEV_IO_TRACE is not set +# CONFIG_LSF is not set +# CONFIG_BLK_DEV_BSG is not set +# CONFIG_BLK_DEV_INTEGRITY is not set + +# +# IO Schedulers +# +CONFIG_IOSCHED_NOOP=y +CONFIG_IOSCHED_AS=y +# CONFIG_IOSCHED_DEADLINE is not set +# CONFIG_IOSCHED_CFQ is not set +CONFIG_DEFAULT_AS=y +# CONFIG_DEFAULT_DEADLINE is not set +# CONFIG_DEFAULT_CFQ is not set +# CONFIG_DEFAULT_NOOP is not set +CONFIG_DEFAULT_IOSCHED="anticipatory" +CONFIG_CLASSIC_RCU=y +# CONFIG_FREEZER is not set + +# +# System Type +# +# CONFIG_ARCH_AAEC2000 is not set +# CONFIG_ARCH_INTEGRATOR is not set +# CONFIG_ARCH_REALVIEW is not set +# CONFIG_ARCH_VERSATILE is not set +CONFIG_ARCH_AT91=y +# CONFIG_ARCH_CLPS7500 is not set +# CONFIG_ARCH_CLPS711X 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_H720X is not set +# CONFIG_ARCH_IMX is not set +# CONFIG_ARCH_IOP13XX is not set +# CONFIG_ARCH_IOP32X is not set +# CONFIG_ARCH_IOP33X is not set +# CONFIG_ARCH_IXP23XX is not set +# CONFIG_ARCH_IXP2000 is not set +# CONFIG_ARCH_IXP4XX is not set +# CONFIG_ARCH_L7200 is not set +# CONFIG_ARCH_KIRKWOOD is not set +# CONFIG_ARCH_KS8695 is not set +# CONFIG_ARCH_NS9XXX is not set +# CONFIG_ARCH_LOKI is not set +# CONFIG_ARCH_MV78XX0 is not set +# CONFIG_ARCH_MXC is not set +# CONFIG_ARCH_ORION5X is not set +# CONFIG_ARCH_PNX4008 is not set +# CONFIG_ARCH_PXA is not set +# CONFIG_ARCH_RPC is not set +# CONFIG_ARCH_SA1100 is not set +# CONFIG_ARCH_S3C2410 is not set +# CONFIG_ARCH_SHARK is not set +# CONFIG_ARCH_LH7A40X is not set +# CONFIG_ARCH_DAVINCI is not set +# CONFIG_ARCH_OMAP is not set +# CONFIG_ARCH_MSM is not set + +# +# Boot options +# + +# +# Power management +# + +# +# Atmel AT91 System-on-Chip +# +# CONFIG_ARCH_AT91RM9200 is not set +# CONFIG_ARCH_AT91SAM9260 is not set +# CONFIG_ARCH_AT91SAM9261 is not set +CONFIG_ARCH_AT91SAM9263=y +# CONFIG_ARCH_AT91SAM9RL is not set +# CONFIG_ARCH_AT91SAM9G20 is not set +# CONFIG_ARCH_AT91CAP9 is not set +# CONFIG_ARCH_AT91X40 is not set +CONFIG_AT91_PMC_UNIT=y + +# +# AT91SAM9263 Board Type +# +# CONFIG_MACH_AT91SAM9263EK is not set +# CONFIG_MACH_USB_A9263 is not set +# CONFIG_MACH_CSB737 is not set +# CONFIG_MACH_TOTEMNOVA is not set +# CONFIG_MACH_NEOCORE926 is not set +CONFIG_MACH_PM9263=y + +# +# AT91 Board Options +# +CONFIG_MTD_AT91_DATAFLASH_CARD=y +# CONFIG_MTD_NAND_ATMEL_BUSWIDTH_16 is not set + +# +# AT91 Feature Selections +# +# CONFIG_AT91_PROGRAMMABLE_CLOCKS is not set +CONFIG_AT91_TIMER_HZ=100 +CONFIG_AT91_EARLY_DBGU=y +# CONFIG_AT91_EARLY_USART0 is not set +# CONFIG_AT91_EARLY_USART1 is not set +# CONFIG_AT91_EARLY_USART2 is not set +# CONFIG_AT91_EARLY_USART3 is not set +# CONFIG_AT91_EARLY_USART4 is not set +# CONFIG_AT91_EARLY_USART5 is not set + +# +# Processor Type +# +CONFIG_CPU_32=y +CONFIG_CPU_ARM926T=y +CONFIG_CPU_32v5=y +CONFIG_CPU_ABRT_EV5TJ=y +CONFIG_CPU_PABRT_NOIFAR=y +CONFIG_CPU_CACHE_VIVT=y +CONFIG_CPU_COPY_V4WB=y +CONFIG_CPU_TLB_V4WBI=y +CONFIG_CPU_CP15=y +CONFIG_CPU_CP15_MMU=y + +# +# Processor Features +# +# CONFIG_ARM_THUMB is not set +# CONFIG_CPU_ICACHE_DISABLE is not set +# CONFIG_CPU_DCACHE_DISABLE is not set +# CONFIG_CPU_DCACHE_WRITETHROUGH is not set +# CONFIG_CPU_CACHE_ROUND_ROBIN is not set +# CONFIG_OUTER_CACHE is not set + +# +# Bus support +# +# CONFIG_PCI_SYSCALL is not set +# CONFIG_ARCH_SUPPORTS_MSI is not set +CONFIG_PCCARD=y +# CONFIG_PCMCIA_DEBUG is not set +CONFIG_PCMCIA=y +CONFIG_PCMCIA_LOAD_CIS=y +CONFIG_PCMCIA_IOCTL=y + +# +# PC-card bridges +# +CONFIG_AT91_CF=y + +# +# Kernel Features +# +# CONFIG_NO_HZ is not set +# CONFIG_HIGH_RES_TIMERS is not set +CONFIG_GENERIC_CLOCKEVENTS_BUILD=y +CONFIG_VMSPLIT_3G=y +# CONFIG_VMSPLIT_2G is not set +# CONFIG_VMSPLIT_1G is not set +CONFIG_PAGE_OFFSET=0xC0000000 +# CONFIG_PREEMPT is not set +CONFIG_HZ=100 +# CONFIG_AEABI is not set +CONFIG_ARCH_FLATMEM_HAS_HOLES=y +# CONFIG_ARCH_SPARSEMEM_DEFAULT is not set +# CONFIG_ARCH_SELECT_MEMORY_MODEL is not set +CONFIG_SELECT_MEMORY_MODEL=y +CONFIG_FLATMEM_MANUAL=y +# CONFIG_DISCONTIGMEM_MANUAL is not set +# CONFIG_SPARSEMEM_MANUAL is not set +CONFIG_FLATMEM=y +CONFIG_FLAT_NODE_MEM_MAP=y +CONFIG_PAGEFLAGS_EXTENDED=y +CONFIG_SPLIT_PTLOCK_CPUS=4096 +# CONFIG_RESOURCES_64BIT is not set +# CONFIG_PHYS_ADDR_T_64BIT is not set +CONFIG_ZONE_DMA_FLAG=0 +CONFIG_VIRT_TO_BUS=y +CONFIG_UNEVICTABLE_LRU=y +# CONFIG_LEDS is not set +CONFIG_ALIGNMENT_TRAP=y + +# +# Boot options +# +CONFIG_ZBOOT_ROM_TEXT=0x0 +CONFIG_ZBOOT_ROM_BSS=0x0 +CONFIG_CMDLINE="mem=64M console=ttyS0,115200 initrd=0x21100000,3145728 root=/dev/ram0 rw" +# CONFIG_XIP_KERNEL is not set +# CONFIG_KEXEC is not set + +# +# CPU Power Management +# +# CONFIG_CPU_IDLE is not set + +# +# Floating point emulation +# + +# +# At least one emulation must be selected +# +CONFIG_FPE_NWFPE=y +# CONFIG_FPE_NWFPE_XP is not set +# CONFIG_FPE_FASTFPE is not set +# CONFIG_VFP is not set + +# +# Userspace binary formats +# +CONFIG_BINFMT_ELF=y +# CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set +CONFIG_HAVE_AOUT=y +# CONFIG_BINFMT_AOUT is not set +# CONFIG_BINFMT_MISC is not set +# CONFIG_ARTHUR is not set + +# +# Power management options +# +# CONFIG_PM is not set +CONFIG_ARCH_SUSPEND_POSSIBLE=y +CONFIG_NET=y + +# +# Networking options +# +CONFIG_PACKET=y +# CONFIG_PACKET_MMAP is not set +CONFIG_UNIX=y +# CONFIG_NET_KEY is not set +CONFIG_INET=y +# CONFIG_IP_MULTICAST is not set +# CONFIG_IP_ADVANCED_ROUTER is not set +CONFIG_IP_FIB_HASH=y +CONFIG_IP_PNP=y +# CONFIG_IP_PNP_DHCP is not set +CONFIG_IP_PNP_BOOTP=y +CONFIG_IP_PNP_RARP=y +# CONFIG_NET_IPIP is not set +# CONFIG_NET_IPGRE is not set +# CONFIG_ARPD is not set +# CONFIG_SYN_COOKIES is not set +# CONFIG_INET_AH is not set +# CONFIG_INET_ESP is not set +# CONFIG_INET_IPCOMP is not set +# CONFIG_INET_XFRM_TUNNEL is not set +# CONFIG_INET_TUNNEL is not set +# CONFIG_INET_XFRM_MODE_TRANSPORT is not set +# CONFIG_INET_XFRM_MODE_TUNNEL is not set +# CONFIG_INET_XFRM_MODE_BEET is not set +# CONFIG_INET_LRO is not set +# CONFIG_INET_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 is not set +# CONFIG_NETWORK_SECMARK is not set +# CONFIG_NETFILTER is not set +# CONFIG_IP_DCCP is not set +# CONFIG_IP_SCTP is not set +# CONFIG_TIPC is not set +# CONFIG_ATM is not set +# CONFIG_BRIDGE is not set +# CONFIG_NET_DSA is not set +# CONFIG_VLAN_8021Q is not set +# CONFIG_DECNET is not set +# 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_ECONET is not set +# CONFIG_WAN_ROUTER is not set +# CONFIG_NET_SCHED is not set + +# +# Network testing +# +# CONFIG_NET_PKTGEN 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_PHONET is not set +CONFIG_WIRELESS=y +# CONFIG_CFG80211 is not set +CONFIG_WIRELESS_OLD_REGULATORY=y +# CONFIG_WIRELESS_EXT is not set +# CONFIG_MAC80211 is not set +# CONFIG_IEEE80211 is not set +# CONFIG_RFKILL is not set +# CONFIG_NET_9P is not set + +# +# Device Drivers +# + +# +# Generic Driver Options +# +CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" +CONFIG_STANDALONE=y +CONFIG_PREVENT_FIRMWARE_BUILD=y +CONFIG_FW_LOADER=y +CONFIG_FIRMWARE_IN_KERNEL=y +CONFIG_EXTRA_FIRMWARE="" +# CONFIG_DEBUG_DRIVER is not set +# CONFIG_DEBUG_DEVRES is not set +# CONFIG_SYS_HYPERVISOR is not set +# CONFIG_CONNECTOR is not set +CONFIG_MTD=y +# CONFIG_MTD_DEBUG is not set +# CONFIG_MTD_CONCAT is not set +CONFIG_MTD_PARTITIONS=y +# CONFIG_MTD_REDBOOT_PARTS is not set +CONFIG_MTD_CMDLINE_PARTS=y +# CONFIG_MTD_AFS_PARTS is not set +# CONFIG_MTD_AR7_PARTS is not set + +# +# User Modules And Translation Layers +# +CONFIG_MTD_CHAR=y +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_MTD_OOPS is not set + +# +# RAM/ROM/Flash chip drivers +# +CONFIG_MTD_CFI=y +CONFIG_MTD_JEDECPROBE=y +CONFIG_MTD_GEN_PROBE=y +# CONFIG_MTD_CFI_ADV_OPTIONS 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_CFI_INTELEXT=y +CONFIG_MTD_CFI_AMDSTD=y +CONFIG_MTD_CFI_STAA=y +CONFIG_MTD_CFI_UTIL=y +CONFIG_MTD_RAM=y +CONFIG_MTD_ROM=y +CONFIG_MTD_ABSENT=y + +# +# Mapping drivers for chip access +# +CONFIG_MTD_COMPLEX_MAPPINGS=y +CONFIG_MTD_PHYSMAP=y +CONFIG_MTD_PHYSMAP_START=0x10000000 +CONFIG_MTD_PHYSMAP_LEN=0x400000 +CONFIG_MTD_PHYSMAP_BANKWIDTH=2 +# CONFIG_MTD_ARM_INTEGRATOR is not set +# CONFIG_MTD_IMPA7 is not set +# CONFIG_MTD_PLATRAM is not set + +# +# Self-contained MTD device drivers +# +CONFIG_MTD_DATAFLASH=y +# CONFIG_MTD_DATAFLASH_WRITE_VERIFY is not set +# CONFIG_MTD_DATAFLASH_OTP is not set +# CONFIG_MTD_M25P80 is not set +# CONFIG_MTD_SLRAM is not set +# CONFIG_MTD_PHRAM is not set +# CONFIG_MTD_MTDRAM is not set +# CONFIG_MTD_BLOCK2MTD is not set + +# +# Disk-On-Chip Device Drivers +# +# CONFIG_MTD_DOC2000 is not set +# CONFIG_MTD_DOC2001 is not set +# CONFIG_MTD_DOC2001PLUS is not set +CONFIG_MTD_NAND=y +CONFIG_MTD_NAND_VERIFY_WRITE=y +# CONFIG_MTD_NAND_ECC_SMC is not set +# CONFIG_MTD_NAND_MUSEUM_IDS is not set +# CONFIG_MTD_NAND_GPIO is not set +CONFIG_MTD_NAND_IDS=y +# CONFIG_MTD_NAND_DISKONCHIP is not set +CONFIG_MTD_NAND_ATMEL=y +# CONFIG_MTD_NAND_ATMEL_ECC_HW is not set +CONFIG_MTD_NAND_ATMEL_ECC_SOFT=y +# CONFIG_MTD_NAND_ATMEL_ECC_NONE is not set +# CONFIG_MTD_NAND_NANDSIM is not set +# CONFIG_MTD_NAND_PLATFORM is not set +# CONFIG_MTD_ALAUDA is not set +# CONFIG_MTD_ONENAND is not set + +# +# UBI - Unsorted block images +# +# CONFIG_MTD_UBI is not set +# CONFIG_PARPORT is not set +CONFIG_BLK_DEV=y +# CONFIG_BLK_DEV_COW_COMMON is not set +CONFIG_BLK_DEV_LOOP=y +# CONFIG_BLK_DEV_CRYPTOLOOP is not set +# CONFIG_BLK_DEV_NBD is not set +# CONFIG_BLK_DEV_UB is not set +CONFIG_BLK_DEV_RAM=y +CONFIG_BLK_DEV_RAM_COUNT=16 +CONFIG_BLK_DEV_RAM_SIZE=8192 +# CONFIG_BLK_DEV_XIP is not set +# CONFIG_CDROM_PKTCDVD is not set +# CONFIG_ATA_OVER_ETH is not set +CONFIG_MISC_DEVICES=y +CONFIG_ATMEL_PWM=y +# CONFIG_ATMEL_TCLIB is not set +# CONFIG_EEPROM_93CX6 is not set +CONFIG_ATMEL_SSC=y +# CONFIG_ENCLOSURE_SERVICES is not set +# CONFIG_C2PORT is not set +CONFIG_HAVE_IDE=y +CONFIG_IDE=y + +# +# Please see Documentation/ide/ide.txt for help/info on IDE drives +# +# CONFIG_BLK_DEV_IDE_SATA is not set +CONFIG_IDE_GD=y +CONFIG_IDE_GD_ATA=y +# CONFIG_IDE_GD_ATAPI is not set +CONFIG_BLK_DEV_IDECS=y +# CONFIG_BLK_DEV_IDECD is not set +# CONFIG_BLK_DEV_IDETAPE is not set +# CONFIG_BLK_DEV_IDESCSI is not set +# CONFIG_IDE_TASK_IOCTL is not set +CONFIG_IDE_PROC_FS=y + +# +# IDE chipset support/bugfixes +# +# CONFIG_BLK_DEV_PLATFORM is not set +# CONFIG_BLK_DEV_IDEDMA is not set + +# +# SCSI device support +# +# CONFIG_RAID_ATTRS is not set +CONFIG_SCSI=y +CONFIG_SCSI_DMA=y +# CONFIG_SCSI_TGT is not set +# 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=y +# CONFIG_BLK_DEV_SR_VENDOR is not set +# CONFIG_CHR_DEV_SG is not set +# CONFIG_CHR_DEV_SCH is not set + +# +# Some SCSI devices (e.g. CD jukebox) support multiple LUNs +# +CONFIG_SCSI_MULTI_LUN=y +# CONFIG_SCSI_CONSTANTS is not set +# CONFIG_SCSI_LOGGING is not set +# CONFIG_SCSI_SCAN_ASYNC is not set +CONFIG_SCSI_WAIT_SCAN=m + +# +# 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_LIBSAS is not set +# CONFIG_SCSI_SRP_ATTRS is not set +CONFIG_SCSI_LOWLEVEL=y +# CONFIG_ISCSI_TCP is not set +# CONFIG_SCSI_DEBUG is not set +# CONFIG_SCSI_LOWLEVEL_PCMCIA is not set +# CONFIG_SCSI_DH is not set +# CONFIG_ATA is not set +# CONFIG_MD is not set +CONFIG_NETDEVICES=y +# CONFIG_DUMMY is not set +# CONFIG_BONDING is not set +# CONFIG_MACVLAN is not set +# CONFIG_EQUALIZER is not set +# CONFIG_TUN is not set +# CONFIG_VETH is not set +CONFIG_PHYLIB=y + +# +# MII PHY device drivers +# +# 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_ICPLUS_PHY is not set +# CONFIG_REALTEK_PHY is not set +# CONFIG_FIXED_PHY is not set +# CONFIG_MDIO_BITBANG is not set +CONFIG_NET_ETHERNET=y +CONFIG_MII=y +CONFIG_MACB=y +# CONFIG_AX88796 is not set +# CONFIG_SMC91X is not set +# CONFIG_DM9000 is not set +# CONFIG_ENC28J60 is not set +# CONFIG_SMC911X is not set +# CONFIG_IBM_NEW_EMAC_ZMII is not set +# CONFIG_IBM_NEW_EMAC_RGMII is not set +# CONFIG_IBM_NEW_EMAC_TAH is not set +# CONFIG_IBM_NEW_EMAC_EMAC4 is not set +# CONFIG_IBM_NEW_EMAC_NO_FLOW_CTRL is not set +# CONFIG_IBM_NEW_EMAC_MAL_CLR_ICINTSTAT is not set +# CONFIG_IBM_NEW_EMAC_MAL_COMMON_ERR is not set +# CONFIG_B44 is not set +# CONFIG_NETDEV_1000 is not set +# CONFIG_NETDEV_10000 is not set + +# +# Wireless LAN +# +# CONFIG_WLAN_PRE80211 is not set +# CONFIG_WLAN_80211 is not set +# CONFIG_IWLWIFI_LEDS is not set + +# +# 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_USBNET is not set +# CONFIG_NET_PCMCIA is not set +# CONFIG_WAN is not set +# CONFIG_PPP is not set +# CONFIG_SLIP is not set +# CONFIG_NETCONSOLE is not set +# CONFIG_NETPOLL is not set +# CONFIG_NET_POLL_CONTROLLER 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 + +# +# Userland interfaces +# +CONFIG_INPUT_MOUSEDEV=y +# CONFIG_INPUT_MOUSEDEV_PSAUX is not set +CONFIG_INPUT_MOUSEDEV_SCREEN_X=320 +CONFIG_INPUT_MOUSEDEV_SCREEN_Y=240 +# CONFIG_INPUT_JOYDEV is not set +CONFIG_INPUT_EVDEV=y +# CONFIG_INPUT_EVBUG is not set + +# +# Input Device Drivers +# +CONFIG_INPUT_KEYBOARD=y +# CONFIG_KEYBOARD_ATKBD is not set +# CONFIG_KEYBOARD_SUNKBD is not set +# CONFIG_KEYBOARD_LKKBD is not set +# CONFIG_KEYBOARD_XTKBD is not set +# CONFIG_KEYBOARD_NEWTON is not set +# CONFIG_KEYBOARD_STOWAWAY is not set +CONFIG_KEYBOARD_GPIO=y +# CONFIG_INPUT_MOUSE is not set +# CONFIG_INPUT_JOYSTICK is not set +# CONFIG_INPUT_TABLET is not set +CONFIG_INPUT_TOUCHSCREEN=y +CONFIG_TOUCHSCREEN_ADS7846=y +# CONFIG_TOUCHSCREEN_FUJITSU is not set +# CONFIG_TOUCHSCREEN_GUNZE is not set +# CONFIG_TOUCHSCREEN_ELO is not set +# CONFIG_TOUCHSCREEN_MTOUCH is not set +# CONFIG_TOUCHSCREEN_INEXIO is not set +# CONFIG_TOUCHSCREEN_MK712 is not set +# CONFIG_TOUCHSCREEN_PENMOUNT is not set +# CONFIG_TOUCHSCREEN_TOUCHRIGHT is not set +# CONFIG_TOUCHSCREEN_TOUCHWIN is not set +# CONFIG_TOUCHSCREEN_WM97XX is not set +# CONFIG_TOUCHSCREEN_USB_COMPOSITE is not set +# CONFIG_TOUCHSCREEN_TOUCHIT213 is not set +# CONFIG_INPUT_MISC is not set + +# +# Hardware I/O ports +# +# CONFIG_SERIO is not set +# CONFIG_GAMEPORT is not set + +# +# Character devices +# +CONFIG_VT=y +CONFIG_CONSOLE_TRANSLATIONS=y +CONFIG_VT_CONSOLE=y +CONFIG_HW_CONSOLE=y +# CONFIG_VT_HW_CONSOLE_BINDING is not set +CONFIG_DEVKMEM=y +# CONFIG_SERIAL_NONSTANDARD is not set + +# +# Serial drivers +# +# CONFIG_SERIAL_8250 is not set + +# +# Non-8250 serial port support +# +CONFIG_SERIAL_ATMEL=y +CONFIG_SERIAL_ATMEL_CONSOLE=y +CONFIG_SERIAL_ATMEL_PDC=y +# CONFIG_SERIAL_ATMEL_TTYAT is not set +CONFIG_SERIAL_CORE=y +CONFIG_SERIAL_CORE_CONSOLE=y +CONFIG_UNIX98_PTYS=y +CONFIG_LEGACY_PTYS=y +CONFIG_LEGACY_PTY_COUNT=256 +# CONFIG_IPMI_HANDLER is not set +CONFIG_HW_RANDOM=y +# CONFIG_NVRAM is not set +# CONFIG_R3964 is not set + +# +# PCMCIA character devices +# +# CONFIG_SYNCLINK_CS is not set +# CONFIG_CARDMAN_4000 is not set +# CONFIG_CARDMAN_4040 is not set +# CONFIG_IPWIRELESS is not set +# CONFIG_RAW_DRIVER is not set +# CONFIG_TCG_TPM is not set +# CONFIG_I2C is not set +CONFIG_SPI=y +# CONFIG_SPI_DEBUG is not set +CONFIG_SPI_MASTER=y + +# +# SPI Master Controller Drivers +# +CONFIG_SPI_ATMEL=y +# CONFIG_SPI_BITBANG is not set + +# +# SPI Protocol Masters +# +# CONFIG_SPI_AT25 is not set +# CONFIG_SPI_SPIDEV is not set +# CONFIG_SPI_TLE62X0 is not set +CONFIG_W1=y + +# +# 1-wire Bus Masters +# +# CONFIG_W1_MASTER_DS2490 is not set +# CONFIG_W1_MASTER_DS1WM is not set +CONFIG_W1_MASTER_GPIO=y + +# +# 1-wire Slaves +# +# CONFIG_W1_SLAVE_THERM is not set +CONFIG_W1_SLAVE_SMEM=y +# CONFIG_W1_SLAVE_DS2433 is not set +# CONFIG_W1_SLAVE_DS2760 is not set +# CONFIG_W1_SLAVE_BQ27000 is not set +# CONFIG_POWER_SUPPLY is not set +# CONFIG_HWMON is not set +# CONFIG_THERMAL is not set +# CONFIG_THERMAL_HWMON is not set +CONFIG_WATCHDOG=y +CONFIG_WATCHDOG_NOWAYOUT=y + +# +# Watchdog Device Drivers +# +# CONFIG_SOFT_WATCHDOG is not set +CONFIG_AT91SAM9X_WATCHDOG=y + +# +# USB-based Watchdog Cards +# +# CONFIG_USBPCWATCHDOG is not set +CONFIG_SSB_POSSIBLE=y + +# +# Sonics Silicon Backplane +# +# CONFIG_SSB is not set + +# +# Multifunction device drivers +# +# CONFIG_MFD_CORE is not set +# CONFIG_MFD_SM501 is not set +# CONFIG_HTC_PASIC3 is not set +# CONFIG_MFD_TMIO is not set +# CONFIG_MFD_T7L66XB is not set +# CONFIG_MFD_TC6387XB is not set + +# +# Multimedia devices +# + +# +# Multimedia core support +# +# CONFIG_VIDEO_DEV is not set +# CONFIG_DVB_CORE is not set +# CONFIG_VIDEO_MEDIA is not set + +# +# Multimedia drivers +# +# CONFIG_DAB is not set + +# +# Graphics support +# +# 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 is not set +# CONFIG_FB_TILEBLITTING is not set + +# +# Frame buffer hardware drivers +# +# CONFIG_FB_S1D15605 is not set +# CONFIG_FB_S1D13XXX is not set +CONFIG_FB_ATMEL=y +# CONFIG_FB_VIRTUAL is not set +# CONFIG_FB_METRONOME is not set +# CONFIG_FB_MB862XX is not set +# CONFIG_BACKLIGHT_LCD_SUPPORT is not set + +# +# Display device support +# +# CONFIG_DISPLAY_SUPPORT is not set + +# +# Console display driver support +# +# CONFIG_VGA_CONSOLE is not set +CONFIG_DUMMY_CONSOLE=y +CONFIG_FRAMEBUFFER_CONSOLE=y +# CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY is not set +CONFIG_FRAMEBUFFER_CONSOLE_ROTATION=y +# CONFIG_FONTS is not set +CONFIG_FONT_8x8=y +CONFIG_FONT_8x16=y +CONFIG_LOGO=y +CONFIG_LOGO_LINUX_MONO=y +CONFIG_LOGO_LINUX_VGA16=y +CONFIG_LOGO_LINUX_CLUT224=y +CONFIG_SOUND=y +CONFIG_SOUND_OSS_CORE=y +CONFIG_SND=y +CONFIG_SND_TIMER=y +CONFIG_SND_PCM=y +# CONFIG_SND_SEQUENCER is not set +CONFIG_SND_OSSEMUL=y +CONFIG_SND_MIXER_OSS=y +CONFIG_SND_PCM_OSS=y +CONFIG_SND_PCM_OSS_PLUGINS=y +# CONFIG_SND_DYNAMIC_MINORS is not set +CONFIG_SND_SUPPORT_OLD_API=y +CONFIG_SND_VERBOSE_PROCFS=y +# CONFIG_SND_VERBOSE_PRINTK is not set +# CONFIG_SND_DEBUG is not set +CONFIG_SND_VMASTER=y +CONFIG_SND_AC97_CODEC=y +CONFIG_SND_DRIVERS=y +# CONFIG_SND_DUMMY is not set +# CONFIG_SND_MTPAV is not set +# CONFIG_SND_SERIAL_U16550 is not set +# CONFIG_SND_MPU401 is not set +# CONFIG_SND_AC97_POWER_SAVE is not set +CONFIG_SND_ARM=y +CONFIG_SND_AT91_AC97=y +CONFIG_SND_SPI=y +# CONFIG_SND_AT73C213 is not set +CONFIG_SND_USB=y +# CONFIG_SND_USB_AUDIO is not set +# CONFIG_SND_USB_CAIAQ is not set +CONFIG_SND_PCMCIA=y +# CONFIG_SND_VXPOCKET is not set +# CONFIG_SND_PDAUDIOCF is not set +# CONFIG_SND_SOC is not set +# CONFIG_SOUND_PRIME is not set +CONFIG_AC97_BUS=y +CONFIG_HID_SUPPORT=y +CONFIG_HID=y +# CONFIG_HID_DEBUG is not set +# CONFIG_HIDRAW is not set + +# +# USB Input Devices +# +CONFIG_USB_HID=y +# CONFIG_HID_PID is not set +# CONFIG_USB_HIDDEV is not set + +# +# Special HID drivers +# +CONFIG_HID_COMPAT=y +CONFIG_HID_A4TECH=y +CONFIG_HID_APPLE=y +CONFIG_HID_BELKIN=y +CONFIG_HID_BRIGHT=y +CONFIG_HID_CHERRY=y +CONFIG_HID_CHICONY=y +CONFIG_HID_CYPRESS=y +CONFIG_HID_DELL=y +CONFIG_HID_EZKEY=y +CONFIG_HID_GYRATION=y +CONFIG_HID_LOGITECH=y +# CONFIG_LOGITECH_FF is not set +# CONFIG_LOGIRUMBLEPAD2_FF is not set +CONFIG_HID_MICROSOFT=y +CONFIG_HID_MONTEREY=y +CONFIG_HID_PANTHERLORD=y +# CONFIG_PANTHERLORD_FF is not set +CONFIG_HID_PETALYNX=y +CONFIG_HID_SAMSUNG=y +CONFIG_HID_SONY=y +CONFIG_HID_SUNPLUS=y +# CONFIG_THRUSTMASTER_FF is not set +# CONFIG_ZEROPLUS_FF is not set +CONFIG_USB_SUPPORT=y +CONFIG_USB_ARCH_HAS_HCD=y +CONFIG_USB_ARCH_HAS_OHCI=y +# CONFIG_USB_ARCH_HAS_EHCI is not set +CONFIG_USB=y +# CONFIG_USB_DEBUG is not set +# CONFIG_USB_ANNOUNCE_NEW_DEVICES is not set + +# +# Miscellaneous USB options +# +CONFIG_USB_DEVICEFS=y +CONFIG_USB_DEVICE_CLASS=y +# CONFIG_USB_DYNAMIC_MINORS is not set +# CONFIG_USB_OTG is not set +CONFIG_USB_MON=y +# CONFIG_USB_WUSB is not set +# CONFIG_USB_WUSB_CBAF is not set + +# +# USB Host Controller Drivers +# +# CONFIG_USB_C67X00_HCD is not set +# CONFIG_USB_ISP116X_HCD is not set +CONFIG_USB_OHCI_HCD=y +# CONFIG_USB_OHCI_BIG_ENDIAN_DESC is not set +# CONFIG_USB_OHCI_BIG_ENDIAN_MMIO is not set +CONFIG_USB_OHCI_LITTLE_ENDIAN=y +# CONFIG_USB_SL811_HCD is not set +# CONFIG_USB_R8A66597_HCD is not set +# CONFIG_USB_HWA_HCD is not set +# CONFIG_USB_MUSB_HDRC is not set +# CONFIG_USB_GADGET_MUSB_HDRC is not set + +# +# USB Device Class drivers +# +# CONFIG_USB_ACM is not set +# CONFIG_USB_PRINTER is not set +# 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 information +# +CONFIG_USB_STORAGE=y +# CONFIG_USB_STORAGE_DEBUG is not set +# CONFIG_USB_STORAGE_DATAFAB is not set +# CONFIG_USB_STORAGE_FREECOM is not set +# CONFIG_USB_STORAGE_ISD200 is not set +# CONFIG_USB_STORAGE_DPCM is not set +# CONFIG_USB_STORAGE_USBAT is not set +# CONFIG_USB_STORAGE_SDDR09 is not set +# CONFIG_USB_STORAGE_SDDR55 is not set +# CONFIG_USB_STORAGE_JUMPSHOT is not set +# CONFIG_USB_STORAGE_ALAUDA is not set +# CONFIG_USB_STORAGE_ONETOUCH is not set +# CONFIG_USB_STORAGE_KARMA is not set +# CONFIG_USB_STORAGE_CYPRESS_ATACB is not set +CONFIG_USB_LIBUSUAL=y + +# +# USB Imaging devices +# +# CONFIG_USB_MDC800 is not set +# CONFIG_USB_MICROTEK is not set + +# +# USB port drivers +# +# CONFIG_USB_SERIAL 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_BERRY_CHARGE is not set +# CONFIG_USB_LED is not set +# CONFIG_USB_CYPRESS_CY7C63 is not set +# CONFIG_USB_CYTHERM is not set +# CONFIG_USB_PHIDGET 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 is not set +# CONFIG_USB_IOWARRIOR is not set +# CONFIG_USB_TEST is not set +# CONFIG_USB_ISIGHTFW is not set +# CONFIG_USB_VST is not set +CONFIG_USB_GADGET=y +# CONFIG_USB_GADGET_DEBUG is not set +# CONFIG_USB_GADGET_DEBUG_FILES is not set +CONFIG_USB_GADGET_VBUS_DRAW=2 +CONFIG_USB_GADGET_SELECTED=y +CONFIG_USB_GADGET_AT91=y +CONFIG_USB_AT91=y +# CONFIG_USB_GADGET_ATMEL_USBA is not set +# CONFIG_USB_GADGET_FSL_USB2 is not set +# CONFIG_USB_GADGET_LH7A40X is not set +# CONFIG_USB_GADGET_OMAP is not set +# CONFIG_USB_GADGET_PXA25X is not set +# CONFIG_USB_GADGET_PXA27X is not set +# CONFIG_USB_GADGET_S3C2410 is not set +# CONFIG_USB_GADGET_M66592 is not set +# CONFIG_USB_GADGET_AMD5536UDC is not set +# CONFIG_USB_GADGET_FSL_QE is not set +# CONFIG_USB_GADGET_NET2280 is not set +# CONFIG_USB_GADGET_GOKU is not set +# CONFIG_USB_GADGET_DUMMY_HCD is not set +# CONFIG_USB_GADGET_DUALSPEED is not set +CONFIG_USB_ZERO=m +CONFIG_USB_ETH=m +CONFIG_USB_ETH_RNDIS=y +CONFIG_USB_GADGETFS=m +CONFIG_USB_FILE_STORAGE=m +# CONFIG_USB_FILE_STORAGE_TEST is not set +CONFIG_USB_G_SERIAL=m +# CONFIG_USB_MIDI_GADGET is not set +# CONFIG_USB_G_PRINTER is not set +CONFIG_USB_CDC_COMPOSITE=m +CONFIG_MMC=y +# CONFIG_MMC_DEBUG is not set +# CONFIG_MMC_UNSAFE_RESUME is not set + +# +# MMC/SD/SDIO Card Drivers +# +CONFIG_MMC_BLOCK=y +CONFIG_MMC_BLOCK_BOUNCE=y +# CONFIG_SDIO_UART is not set +# CONFIG_MMC_TEST is not set + +# +# MMC/SD/SDIO Host Controller Drivers +# +# CONFIG_MMC_SDHCI is not set +CONFIG_MMC_AT91=y +# CONFIG_MMC_SPI is not set +# CONFIG_MEMSTICK is not set +# CONFIG_ACCESSIBILITY is not set +CONFIG_NEW_LEDS=y +CONFIG_LEDS_CLASS=y + +# +# LED drivers +# +CONFIG_LEDS_ATMEL_PWM=y +CONFIG_LEDS_GPIO=y + +# +# LED Triggers +# +CONFIG_LEDS_TRIGGERS=y +CONFIG_LEDS_TRIGGER_TIMER=y +CONFIG_LEDS_TRIGGER_IDE_DISK=y +CONFIG_LEDS_TRIGGER_HEARTBEAT=y +CONFIG_LEDS_TRIGGER_BACKLIGHT=y +CONFIG_LEDS_TRIGGER_DEFAULT_ON=y +CONFIG_RTC_LIB=y +CONFIG_RTC_CLASS=y +CONFIG_RTC_HCTOSYS=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 + +# +# SPI RTC drivers +# +# 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 + +# +# 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_BQ4802 is not set +# CONFIG_RTC_DRV_V3020 is not set + +# +# on-CPU RTC drivers +# +CONFIG_RTC_DRV_AT91SAM9=y +CONFIG_RTC_DRV_AT91SAM9_RTT=0 +CONFIG_RTC_DRV_AT91SAM9_GPBR=0 +# CONFIG_DMADEVICES is not set +# CONFIG_REGULATOR is not set +# CONFIG_UIO is not set + +# +# File systems +# +# CONFIG_EXT2_FS is not set +# CONFIG_EXT3_FS is not set +# CONFIG_EXT4_FS is not set +# CONFIG_REISERFS_FS is not set +# CONFIG_JFS_FS is not set +# CONFIG_FS_POSIX_ACL is not set +CONFIG_FILE_LOCKING=y +# CONFIG_XFS_FS is not set +# CONFIG_OCFS2_FS is not set +CONFIG_DNOTIFY=y +CONFIG_INOTIFY=y +CONFIG_INOTIFY_USER=y +# CONFIG_QUOTA is not set +# CONFIG_AUTOFS_FS is not set +# CONFIG_AUTOFS4_FS is not set +# CONFIG_FUSE_FS is not set + +# +# CD-ROM/DVD Filesystems +# +# CONFIG_ISO9660_FS is not set +# CONFIG_UDF_FS is not set + +# +# DOS/FAT/NT Filesystems +# +CONFIG_FAT_FS=y +# CONFIG_MSDOS_FS is not set +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 is not set +# CONFIG_HUGETLB_PAGE is not set +# CONFIG_CONFIGFS_FS is not set + +# +# Miscellaneous filesystems +# +# 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=y +CONFIG_JFFS2_FS_DEBUG=0 +CONFIG_JFFS2_FS_WRITEBUFFER=y +# CONFIG_JFFS2_FS_WBUF_VERIFY is not set +# CONFIG_JFFS2_SUMMARY is not set +# CONFIG_JFFS2_FS_XATTR is not set +# CONFIG_JFFS2_COMPRESSION_OPTIONS is not set +CONFIG_JFFS2_ZLIB=y +# CONFIG_JFFS2_LZO is not set +CONFIG_JFFS2_RTIME=y +# CONFIG_JFFS2_RUBIN is not set +CONFIG_CRAMFS=y +# 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_ROMFS_FS is not set +# CONFIG_SYSV_FS is not set +# CONFIG_UFS_FS is not set +CONFIG_NETWORK_FILESYSTEMS=y +CONFIG_NFS_FS=y +# CONFIG_NFS_V3 is not set +# CONFIG_NFS_V4 is not set +CONFIG_ROOT_NFS=y +# CONFIG_NFSD is not set +CONFIG_LOCKD=y +CONFIG_NFS_COMMON=y +CONFIG_SUNRPC=y +# CONFIG_SUNRPC_REGISTER_V4 is not set +# CONFIG_RPCSEC_GSS_KRB5 is not set +# CONFIG_RPCSEC_GSS_SPKM3 is not set +# CONFIG_SMB_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 + +# +# Partition Types +# +# CONFIG_PARTITION_ADVANCED is not set +CONFIG_MSDOS_PARTITION=y +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=y +# 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 is not set +# 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 is not set +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_UTF8 is not set +# CONFIG_DLM is not set + +# +# Kernel hacking +# +# CONFIG_PRINTK_TIME is not set +CONFIG_ENABLE_WARN_DEPRECATED=y +CONFIG_ENABLE_MUST_CHECK=y +CONFIG_FRAME_WARN=1024 +# CONFIG_MAGIC_SYSRQ is not set +# CONFIG_UNUSED_SYMBOLS is not set +# CONFIG_DEBUG_FS is not set +# CONFIG_HEADERS_CHECK is not set +CONFIG_DEBUG_KERNEL=y +# CONFIG_DEBUG_SHIRQ is not set +CONFIG_DETECT_SOFTLOCKUP=y +# CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC is not set +CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC_VALUE=0 +CONFIG_SCHED_DEBUG=y +# CONFIG_SCHEDSTATS is not set +# CONFIG_TIMER_STATS is not set +# CONFIG_DEBUG_OBJECTS is not set +# CONFIG_DEBUG_SLAB is not set +# 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_SPINLOCK_SLEEP is not set +# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set +# CONFIG_DEBUG_KOBJECT is not set +CONFIG_DEBUG_BUGVERBOSE=y +# CONFIG_DEBUG_INFO is not set +# CONFIG_DEBUG_VM is not set +# CONFIG_DEBUG_WRITECOUNT is not set +CONFIG_DEBUG_MEMORY_INIT=y +# CONFIG_DEBUG_LIST is not set +# CONFIG_DEBUG_SG is not set +CONFIG_FRAME_POINTER=y +# CONFIG_BOOT_PRINTK_DELAY is not set +# CONFIG_RCU_TORTURE_TEST is not set +# CONFIG_RCU_CPU_STALL_DETECTOR is not set +# CONFIG_BACKTRACE_SELF_TEST is not set +# CONFIG_DEBUG_BLOCK_EXT_DEVT is not set +# CONFIG_FAULT_INJECTION is not set +# CONFIG_LATENCYTOP is not set +# CONFIG_SYSCTL_SYSCALL_CHECK is not set +CONFIG_HAVE_FUNCTION_TRACER=y + +# +# Tracers +# +# CONFIG_FUNCTION_TRACER is not set +# CONFIG_IRQSOFF_TRACER is not set +# CONFIG_SCHED_TRACER is not set +# CONFIG_CONTEXT_SWITCH_TRACER is not set +# CONFIG_BOOT_TRACER is not set +# CONFIG_STACK_TRACER is not set +# CONFIG_DYNAMIC_PRINTK_DEBUG is not set +# CONFIG_SAMPLES is not set +CONFIG_HAVE_ARCH_KGDB=y +# CONFIG_KGDB is not set +CONFIG_DEBUG_USER=y +# CONFIG_DEBUG_ERRORS is not set +# CONFIG_DEBUG_STACK_USAGE is not set +CONFIG_DEBUG_LL=y +# CONFIG_DEBUG_ICEDCC is not set + +# +# Security options +# +# CONFIG_KEYS is not set +# CONFIG_SECURITY is not set +# CONFIG_SECURITYFS is not set +# CONFIG_SECURITY_FILE_CAPABILITIES is not set +# CONFIG_CRYPTO is not set + +# +# Library routines +# +CONFIG_BITREVERSE=y +# CONFIG_CRC_CCITT is not set +# CONFIG_CRC16 is not set +# CONFIG_CRC_T10DIF is not set +# CONFIG_CRC_ITU_T is not set +CONFIG_CRC32=y +# CONFIG_CRC7 is not set +# CONFIG_LIBCRC32C is not set +CONFIG_ZLIB_INFLATE=y +CONFIG_ZLIB_DEFLATE=y +CONFIG_PLIST=y +CONFIG_HAS_IOMEM=y +CONFIG_HAS_IOPORT=y +CONFIG_HAS_DMA=y diff --git a/packages/linux/linux-2.6.28/ronetix-pm9263/linux-2.6.28-at91-ronetix-12012009.patch b/packages/linux/linux-2.6.28/ronetix-pm9263/linux-2.6.28-at91-ronetix-12012009.patch new file mode 100644 index 0000000000..fbd0c90a23 --- /dev/null +++ b/packages/linux/linux-2.6.28/ronetix-pm9263/linux-2.6.28-at91-ronetix-12012009.patch @@ -0,0 +1,1751 @@ +diff -urNp linux-2.6.28-at91/arch/arm/mach-at91/at91sam9263_devices.c.rej linux-2.6.28-at91-ronetix/arch/arm/mach-at91/at91sam9263_devices.c.rej +--- linux-2.6.28-at91/arch/arm/mach-at91/at91sam9263_devices.c.rej 1970-01-01 01:00:00.000000000 +0100 ++++ linux-2.6.28-at91-ronetix/arch/arm/mach-at91/at91sam9263_devices.c.rej 2009-01-12 16:00:42.000000000 +0100 +@@ -0,0 +1,17 @@ ++*************** ++*** 645,651 **** ++ if (data->reset_pin) ++ at91_set_gpio_output(data->reset_pin, 0); ++ ++- ac97_data = *ek_data; ++ platform_device_register(&at91sam9263_ac97_device); ++ } ++ #else ++--- 645,651 ---- ++ if (data->reset_pin) ++ at91_set_gpio_output(data->reset_pin, 0); ++ +++ ac97_data = *data; ++ platform_device_register(&at91sam9263_ac97_device); ++ } ++ #else +diff -urNp linux-2.6.28-at91/arch/arm/mach-at91/board-pm9263.c linux-2.6.28-at91-ronetix/arch/arm/mach-at91/board-pm9263.c +--- linux-2.6.28-at91/arch/arm/mach-at91/board-pm9263.c 1970-01-01 01:00:00.000000000 +0100 ++++ linux-2.6.28-at91-ronetix/arch/arm/mach-at91/board-pm9263.c 2009-01-12 16:00:42.000000000 +0100 +@@ -0,0 +1,528 @@ ++/* ++ * linux/arch/arm/mach-at91/board-pm9263.c ++ * ++ * Copyright (C) 2008 Ronetix ++ * ++ * 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 ++ */ ++ ++#include <linux/types.h> ++#include <linux/init.h> ++#include <linux/mm.h> ++#include <linux/module.h> ++#include <linux/platform_device.h> ++#include <linux/spi/spi.h> ++#include <linux/spi/ads7846.h> ++#include <linux/i2c/at24.h> ++#include <linux/fb.h> ++#include <linux/gpio_keys.h> ++#include <linux/input.h> ++#include <linux/leds.h> ++#include <linux/w1-gpio.h> ++ ++#include <video/atmel_lcdc.h> ++ ++#include <asm/setup.h> ++#include <asm/mach-types.h> ++#include <asm/irq.h> ++ ++#include <asm/mach/arch.h> ++#include <asm/mach/map.h> ++#include <asm/mach/irq.h> ++ ++#include <mach/hardware.h> ++#include <mach/board.h> ++#include <mach/gpio.h> ++#include <mach/at91sam9_smc.h> ++#include <mach/at91_shdwc.h> ++#include <mach/at91sam9263_matrix.h> ++ ++#include "sam9_smc.h" ++#include "generic.h" ++ ++ ++static void __init pm9263_map_io(void) ++{ ++ /* Initialize processor: 18.432 MHz crystal */ ++ at91sam9263_initialize(18432000); ++ ++ /* DGBU on ttyS0. (Rx & Tx only) */ ++ at91_register_uart(0, 0, 0); ++ ++ /* USART0 on ttyS1. (Rx, Tx, RTS, CTS) */ ++ at91_register_uart(AT91SAM9263_ID_US0, 1, ATMEL_UART_CTS | ATMEL_UART_RTS); ++ ++ /* set serial console to ttyS0 (ie, DBGU) */ ++ at91_set_serial_console(0); ++} ++ ++static void __init pm9263_init_irq(void) ++{ ++ at91sam9263_init_interrupts(NULL); ++} ++ ++ ++/* ++ * USB Host port ++ */ ++static struct at91_usbh_data __initdata pm9263_usbh_data = { ++ .ports = 2, ++ .vbus_pin = { 0, 0 }, ++}; ++ ++/* ++ * USB Device port ++ */ ++static struct at91_udc_data __initdata pm9263_udc_data = { ++ .vbus_pin = AT91_PIN_PA25, ++ .pullup_pin = 0, /* pull-up driven by UDC */ ++}; ++ ++ ++/* ++ * ADS7846 Touchscreen ++ */ ++#if defined(CONFIG_TOUCHSCREEN_ADS7846) || defined(CONFIG_TOUCHSCREEN_ADS7846_MODULE) ++static int ads7843_pendown_state(void) ++{ ++ return !at91_get_gpio_value(AT91_PIN_PA15); /* Touchscreen PENIRQ */ ++} ++ ++static struct ads7846_platform_data ads_info = { ++ .model = 7843, ++ .x_min = 150, ++ .x_max = 3830, ++ .y_min = 190, ++ .y_max = 3830, ++ .vref_delay_usecs = 100, ++ .x_plate_ohms = 450, ++ .y_plate_ohms = 250, ++ .pressure_max = 15000, ++ .debounce_max = 1, ++ .debounce_rep = 0, ++ .debounce_tol = (~0), ++ .get_pendown_state = ads7843_pendown_state, ++}; ++ ++static void __init pm9263_add_device_ts(void) ++{ ++ at91_set_B_periph(AT91_PIN_PA15, 1); /* External IRQ1, with pullup */ ++ at91_set_gpio_input(AT91_PIN_PA31, 1); /* Touchscreen BUSY signal */ ++} ++#else ++static void __init pm9263_add_device_ts(void) {} ++#endif ++ ++/* ++ * SPI devices. ++ */ ++static struct spi_board_info pm9263_spi_devices[] = { ++#if defined(CONFIG_MTD_AT91_DATAFLASH_CARD) ++ { /* DataFlash card */ ++ .modalias = "mtd_dataflash", ++ .chip_select = 0, ++ .max_speed_hz = 15 * 1000 * 1000, ++ .bus_num = 0, ++ }, ++#endif ++#if defined(CONFIG_TOUCHSCREEN_ADS7846) || defined(CONFIG_TOUCHSCREEN_ADS7846_MODULE) ++ { ++ .modalias = "ads7846", ++ .chip_select = 0, ++ .max_speed_hz = 125000 * 16, /* max sample rate * clocks per sample */ ++ .bus_num = 1, ++ .platform_data = &ads_info, ++ .irq = AT91SAM9263_ID_IRQ1, ++ }, ++#endif ++}; ++ ++ ++/* ++ * MCI (SD/MMC) ++ */ ++static struct at91_mmc_data __initdata pm9263_mmc_data = { ++ .wire4 = 1, ++ .det_pin = AT91_PIN_PA21, ++ .wp_pin = AT91_PIN_PA16, ++// .vcc_pin = ... not connected ++}; ++ ++ ++/* ++ * MACB Ethernet device ++ */ ++static struct at91_eth_data __initdata pm9263_macb_data = { ++ .phy_irq_pin = AT91_PIN_PE31, ++ .is_rmii = 1, ++}; ++ ++ ++/* ++ * NAND flash ++ */ ++static struct mtd_partition __initdata pm9263_nand_partition[] = { ++ { ++ .name = "Partition 1", ++ .offset = 0, ++ .size = MTDPART_SIZ_FULL, ++ }, ++}; ++ ++static struct mtd_partition * __init nand_partitions(int size, int *num_partitions) ++{ ++ *num_partitions = ARRAY_SIZE(pm9263_nand_partition); ++ return pm9263_nand_partition; ++} ++ ++static struct atmel_nand_data __initdata pm9263_nand_data = { ++ .ale = 21, ++ .cle = 22, ++// .det_pin = ... not connected ++ .rdy_pin = AT91_PIN_PB30, ++ .enable_pin = AT91_PIN_PD15, ++ .partition_info = nand_partitions, ++#if defined(CONFIG_MTD_NAND_ATMEL_BUSWIDTH_16) ++ .bus_width_16 = 1, ++#else ++ .bus_width_16 = 0, ++#endif ++}; ++ ++static struct sam9_smc_config __initdata pm9263_nand_smc_config = { ++ .ncs_read_setup = 0, ++ .nrd_setup = 1, ++ .ncs_write_setup = 0, ++ .nwe_setup = 1, ++ ++ .ncs_read_pulse = 3, ++ .nrd_pulse = 3, ++ .ncs_write_pulse = 3, ++ .nwe_pulse = 3, ++ ++ .read_cycle = 5, ++ .write_cycle = 5, ++ ++ .mode = AT91_SMC_READMODE | AT91_SMC_WRITEMODE | AT91_SMC_EXNWMODE_DISABLE, ++ .tdf_cycles = 2, ++}; ++ ++static void __init pm9263_add_device_nand(void) ++{ ++ /* setup bus-width (8 or 16) */ ++ if (pm9263_nand_data.bus_width_16) ++ pm9263_nand_smc_config.mode |= AT91_SMC_DBW_16; ++ else ++ pm9263_nand_smc_config.mode |= AT91_SMC_DBW_8; ++ ++ /* configure chip-select 3 (NAND) */ ++ sam9_smc_configure(3, &pm9263_nand_smc_config); ++ ++ at91_add_device_nand(&pm9263_nand_data); ++} ++ ++ ++/* ++ * LCD Controller ++ */ ++#if defined(CONFIG_FB_ATMEL) || defined(CONFIG_FB_ATMEL_MODULE) ++static struct fb_videomode at91_tft_vga_modes[] = { ++ { ++ .name = "TX09D50VM1CCA @ 60", ++ .refresh = 60, ++ .xres = 240, .yres = 320, ++ .pixclock = KHZ2PICOS(4965), ++ ++ .left_margin = 1, .right_margin = 33, ++ .upper_margin = 1, .lower_margin = 0, ++ .hsync_len = 5, .vsync_len = 1, ++ ++ .sync = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, ++ .vmode = FB_VMODE_NONINTERLACED, ++ }, ++}; ++ ++static struct fb_monspecs at91fb_default_monspecs = { ++ .manufacturer = "HIT", ++ .monitor = "TX09D70VM1CCA", ++ ++ .modedb = at91_tft_vga_modes, ++ .modedb_len = ARRAY_SIZE(at91_tft_vga_modes), ++ .hfmin = 15000, ++ .hfmax = 64000, ++ .vfmin = 50, ++ .vfmax = 150, ++}; ++ ++#define AT91SAM9263_DEFAULT_LCDCON2 (ATMEL_LCDC_MEMOR_LITTLE \ ++ | ATMEL_LCDC_DISTYPE_TFT \ ++ | ATMEL_LCDC_CLKMOD_ALWAYSACTIVE) ++ ++static void at91_lcdc_power_control(int on) ++{ ++ at91_set_gpio_value(AT91_PIN_PA22, on); ++} ++ ++/* Driver datas */ ++static struct atmel_lcdfb_info __initdata pm9263_lcdc_data = { ++ .lcdcon_is_backlight = true, ++ .default_bpp = 16, ++ .default_dmacon = ATMEL_LCDC_DMAEN, ++ .default_lcdcon2 = AT91SAM9263_DEFAULT_LCDCON2, ++ .default_monspecs = &at91fb_default_monspecs, ++ .atmel_lcdfb_power_control = at91_lcdc_power_control, ++ .guard_time = 1, ++}; ++ ++#else ++static struct atmel_lcdfb_info __initdata pm9263_lcdc_data; ++#endif ++ ++ ++/* ++ * GPIO Buttons ++ */ ++#if defined(CONFIG_KEYBOARD_GPIO) || defined(CONFIG_KEYBOARD_GPIO_MODULE) ++static struct gpio_keys_button pm9263_buttons[] = { ++ { /* SW3 */ ++ .code = BTN_LEFT, ++ .gpio = AT91_PIN_PC5, ++ .active_low = 1, ++ .desc = "SW3", ++ .wakeup = 1, ++ }, ++ { /* SW4 */ ++ .code = BTN_RIGHT, ++ .gpio = AT91_PIN_PC4, ++ .active_low = 1, ++ .desc = "SW4", ++ .wakeup = 1, ++ } ++}; ++ ++static struct gpio_keys_platform_data pm9263_button_data = { ++ .buttons = pm9263_buttons, ++ .nbuttons = ARRAY_SIZE(pm9263_buttons), ++}; ++ ++static struct platform_device pm9263_button_device = { ++ .name = "gpio-keys", ++ .id = -1, ++ .num_resources = 0, ++ .dev = { ++ .platform_data = &pm9263_button_data, ++ } ++}; ++ ++static void __init pm9263_add_device_buttons(void) ++{ ++ int i; ++ ++ for (i = 0; i < pm9263_button_data.nbuttons; i ++) { ++ at91_set_gpio_input(pm9263_buttons[i].gpio, 1); ++ at91_set_deglitch(pm9263_buttons[i].gpio, 1); ++ } ++ ++// platform_device_register(&pm9263_button_device); ++} ++#else ++static void __init pm9263_add_device_buttons(void) {} ++#endif ++ ++ ++/* ++ * AC97 ++ */ ++static struct atmel_ac97_data pm9263_ac97_data = { ++ .reset_pin = 0, ++}; ++ ++ ++/* ++ * LEDs ... these could all be PWM-driven, for variable brightness ++ */ ++static struct gpio_led pm9263_leds[] = { ++ { /* "right" led, green, userled2 (could be driven by pwm2) */ ++ .name = "led0", ++ .gpio = AT91_PIN_PB7, ++ .active_low = 1, ++ .default_trigger = "nand-disk", ++ }, ++ { /* "power" led, yellow (could be driven by pwm0) */ ++ .name = "led1", ++ .gpio = AT91_PIN_PB8, ++ .active_low = 1, ++ .default_trigger = "heartbeat", ++ } ++}; ++ ++#if defined(CONFIG_W1_MASTER_GPIO) || defined(CONFIG_W1_MASTER_GPIO_MODULE) ++struct w1_gpio_platform_data pm926x_w1_platdata = { ++ .pin = AT91_PIN_PB31, ++ .is_open_drain = 0, ++}; ++ ++static struct platform_device pm926x_w1_device = { ++ .name = "w1-gpio", ++ .id = 0, ++ .dev = { ++ .platform_data = &pm926x_w1_platdata, ++ }, ++}; ++#endif ++ ++#if defined(CONFIG_AT91_CF) || defined(CONFIG_AT91_CF_MODULE) ++static struct at91_cf_data pm9263_cf_data = { ++ .det_pin = AT91_PIN_PA30, ++ .rst_pin = AT91_PIN_PA23, ++ .irq_pin = AT91_PIN_PA24, ++ // .vcc_pin = ... always powered ++ .chipselect = 4, ++}; ++ ++static struct resource pm9263_cf_resources[] = { ++ [0] = { ++ .start = AT91_CHIPSELECT_4, ++ .end = AT91_CHIPSELECT_4 + (0x10000000 - 1), ++ .flags = IORESOURCE_MEM | IORESOURCE_MEM_8AND16BIT, ++ }, ++}; ++ ++static struct platform_device pm9263_cf_device = { ++ .name = "at91_cf", ++ .id = -1, ++ .dev = { ++ .platform_data = &pm9263_cf_data, ++ }, ++ .resource = pm9263_cf_resources, ++ .num_resources = ARRAY_SIZE(pm9263_cf_resources), ++}; ++ ++#define CF_NWE_SETUP (9 << 0) ++#define CF_NCS_WR_SETUP (2 << 8) ++#define CF_NRD_SETUP (9 << 16) ++#define CF_NCS_RD_SETUP (2 << 24) ++ ++#define CF_NWE_PULSE (17 << 0) ++#define CF_NCS_WR_PULSE (27 << 8) ++#define CF_NRD_PULSE (17 << 16) ++#define CF_NCS_RD_PULSE (27 << 24) ++ ++#define CF_NWE_CYCLE (40 << 0) ++#define CF_NRD_CYCLE (40 << 16) ++ ++#define CF_TDF (1 << 16) ++ ++static void __init pm9263_add_device_cf(void) { ++struct at91_cf_data *data = & pm9263_cf_data; ++unsigned int csa; ++ ++ // Setup Compact flash, first enable the address range of ++ // CS4 in HMATRIX user interface ++ csa = at91_sys_read(AT91_MATRIX_EBI0CSA); ++ at91_sys_write(AT91_MATRIX_EBI0CSA, csa | AT91_MATRIX_EBI0_CS4A_SMC_CF1); ++ ++ /* Configure SMC CS4 */ ++ at91_sys_write(AT91_SMC_SETUP(4), ++ (CF_NWE_SETUP | ++ CF_NCS_WR_SETUP | ++ CF_NRD_SETUP | ++ CF_NCS_RD_SETUP)); ++ ++ at91_sys_write(AT91_SMC_PULSE(4), (CF_NWE_PULSE | ++ CF_NCS_WR_PULSE | ++ CF_NRD_PULSE | ++ CF_NCS_RD_PULSE)); ++ at91_sys_write(AT91_SMC_CYCLE(4), (CF_NWE_CYCLE | CF_NRD_CYCLE)); ++ // 16 bit ++ at91_sys_write (AT91_SMC_MODE(4), (AT91_SMC_READMODE | ++ AT91_SMC_WRITEMODE | ++ AT91_SMC_EXNWMODE_DISABLE | ++ AT91_SMC_DBW_16 | ++ CF_TDF)); ++ ++ /* input/irq */ ++ if (data->irq_pin) { ++ at91_set_gpio_input(data->irq_pin, 0); ++ at91_set_deglitch(data->irq_pin, 1); ++ } ++ at91_set_gpio_input(data->det_pin, 0); ++ at91_set_deglitch(data->det_pin, 1); ++ ++ /* outputs, initially off */ ++ if (data->vcc_pin) ++ at91_set_gpio_output(data->vcc_pin, 0); ++ if (data->rst_pin) ++ at91_set_gpio_output(data->rst_pin, 0); ++ ++ /* force poweron defaults for these pins ... */ ++ at91_set_A_periph(AT91_PIN_PD5, 0); /* PD5/CF_NWAIT */ ++ at91_set_A_periph(AT91_PIN_PD14, 0); /* A25/CFRNW */ ++ at91_set_A_periph(AT91_PIN_PD6, 0); /* NCS4/CFCS0 */ ++ at91_set_A_periph(AT91_PIN_PD8, 0); /* PD8/CFCE1 */ ++ at91_set_A_periph(AT91_PIN_PD9, 0); /* PD9/CFCE2 */ ++ ++ platform_device_register(&pm9263_cf_device); ++} ++#else ++void __init pm9263_add_device_cf(void) {} ++#endif ++ ++static void __init pm9263_board_init(void) ++{ ++ /* Serial */ ++ at91_add_device_serial(); ++ /* USB Host */ ++ at91_add_device_usbh(&pm9263_usbh_data); ++ /* USB Device */ ++ at91_add_device_udc(&pm9263_udc_data); ++ /* SPI */ ++ at91_add_device_spi(pm9263_spi_devices, ARRAY_SIZE(pm9263_spi_devices)); ++ /* Touchscreen */ ++ pm9263_add_device_ts(); ++ /* MMC */ ++ at91_add_device_mmc(1, &pm9263_mmc_data); ++ /* Ethernet */ ++ at91_add_device_eth(&pm9263_macb_data); ++ /* NAND */ ++ pm9263_add_device_nand(); ++ /* LCD Controller */ ++ at91_add_device_lcdc(&pm9263_lcdc_data); ++ /* Push Buttons */ ++ pm9263_add_device_buttons(); ++ /* AC97 */ ++ at91_add_device_ac97(&pm9263_ac97_data); ++#if defined(CONFIG_W1_MASTER_GPIO) || defined(CONFIG_W1_MASTER_GPIO_MODULE) ++ platform_device_register(&pm926x_w1_device); ++#endif ++ /* Compact flash */ ++ pm9263_add_device_cf(); ++ /* LEDs */ ++ at91_gpio_leds(pm9263_leds, ARRAY_SIZE(pm9263_leds)); ++ /* shutdown controller, wakeup button (5 msec low) */ ++ at91_sys_write(AT91_SHDW_MR, AT91_SHDW_CPTWK0_(10) | AT91_SHDW_WKMODE0_LOW ++ | AT91_SHDW_RTTWKEN); ++} ++ ++MACHINE_START(PM9263, "Ronetix PM9263/BB9263") ++ /* Maintainer: Atmel */ ++ .phys_io = AT91_BASE_SYS, ++ .io_pg_offst = (AT91_VA_BASE_SYS >> 18) & 0xfffc, ++ .boot_params = AT91_SDRAM_BASE + 0x100, ++ .timer = &at91sam926x_timer, ++ .map_io = pm9263_map_io, ++ .init_irq = pm9263_init_irq, ++ .init_machine = pm9263_board_init, ++MACHINE_END +diff -urNp linux-2.6.28-at91/arch/arm/mach-at91/include/mach/at91_ac97c.h linux-2.6.28-at91-ronetix/arch/arm/mach-at91/include/mach/at91_ac97c.h +--- linux-2.6.28-at91/arch/arm/mach-at91/include/mach/at91_ac97c.h 1970-01-01 01:00:00.000000000 +0100 ++++ linux-2.6.28-at91-ronetix/arch/arm/mach-at91/include/mach/at91_ac97c.h 2009-01-12 16:00:42.000000000 +0100 +@@ -0,0 +1,282 @@ ++/* linux/include/asm-arm/arch-at91rm9200/ac97c.h ++ * ++ * Hardware definition for the ac97c peripheral in the ATMEL at91sam926x processor ++ * ++ * Generated 12/09/2005 (11:54:20) AT91 SW Application Group from AC97C_XXXX V1.3 ++ * ++ * 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 SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR ++ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF ++ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE ++ * DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, INDIRECT, ++ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ++ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, ++ * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF ++ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING ++ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, ++ * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ++ * ++ * 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., ++ * 675 Mass Ave, Cambridge, MA 02139, USA. ++ */ ++ ++ ++#ifndef __AC97C_H ++#define __AC97C_H ++ ++/* -------------------------------------------------------- */ ++/* AC97C ID definitions for AT91SAM926x */ ++/* -------------------------------------------------------- */ ++#ifndef AT91C_ID_AC97C ++#define AT91C_ID_AC97C 18 /**< AC97 Controller id */ ++#endif /* AT91C_ID_AC97C */ ++ ++/* -------------------------------------------------------- */ ++/* AC97C Base Address definitions for AT91SAM926x */ ++/* -------------------------------------------------------- */ ++#define AT91C_BASE_AC97C 0xFFFA0000 /**< AC97C base address */ ++ ++/* -------------------------------------------------------- */ ++/* PIO definition for AC97C hardware peripheral */ ++/* -------------------------------------------------------- */ ++#define AT91C_PB1_AC97CK (1 << 1) /**< */ ++#define AT91C_PB0_AC97FS (1 << 0) /**< */ ++#define AT91C_PB3_AC97RX (1 << 3) /**< */ ++#define AT91C_PB2_AC97TX (1 << 2) /**< */ ++ ++ ++/* -------------------------------------------------------- */ ++/* Register offset definition for AC97C hardware peripheral */ ++/* -------------------------------------------------------- */ ++#define AC97C_MR (0x0008) /**< Mode Register */ ++#define AC97C_ICA (0x0010) /**< Input Channel AssignementRegister */ ++#define AC97C_OCA (0x0014) /**< Output Channel Assignement Register */ ++#define AC97C_CARHR (0x0020) /**< Channel A Receive Holding Register */ ++#define AC97C_CATHR (0x0024) /**< Channel A Transmit Holding Register */ ++#define AC97C_CASR (0x0028) /**< Channel A Status Register */ ++#define AC97C_CAMR (0x002C) /**< Channel A Mode Register */ ++#define AC97C_CBRHR (0x0030) /**< Channel B Receive Holding Register (optional) */ ++#define AC97C_CBTHR (0x0034) /**< Channel B Transmit Holding Register (optional) */ ++#define AC97C_CBSR (0x0038) /**< Channel B Status Register */ ++#define AC97C_CBMR (0x003C) /**< Channel B Mode Register */ ++#define AC97C_CORHR (0x0040) /**< COdec Transmit Holding Register */ ++#define AC97C_COTHR (0x0044) /**< COdec Transmit Holding Register */ ++#define AC97C_COSR (0x0048) /**< CODEC Status Register */ ++#define AC97C_COMR (0x004C) /**< CODEC Mask Status Register */ ++#define AC97C_SR (0x0050) /**< Status Register */ ++#define AC97C_IER (0x0054) /**< Interrupt Enable Register */ ++#define AC97C_IDR (0x0058) /**< Interrupt Disable Register */ ++#define AC97C_IMR (0x005C) /**< Interrupt Mask Register */ ++#define AC97C_VERSION (0x00FC) /**< Version Register */ ++ ++/* -------------------------------------------------------- */ ++/* Bitfields definition for AC97C hardware peripheral */ ++/* -------------------------------------------------------- */ ++/* --- Register AC97C_MR */ ++#define AT91C_AC97C_ENA (0x1 << 0 ) /**< (AC97C) AC97 Controller Global Enable */ ++#define AT91C_AC97C_WRST (0x1 << 1 ) /**< (AC97C) Warm Reset */ ++#define AT91C_AC97C_VRA (0x1 << 2 ) /**< (AC97C) Variable RAte (for Data Slots) */ ++/* --- Register AC97C_ICA */ ++#define AT91C_AC97C_CHID3 (0x7 << 0 ) /**< (AC97C) Channel Id for the input slot 3 */ ++#define AT91C_AC97C_CHID3_NONE 0x0 /**< (AC97C) No data will be transmitted during this slot */ ++#define AT91C_AC97C_CHID3_CA 0x1 /**< (AC97C) Channel A data will be transmitted during this slot */ ++#define AT91C_AC97C_CHID3_CB 0x2 /**< (AC97C) Channel B data will be transmitted during this slot */ ++#define AT91C_AC97C_CHID3_CC 0x3 /**< (AC97C) Channel C data will be transmitted during this slot */ ++#define AT91C_AC97C_CHID4 (0x7 << 3 ) /**< (AC97C) Channel Id for the input slot 4 */ ++#define AT91C_AC97C_CHID4_NONE (0x0 << 3) /**< (AC97C) No data will be transmitted during this slot */ ++#define AT91C_AC97C_CHID4_CA (0x1 << 3) /**< (AC97C) Channel A data will be transmitted during this slot */ ++#define AT91C_AC97C_CHID4_CB (0x2 << 3) /**< (AC97C) Channel B data will be transmitted during this slot */ ++#define AT91C_AC97C_CHID4_CC (0x3 << 3) /**< (AC97C) Channel C data will be transmitted during this slot */ ++#define AT91C_AC97C_CHID5 (0x7 << 6 ) /**< (AC97C) Channel Id for the input slot 5 */ ++#define AT91C_AC97C_CHID5_NONE (0x0 << 6) /**< (AC97C) No data will be transmitted during this slot */ ++#define AT91C_AC97C_CHID5_CA (0x1 << 6) /**< (AC97C) Channel A data will be transmitted during this slot */ ++#define AT91C_AC97C_CHID5_CB (0x2 << 6) /**< (AC97C) Channel B data will be transmitted during this slot */ ++#define AT91C_AC97C_CHID5_CC (0x3 << 6) /**< (AC97C) Channel C data will be transmitted during this slot */ ++#define AT91C_AC97C_CHID6 (0x7 << 9 ) /**< (AC97C) Channel Id for the input slot 6 */ ++#define AT91C_AC97C_CHID6_NONE (0x0 << 9) /**< (AC97C) No data will be transmitted during this slot */ ++#define AT91C_AC97C_CHID6_CA (0x1 << 9) /**< (AC97C) Channel A data will be transmitted during this slot */ ++#define AT91C_AC97C_CHID6_CB (0x2 << 9) /**< (AC97C) Channel B data will be transmitted during this slot */ ++#define AT91C_AC97C_CHID6_CC (0x3 << 9) /**< (AC97C) Channel C data will be transmitted during this slot */ ++#define AT91C_AC97C_CHID7 (0x7 << 12) /**< (AC97C) Channel Id for the input slot 7 */ ++#define AT91C_AC97C_CHID7_NONE (0x0 << 12) /**< (AC97C) No data will be transmitted during this slot */ ++#define AT91C_AC97C_CHID7_CA (0x1 << 12) /**< (AC97C) Channel A data will be transmitted during this slot */ ++#define AT91C_AC97C_CHID7_CB (0x2 << 12) /**< (AC97C) Channel B data will be transmitted during this slot */ ++#define AT91C_AC97C_CHID7_CC (0x3 << 12) /**< (AC97C) Channel C data will be transmitted during this slot */ ++#define AT91C_AC97C_CHID8 (0x7 << 15) /**< (AC97C) Channel Id for the input slot 8 */ ++#define AT91C_AC97C_CHID8_NONE (0x0 << 15) /**< (AC97C) No data will be transmitted during this slot */ ++#define AT91C_AC97C_CHID8_CA (0x1 << 15) /**< (AC97C) Channel A data will be transmitted during this slot */ ++#define AT91C_AC97C_CHID8_CB (0x2 << 15) /**< (AC97C) Channel B data will be transmitted during this slot */ ++#define AT91C_AC97C_CHID8_CC (0x3 << 15) /**< (AC97C) Channel C data will be transmitted during this slot */ ++#define AT91C_AC97C_CHID9 (0x7 << 18) /**< (AC97C) Channel Id for the input slot 9 */ ++#define AT91C_AC97C_CHID9_NONE (0x0 << 18) /**< (AC97C) No data will be transmitted during this slot */ ++#define AT91C_AC97C_CHID9_CA (0x1 << 18) /**< (AC97C) Channel A data will be transmitted during this slot */ ++#define AT91C_AC97C_CHID9_CB (0x2 << 18) /**< (AC97C) Channel B data will be transmitted during this slot */ ++#define AT91C_AC97C_CHID9_CC (0x3 << 18) /**< (AC97C) Channel C data will be transmitted during this slot */ ++#define AT91C_AC97C_CHID10 (0x7 << 21) /**< (AC97C) Channel Id for the input slot 10 */ ++#define AT91C_AC97C_CHID10_NONE (0x0 << 21) /**< (AC97C) No data will be transmitted during this slot */ ++#define AT91C_AC97C_CHID10_CA (0x1 << 21) /**< (AC97C) Channel A data will be transmitted during this slot */ ++#define AT91C_AC97C_CHID10_CB (0x2 << 21) /**< (AC97C) Channel B data will be transmitted during this slot */ ++#define AT91C_AC97C_CHID10_CC (0x3 << 21) /**< (AC97C) Channel C data will be transmitted during this slot */ ++#define AT91C_AC97C_CHID11 (0x7 << 24) /**< (AC97C) Channel Id for the input slot 11 */ ++#define AT91C_AC97C_CHID11_NONE (0x0 << 24) /**< (AC97C) No data will be transmitted during this slot */ ++#define AT91C_AC97C_CHID11_CA (0x1 << 24) /**< (AC97C) Channel A data will be transmitted during this slot */ ++#define AT91C_AC97C_CHID11_CB (0x2 << 24) /**< (AC97C) Channel B data will be transmitted during this slot */ ++#define AT91C_AC97C_CHID11_CC (0x3 << 24) /**< (AC97C) Channel C data will be transmitted during this slot */ ++#define AT91C_AC97C_CHID12 (0x7 << 27) /**< (AC97C) Channel Id for the input slot 12 */ ++#define AT91C_AC97C_CHID12_NONE (0x0 << 27) /**< (AC97C) No data will be transmitted during this slot */ ++#define AT91C_AC97C_CHID12_CA (0x1 << 27) /**< (AC97C) Channel A data will be transmitted during this slot */ ++#define AT91C_AC97C_CHID12_CB (0x2 << 27) /**< (AC97C) Channel B data will be transmitted during this slot */ ++#define AT91C_AC97C_CHID12_CC (0x3 << 27) /**< (AC97C) Channel C data will be transmitted during this slot */ ++/* --- Register AC97C_OCA */ ++#define AT91C_AC97C_CHID3 (0x7 << 0 ) /**< (AC97C) Channel Id for the input slot 3 */ ++#define AT91C_AC97C_CHID3_NONE 0x0 /**< (AC97C) No data will be transmitted during this slot */ ++#define AT91C_AC97C_CHID3_CA 0x1 /**< (AC97C) Channel A data will be transmitted during this slot */ ++#define AT91C_AC97C_CHID3_CB 0x2 /**< (AC97C) Channel B data will be transmitted during this slot */ ++#define AT91C_AC97C_CHID3_CC 0x3 /**< (AC97C) Channel C data will be transmitted during this slot */ ++#define AT91C_AC97C_CHID4 (0x7 << 3 ) /**< (AC97C) Channel Id for the input slot 4 */ ++#define AT91C_AC97C_CHID4_NONE (0x0 << 3) /**< (AC97C) No data will be transmitted during this slot */ ++#define AT91C_AC97C_CHID4_CA (0x1 << 3) /**< (AC97C) Channel A data will be transmitted during this slot */ ++#define AT91C_AC97C_CHID4_CB (0x2 << 3) /**< (AC97C) Channel B data will be transmitted during this slot */ ++#define AT91C_AC97C_CHID4_CC (0x3 << 3) /**< (AC97C) Channel C data will be transmitted during this slot */ ++#define AT91C_AC97C_CHID5 (0x7 << 6 ) /**< (AC97C) Channel Id for the input slot 5 */ ++#define AT91C_AC97C_CHID5_NONE (0x0 << 6) /**< (AC97C) No data will be transmitted during this slot */ ++#define AT91C_AC97C_CHID5_CA (0x1 << 6) /**< (AC97C) Channel A data will be transmitted during this slot */ ++#define AT91C_AC97C_CHID5_CB (0x2 << 6) /**< (AC97C) Channel B data will be transmitted during this slot */ ++#define AT91C_AC97C_CHID5_CC (0x3 << 6) /**< (AC97C) Channel C data will be transmitted during this slot */ ++#define AT91C_AC97C_CHID6 (0x7 << 9 ) /**< (AC97C) Channel Id for the input slot 6 */ ++#define AT91C_AC97C_CHID6_NONE (0x0 << 9) /**< (AC97C) No data will be transmitted during this slot */ ++#define AT91C_AC97C_CHID6_CA (0x1 << 9) /**< (AC97C) Channel A data will be transmitted during this slot */ ++#define AT91C_AC97C_CHID6_CB (0x2 << 9) /**< (AC97C) Channel B data will be transmitted during this slot */ ++#define AT91C_AC97C_CHID6_CC (0x3 << 9) /**< (AC97C) Channel C data will be transmitted during this slot */ ++#define AT91C_AC97C_CHID7 (0x7 << 12) /**< (AC97C) Channel Id for the input slot 7 */ ++#define AT91C_AC97C_CHID7_NONE (0x0 << 12) /**< (AC97C) No data will be transmitted during this slot */ ++#define AT91C_AC97C_CHID7_CA (0x1 << 12) /**< (AC97C) Channel A data will be transmitted during this slot */ ++#define AT91C_AC97C_CHID7_CB (0x2 << 12) /**< (AC97C) Channel B data will be transmitted during this slot */ ++#define AT91C_AC97C_CHID7_CC (0x3 << 12) /**< (AC97C) Channel C data will be transmitted during this slot */ ++#define AT91C_AC97C_CHID8 (0x7 << 15) /**< (AC97C) Channel Id for the input slot 8 */ ++#define AT91C_AC97C_CHID8_NONE (0x0 << 15) /**< (AC97C) No data will be transmitted during this slot */ ++#define AT91C_AC97C_CHID8_CA (0x1 << 15) /**< (AC97C) Channel A data will be transmitted during this slot */ ++#define AT91C_AC97C_CHID8_CB (0x2 << 15) /**< (AC97C) Channel B data will be transmitted during this slot */ ++#define AT91C_AC97C_CHID8_CC (0x3 << 15) /**< (AC97C) Channel C data will be transmitted during this slot */ ++#define AT91C_AC97C_CHID9 (0x7 << 18) /**< (AC97C) Channel Id for the input slot 9 */ ++#define AT91C_AC97C_CHID9_NONE (0x0 << 18) /**< (AC97C) No data will be transmitted during this slot */ ++#define AT91C_AC97C_CHID9_CA (0x1 << 18) /**< (AC97C) Channel A data will be transmitted during this slot */ ++#define AT91C_AC97C_CHID9_CB (0x2 << 18) /**< (AC97C) Channel B data will be transmitted during this slot */ ++#define AT91C_AC97C_CHID9_CC (0x3 << 18) /**< (AC97C) Channel C data will be transmitted during this slot */ ++#define AT91C_AC97C_CHID10 (0x7 << 21) /**< (AC97C) Channel Id for the input slot 10 */ ++#define AT91C_AC97C_CHID10_NONE (0x0 << 21) /**< (AC97C) No data will be transmitted during this slot */ ++#define AT91C_AC97C_CHID10_CA (0x1 << 21) /**< (AC97C) Channel A data will be transmitted during this slot */ ++#define AT91C_AC97C_CHID10_CB (0x2 << 21) /**< (AC97C) Channel B data will be transmitted during this slot */ ++#define AT91C_AC97C_CHID10_CC (0x3 << 21) /**< (AC97C) Channel C data will be transmitted during this slot */ ++#define AT91C_AC97C_CHID11 (0x7 << 24) /**< (AC97C) Channel Id for the input slot 11 */ ++#define AT91C_AC97C_CHID11_NONE (0x0 << 24) /**< (AC97C) No data will be transmitted during this slot */ ++#define AT91C_AC97C_CHID11_CA (0x1 << 24) /**< (AC97C) Channel A data will be transmitted during this slot */ ++#define AT91C_AC97C_CHID11_CB (0x2 << 24) /**< (AC97C) Channel B data will be transmitted during this slot */ ++#define AT91C_AC97C_CHID11_CC (0x3 << 24) /**< (AC97C) Channel C data will be transmitted during this slot */ ++#define AT91C_AC97C_CHID12 (0x7 << 27) /**< (AC97C) Channel Id for the input slot 12 */ ++#define AT91C_AC97C_CHID12_NONE (0x0 << 27) /**< (AC97C) No data will be transmitted during this slot */ ++#define AT91C_AC97C_CHID12_CA (0x1 << 27) /**< (AC97C) Channel A data will be transmitted during this slot */ ++#define AT91C_AC97C_CHID12_CB (0x2 << 27) /**< (AC97C) Channel B data will be transmitted during this slot */ ++#define AT91C_AC97C_CHID12_CC (0x3 << 27) /**< (AC97C) Channel C data will be transmitted during this slot */ ++/* --- Register AC97C_CARHR */ ++#define AT91C_AC97C_RDATA (0xFFFFF << 0 ) /**< (AC97C) Receive data */ ++/* --- Register AC97C_CATHR */ ++#define AT91C_AC97C_TDATA (0xFFFFF << 0 ) /**< (AC97C) Transmit data */ ++/* --- Register AC97C_CASR */ ++#define AT91C_AC97C_TXRDY (0x1 << 0 ) /**< (AC97C) */ ++#define AT91C_AC97C_TXEMPTY (0x1 << 1 ) /**< (AC97C) */ ++#define AT91C_AC97C_UNRUN (0x1 << 2 ) /**< (AC97C) */ ++#define AT91C_AC97C_RXRDY (0x1 << 4 ) /**< (AC97C) */ ++#define AT91C_AC97C_OVRUN (0x1 << 5 ) /**< (AC97C) */ ++#define AT91C_AC97C_ENDTX (0x1 << 10) /**< (AC97C) */ ++#define AT91C_AC97C_TXBUFE (0x1 << 11) /**< (AC97C) */ ++#define AT91C_AC97C_ENDRX (0x1 << 14) /**< (AC97C) */ ++#define AT91C_AC97C_RXBUFF (0x1 << 15) /**< (AC97C) */ ++/* --- Register AC97C_CAMR */ ++#define AT91C_AC97C_TXRDY (0x1 << 0 ) /**< (AC97C) */ ++#define AT91C_AC97C_TXEMPTY (0x1 << 1 ) /**< (AC97C) */ ++#define AT91C_AC97C_UNRUN (0x1 << 2 ) /**< (AC97C) */ ++#define AT91C_AC97C_RXRDY (0x1 << 4 ) /**< (AC97C) */ ++#define AT91C_AC97C_OVRUN (0x1 << 5 ) /**< (AC97C) */ ++#define AT91C_AC97C_ENDTX (0x1 << 10) /**< (AC97C) */ ++#define AT91C_AC97C_TXBUFE (0x1 << 11) /**< (AC97C) */ ++#define AT91C_AC97C_ENDRX (0x1 << 14) /**< (AC97C) */ ++#define AT91C_AC97C_RXBUFF (0x1 << 15) /**< (AC97C) */ ++#define AT91C_AC97C_SIZE (0x3 << 16) /**< (AC97C) */ ++#define AT91C_AC97C_SIZE_20_BITS (0x0 << 16) /**< (AC97C) Data size is 20 bits */ ++#define AT91C_AC97C_SIZE_18_BITS (0x1 << 16) /**< (AC97C) Data size is 18 bits */ ++#define AT91C_AC97C_SIZE_16_BITS (0x2 << 16) /**< (AC97C) Data size is 16 bits */ ++#define AT91C_AC97C_SIZE_10_BITS (0x3 << 16) /**< (AC97C) Data size is 10 bits */ ++#define AT91C_AC97C_CEM (0x1 << 18) /**< (AC97C) */ ++#define AT91C_AC97C_CEN (0x1 << 21) /**< (AC97C) */ ++#define AT91C_AC97C_PDCEN (0x1 << 22) /**< (AC97C) */ ++/* --- Register AC97C_CBRHR */ ++#define AT91C_AC97C_RDATA (0xFFFFF << 0 ) /**< (AC97C) Receive data */ ++/* --- Register AC97C_CBTHR */ ++#define AT91C_AC97C_TDATA (0xFFFFF << 0 ) /**< (AC97C) Transmit data */ ++/* --- Register AC97C_CBSR */ ++#define AT91C_AC97C_TXRDY (0x1 << 0 ) /**< (AC97C) */ ++#define AT91C_AC97C_TXEMPTY (0x1 << 1 ) /**< (AC97C) */ ++#define AT91C_AC97C_UNRUN (0x1 << 2 ) /**< (AC97C) */ ++#define AT91C_AC97C_RXRDY (0x1 << 4 ) /**< (AC97C) */ ++#define AT91C_AC97C_OVRUN (0x1 << 5 ) /**< (AC97C) */ ++/* --- Register AC97C_CBMR */ ++#define AT91C_AC97C_TXRDY (0x1 << 0 ) /**< (AC97C) */ ++#define AT91C_AC97C_TXEMPTY (0x1 << 1 ) /**< (AC97C) */ ++#define AT91C_AC97C_UNRUN (0x1 << 2 ) /**< (AC97C) */ ++#define AT91C_AC97C_RXRDY (0x1 << 4 ) /**< (AC97C) */ ++#define AT91C_AC97C_OVRUN (0x1 << 5 ) /**< (AC97C) */ ++#define AT91C_AC97C_SIZE (0x3 << 16) /**< (AC97C) */ ++#define AT91C_AC97C_SIZE_20_BITS (0x0 << 16) /**< (AC97C) Data size is 20 bits */ ++#define AT91C_AC97C_SIZE_18_BITS (0x1 << 16) /**< (AC97C) Data size is 18 bits */ ++#define AT91C_AC97C_SIZE_16_BITS (0x2 << 16) /**< (AC97C) Data size is 16 bits */ ++#define AT91C_AC97C_SIZE_10_BITS (0x3 << 16) /**< (AC97C) Data size is 10 bits */ ++#define AT91C_AC97C_CEM (0x1 << 18) /**< (AC97C) */ ++#define AT91C_AC97C_CEN (0x1 << 21) /**< (AC97C) */ ++/* --- Register AC97C_CORHR */ ++#define AT91C_AC97C_SDATA (0xFFFF << 0 ) /**< (AC97C) Status Data */ ++/* --- Register AC97C_COTHR */ ++#define AT91C_AC97C_CDATA (0xFFFF << 0 ) /**< (AC97C) Command Data */ ++#define AT91C_AC97C_CADDR (0x7F << 16) /**< (AC97C) COdec control register index */ ++#define AT91C_AC97C_READ (0x1 << 23) /**< (AC97C) Read/Write command */ ++/* --- Register AC97C_COSR */ ++#define AT91C_AC97C_TXRDY (0x1 << 0 ) /**< (AC97C) */ ++#define AT91C_AC97C_TXEMPTY (0x1 << 1 ) /**< (AC97C) */ ++#define AT91C_AC97C_UNRUN (0x1 << 2 ) /**< (AC97C) */ ++#define AT91C_AC97C_RXRDY (0x1 << 4 ) /**< (AC97C) */ ++/* --- Register AC97C_COMR */ ++#define AT91C_AC97C_TXRDY (0x1 << 0 ) /**< (AC97C) */ ++#define AT91C_AC97C_TXEMPTY (0x1 << 1 ) /**< (AC97C) */ ++#define AT91C_AC97C_UNRUN (0x1 << 2 ) /**< (AC97C) */ ++#define AT91C_AC97C_RXRDY (0x1 << 4 ) /**< (AC97C) */ ++/* --- Register AC97C_SR */ ++#define AT91C_AC97C_SOF (0x1 << 0 ) /**< (AC97C) */ ++#define AT91C_AC97C_WKUP (0x1 << 1 ) /**< (AC97C) */ ++#define AT91C_AC97C_COEVT (0x1 << 2 ) /**< (AC97C) */ ++#define AT91C_AC97C_CAEVT (0x1 << 3 ) /**< (AC97C) */ ++#define AT91C_AC97C_CBEVT (0x1 << 4 ) /**< (AC97C) */ ++/* --- Register AC97C_IER */ ++#define AT91C_AC97C_SOF (0x1 << 0 ) /**< (AC97C) */ ++#define AT91C_AC97C_WKUP (0x1 << 1 ) /**< (AC97C) */ ++#define AT91C_AC97C_COEVT (0x1 << 2 ) /**< (AC97C) */ ++#define AT91C_AC97C_CAEVT (0x1 << 3 ) /**< (AC97C) */ ++#define AT91C_AC97C_CBEVT (0x1 << 4 ) /**< (AC97C) */ ++/* --- Register AC97C_IDR */ ++#define AT91C_AC97C_SOF (0x1 << 0 ) /**< (AC97C) */ ++#define AT91C_AC97C_WKUP (0x1 << 1 ) /**< (AC97C) */ ++#define AT91C_AC97C_COEVT (0x1 << 2 ) /**< (AC97C) */ ++#define AT91C_AC97C_CAEVT (0x1 << 3 ) /**< (AC97C) */ ++#define AT91C_AC97C_CBEVT (0x1 << 4 ) /**< (AC97C) */ ++/* --- Register AC97C_IMR */ ++#define AT91C_AC97C_SOF (0x1 << 0 ) /**< (AC97C) */ ++#define AT91C_AC97C_WKUP (0x1 << 1 ) /**< (AC97C) */ ++#define AT91C_AC97C_COEVT (0x1 << 2 ) /**< (AC97C) */ ++#define AT91C_AC97C_CAEVT (0x1 << 3 ) /**< (AC97C) */ ++#define AT91C_AC97C_CBEVT (0x1 << 4 ) /**< (AC97C) */ ++ ++#endif /* __AC97C_H */ +diff -urNp linux-2.6.28-at91/arch/arm/mach-at91/Kconfig linux-2.6.28-at91-ronetix/arch/arm/mach-at91/Kconfig +--- linux-2.6.28-at91/arch/arm/mach-at91/Kconfig 2009-01-12 15:59:27.000000000 +0100 ++++ linux-2.6.28-at91-ronetix/arch/arm/mach-at91/Kconfig 2009-01-12 16:00:41.000000000 +0100 +@@ -280,6 +280,13 @@ config MACH_NEOCORE926 + help + Select this if you are using the Adeneo Neocore 926 board. + ++config MACH_PM9263 ++ bool "Ronetix PM9263 Evaluation Kit" ++ depends on ARCH_AT91SAM9263 ++ help ++ Select this if you are using Ronetix's PM9263 board. ++ <http://ronetix.at/starter_kit_9263.html> ++ + endif + + # ---------------------------------------------------------- +@@ -347,13 +354,13 @@ comment "AT91 Board Options" + + config MTD_AT91_DATAFLASH_CARD + bool "Enable DataFlash Card support" +- depends on (ARCH_AT91RM9200DK || MACH_AT91RM9200EK || MACH_AT91SAM9260EK || MACH_AT91SAM9261EK || MACH_AT91SAM9263EK || MACH_AT91SAM9G20EK || MACH_ECBAT91 || MACH_SAM9_L9260 || MACH_AT91CAP9ADK || MACH_TOTEMNOVA || MACH_NEOCORE926) ++ depends on (ARCH_AT91RM9200DK || MACH_AT91RM9200EK || MACH_AT91SAM9260EK || MACH_AT91SAM9261EK || MACH_AT91SAM9263EK || MACH_AT91SAM9G20EK || MACH_ECBAT91 || MACH_SAM9_L9260 || MACH_AT91CAP9ADK || MACH_TOTEMNOVA || MACH_NEOCORE926 || MACH_PM9263) + help + Enable support for the DataFlash card. + + config MTD_NAND_ATMEL_BUSWIDTH_16 + bool "Enable 16-bit data bus interface to NAND flash" +- depends on (MACH_AT91SAM9260EK || MACH_AT91SAM9261EK || MACH_AT91SAM9263EK || MACH_AT91SAM9G20EK || MACH_AT91CAP9ADK) ++ depends on (MACH_AT91SAM9260EK || MACH_AT91SAM9261EK || MACH_AT91SAM9263EK || MACH_AT91SAM9G20EK || MACH_AT91CAP9ADK || MACH_PM9263) + help + On AT91SAM926x boards both types of NAND flash can be present + (8 and 16 bit data bus width). +diff -urNp linux-2.6.28-at91/arch/arm/mach-at91/Makefile linux-2.6.28-at91-ronetix/arch/arm/mach-at91/Makefile +--- linux-2.6.28-at91/arch/arm/mach-at91/Makefile 2009-01-12 15:59:27.000000000 +0100 ++++ linux-2.6.28-at91-ronetix/arch/arm/mach-at91/Makefile 2009-01-12 16:00:41.000000000 +0100 +@@ -54,6 +54,7 @@ obj-$(CONFIG_MACH_USB_A9263) += board-us + obj-$(CONFIG_MACH_CSB737) += board-csb737.o + obj-$(CONFIG_MACH_TOTEMNOVA) += board-totemnova.o + obj-$(CONFIG_MACH_NEOCORE926) += board-neocore926.o ++obj-$(CONFIG_MACH_PM9263) += board-pm9263.o + + # AT91SAM9RL board-specific support + obj-$(CONFIG_MACH_AT91SAM9RLEK) += board-sam9rlek.o +diff -urNp linux-2.6.28-at91/drivers/pcmcia/at91_cf.c linux-2.6.28-at91-ronetix/drivers/pcmcia/at91_cf.c +--- linux-2.6.28-at91/drivers/pcmcia/at91_cf.c 2009-01-12 15:59:27.000000000 +0100 ++++ linux-2.6.28-at91-ronetix/drivers/pcmcia/at91_cf.c 2009-01-12 16:00:42.000000000 +0100 +@@ -27,7 +27,7 @@ + + #if defined(CONFIG_ARCH_AT91RM9200) + #include <mach/at91rm9200_mc.h> +-#elif defined(CONFIG_ARCH_AT91SAM9260) ++#elif defined(CONFIG_ARCH_AT91SAM9260) || defined(CONFIG_ARCH_AT91SAM9263) + #include <mach/at91sam9_smc.h> + #else + #error "Unsupported AT91 processor" +@@ -138,7 +138,8 @@ at91_cf_set_socket(struct pcmcia_socket + } + + /* toggle reset if needed */ +- gpio_set_value(cf->board->rst_pin, s->flags & SS_RESET); ++ if (cf->board->rst_pin) ++ gpio_set_value(cf->board->rst_pin, s->flags & SS_RESET); + + pr_debug("%s: Vcc %d, io_irq %d, flags %04x csc %04x\n", + driver_name, s->Vcc, s->io_irq, s->flags, s->csc_mask); +diff -urNp linux-2.6.28-at91/drivers/pcmcia/Kconfig linux-2.6.28-at91-ronetix/drivers/pcmcia/Kconfig +--- linux-2.6.28-at91/drivers/pcmcia/Kconfig 2009-01-12 15:59:27.000000000 +0100 ++++ linux-2.6.28-at91-ronetix/drivers/pcmcia/Kconfig 2009-01-12 16:00:42.000000000 +0100 +@@ -270,7 +270,7 @@ config BFIN_CFPCMCIA + + config AT91_CF + tristate "AT91 CompactFlash Controller" +- depends on PCMCIA && (ARCH_AT91RM9200 || ARCH_AT91SAM9260) ++ depends on PCMCIA && (ARCH_AT91RM9200 || ARCH_AT91SAM9260 || ARCH_AT91SAM9263) + help + Say Y here to support the CompactFlash controller on AT91 chips. + Or choose M to compile the driver as a module named "at91_cf". +diff -urNp linux-2.6.28-at91/sound/arm/at91-ac97.c.rej linux-2.6.28-at91-ronetix/sound/arm/at91-ac97.c.rej +--- linux-2.6.28-at91/sound/arm/at91-ac97.c.rej 1970-01-01 01:00:00.000000000 +0100 ++++ linux-2.6.28-at91-ronetix/sound/arm/at91-ac97.c.rej 2009-01-12 16:00:43.000000000 +0100 +@@ -0,0 +1,702 @@ ++*************** ++*** 0 **** ++--- 1,699 ---- +++ /* drivers/sound/arm/at91-ac97c.c +++ * +++ * Driver for the Atmel AC97 Controller +++ * +++ * Copyright (C) 2005 Atmel Norway +++ */ +++ +++ #define CAPTURE 0 +++ +++ #define EXTRA_DEBUG 0 +++ +++ #undef DEBUG +++ #include <linux/platform_device.h> +++ #include <linux/module.h> +++ #include <linux/init.h> +++ #include <linux/interrupt.h> +++ #include <linux/delay.h> +++ #include <linux/clk.h> +++ #include <linux/atmel_pdc.h> +++ +++ //#include <sound/driver.h> +++ #include <sound/core.h> +++ #include <sound/initval.h> +++ #include <sound/pcm.h> +++ #include <sound/ac97_codec.h> +++ +++ #include <asm/io.h> +++ #include <mach/hardware.h> +++ #include <asm/cacheflush.h> +++ +++ #include <mach/gpio.h> +++ #include <mach/at91_ac97c.h> +++ #include <mach/board.h> +++ +++ #define platform_num_resources(dev) ((dev)->num_resources) +++ #define platform_resource_start(dev, i) ((dev)->resource[(i)].start) +++ #define platform_resource_end(dev, i) ((dev)->resource[(i)].end) +++ #define platform_resource_flags(dev, i) ((dev)->resource[(i)].flags) +++ #define platform_resource_len(dev, i) \ +++ (platform_resource_end((dev), (i)) - \ +++ platform_resource_start((dev), (i)) + 1) +++ +++ +++ /* module parameters */ +++ static int index[SNDRV_CARDS] = SNDRV_DEFAULT_IDX; +++ static char *id[SNDRV_CARDS] = SNDRV_DEFAULT_STR; +++ static int enable[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE_PNP; +++ +++ module_param_array(index, int, NULL, 0444); +++ MODULE_PARM_DESC(index, "Index value for AC97 controller"); +++ module_param_array(id, charp, NULL, 0444); +++ MODULE_PARM_DESC(id, "ID string for AC97 controller"); +++ module_param_array(enable, bool, NULL, 0444); +++ MODULE_PARM_DESC(enable, "Enable AC97 controller"); +++ +++ typedef struct at91_ac97 { +++ spinlock_t lock; +++ void *regs; +++ int period; +++ struct clk *ac97_clk; +++ struct snd_pcm_substream *playback_substream; +++ struct snd_card *card; +++ struct snd_pcm *pcm; +++ struct snd_ac97 *ac97; +++ struct snd_ac97_bus *ac97_bus; +++ int irq; +++ struct platform_device *pdev; +++ u8 reset_pin; +++ } at91_ac97_t; +++ +++ #define get_chip(card) ((at91_ac97_t *)(card)->private_data) +++ +++ #define ac97c_writel(chip, reg, val) \ +++ writel((val), (chip)->regs + AC97C_##reg) +++ +++ #define ac97c_readl(chip, reg) \ +++ readl((chip)->regs + AC97C_##reg) +++ +++ // PIO management functions +++ void at91_ac97c_drive_reset(at91_ac97_t *chip, unsigned int value) +++ { +++ if (chip->reset_pin) +++ at91_set_gpio_value(chip->reset_pin, value); +++ } +++ +++ +++ static const char driver_name[] = "at91-ac97"; +++ +++ /* PCM part */ +++ +++ static struct snd_pcm_hardware snd_at91_ac97_hw = { +++ .info = (SNDRV_PCM_INFO_INTERLEAVED +++ | SNDRV_PCM_INFO_MMAP +++ | SNDRV_PCM_INFO_MMAP_VALID +++ | SNDRV_PCM_INFO_BLOCK_TRANSFER), +++ .formats = SNDRV_PCM_FMTBIT_S16_LE, +++ .rates = SNDRV_PCM_RATE_CONTINUOUS, +++ .rate_min = 8000, +++ .rate_max = 48000, +++ .channels_min = 2, +++ .channels_max = 2, +++ .buffer_bytes_max = 256*1024, +++ .period_bytes_min = 1024, +++ .period_bytes_max = 4*1024, +++ .periods_min = 1, +++ .periods_max = 64, +++ }; +++ +++ static int snd_at91_ac97_playback_open(struct snd_pcm_substream *substream) +++ { +++ at91_ac97_t *chip = snd_pcm_substream_chip(substream); +++ struct snd_pcm_runtime *runtime = substream->runtime; +++ +++ runtime->hw = snd_at91_ac97_hw; +++ chip->playback_substream = substream; +++ chip->period = 0; +++ +++ snd_printd(KERN_DEBUG "%s : snd_at91_ac97_playback_open\n\r", driver_name); +++ +++ return 0; +++ } +++ +++ static int snd_at91_ac97_playback_close(struct snd_pcm_substream *substream) +++ { +++ at91_ac97_t *chip = snd_pcm_substream_chip(substream); +++ +++ chip->playback_substream = NULL; +++ return 0; +++ } +++ +++ static int snd_at91_ac97_hw_params(struct snd_pcm_substream *substream, +++ struct snd_pcm_hw_params *hw_params) +++ { +++ int err; +++ +++ err = snd_pcm_lib_malloc_pages(substream, +++ params_buffer_bytes(hw_params)); +++ return err; +++ } +++ +++ static int snd_at91_ac97_hw_free(struct snd_pcm_substream *substream) +++ { +++ +++ snd_pcm_lib_free_pages(substream); +++ +++ return 0; +++ } +++ +++ static int snd_at91_ac97_playback_prepare(struct snd_pcm_substream *substream) +++ { +++ at91_ac97_t *chip = snd_pcm_substream_chip(substream); +++ struct snd_pcm_runtime *runtime = substream->runtime; +++ int block_size = frames_to_bytes(runtime, runtime->period_size); +++ unsigned long word = 0; +++ +++ //clean_dcache_region(runtime->dma_area, block_size * 2); +++ snd_printd(KERN_DEBUG "%s : block_size = %d\n\r", driver_name, block_size); +++ +++ /* Assign slots to channels */ +++ switch (substream->runtime->channels) { +++ /* TODO: Support more than two channels */ +++ case 1: +++ word |= AT91C_AC97C_CHID3_CA; +++ break; +++ case 2: +++ default: +++ /* Assign Left and Right slots (3,4) to Channel A */ +++ word |= AT91C_AC97C_CHID3_CA | AT91C_AC97C_CHID4_CA; +++ break; +++ } +++ +++ ac97c_writel(chip, OCA, word); +++ +++ /* +++ * Configure sample format and size. +++ * FIXME: Avoid conflicts with capture channel. +++ */ +++ word = AT91C_AC97C_PDCEN | AT91C_AC97C_SIZE_16_BITS; +++ +++ switch (runtime->format){ +++ case SNDRV_PCM_FORMAT_S16_BE: +++ word |= AT91C_AC97C_CEM; +++ break; +++ case SNDRV_PCM_FORMAT_S16_LE: +++ default: +++ break; +++ } +++ +++ ac97c_writel(chip, CAMR, word); +++ +++ /* Set variable rate if needed */ +++ if ( runtime->rate != 48000 ){ +++ word = ac97c_readl(chip, MR); +++ word |= AT91C_AC97C_VRA; +++ ac97c_writel(chip, MR, word); +++ } else { +++ /* Clear Variable Rate Bit */ +++ word = ac97c_readl(chip, MR); +++ word &= ~AT91C_AC97C_VRA; +++ ac97c_writel(chip, MR, word); +++ } +++ +++ /* Set rate */ +++ snd_ac97_set_rate(chip->ac97, AC97_PCM_FRONT_DAC_RATE, runtime->rate); +++ +++ snd_printd(KERN_DEBUG +++ "%s : dma_addr = %x\n\r" +++ " : dma_area = %p\n\r" +++ " : dma_bytes = %d\n\r", +++ driver_name, runtime->dma_addr, +++ runtime->dma_area, runtime->dma_bytes); +++ +++ /* Initialize and start the PDC */ +++ writel(runtime->dma_addr, chip->regs + ATMEL_PDC_TPR); +++ writel(block_size / 2, chip->regs + ATMEL_PDC_TCR); +++ writel(runtime->dma_addr + block_size, chip->regs + ATMEL_PDC_TNPR); +++ writel(block_size / 2, chip->regs + ATMEL_PDC_TNCR); +++ +++ /* Enable Channel A interrupts */ +++ ac97c_writel(chip, IER, AT91C_AC97C_CAEVT); +++ +++ snd_printd(KERN_DEBUG "%s : snd_at91_ac97_playback_prepare\n\r", driver_name); +++ +++ return 0; +++ } +++ +++ static int at91_ac97_trigger(struct snd_pcm_substream *substream, int cmd) +++ { +++ at91_ac97_t *chip = snd_pcm_substream_chip(substream); +++ unsigned long camr, ptcr = 0, flags; +++ int err = 0; +++ +++ spin_lock_irqsave(&chip->lock, flags); +++ camr = ac97c_readl(chip, CAMR); +++ +++ switch (cmd) { +++ case SNDRV_PCM_TRIGGER_START: +++ camr |= (AT91C_AC97C_CEN | AT91C_AC97C_ENDTX); +++ ptcr = ATMEL_PDC_TXTEN; +++ break; +++ case SNDRV_PCM_TRIGGER_STOP: +++ camr &= ~(AT91C_AC97C_CEN | AT91C_AC97C_ENDTX); +++ ptcr = ATMEL_PDC_TXTDIS; +++ break; +++ default: +++ err = -EINVAL; +++ break; +++ } +++ +++ ac97c_writel(chip, CAMR, camr); +++ writel(ptcr, chip->regs + ATMEL_PDC_PTCR); +++ +++ spin_unlock_irqrestore(&chip->lock, flags); +++ +++ snd_printd(KERN_DEBUG "%s : snd_at91_ac97_trigger\n\r", driver_name); +++ +++ return err; +++ } +++ +++ static snd_pcm_uframes_t snd_at91_ac97_pointer(struct snd_pcm_substream *substream) +++ { +++ at91_ac97_t *chip = snd_pcm_substream_chip(substream); +++ struct snd_pcm_runtime *runtime = substream->runtime; +++ snd_pcm_uframes_t pos; +++ unsigned long bytes; +++ +++ bytes = readl(chip->regs + ATMEL_PDC_TPR) - runtime->dma_addr; +++ +++ pos = bytes_to_frames(runtime, bytes); +++ if (pos >= runtime->buffer_size) +++ pos -= runtime->buffer_size; +++ +++ snd_printd(KERN_DEBUG "%s : snd_at91_ac97_pointer\n\r", driver_name); +++ +++ return pos; +++ } +++ +++ static struct snd_pcm_ops at91_ac97_playback_ops = { +++ .open = snd_at91_ac97_playback_open, +++ .close = snd_at91_ac97_playback_close, +++ .ioctl = snd_pcm_lib_ioctl, +++ .hw_params = snd_at91_ac97_hw_params, +++ .hw_free = snd_at91_ac97_hw_free, +++ .prepare = snd_at91_ac97_playback_prepare, +++ .trigger = at91_ac97_trigger, +++ .pointer = snd_at91_ac97_pointer, +++ }; +++ +++ #if CAPTURE +++ static struct snd_pcm_ops at91_ac97_capture_ops = { +++ .open = snd_at91_ac97_playback_open, +++ .close = snd_at91_ac97_playback_close, +++ .ioctl = snd_pcm_lib_ioctl, +++ .hw_params = snd_at91_ac97_hw_params, +++ .hw_free = snd_at91_ac97_hw_free, +++ .prepare = snd_at91_ac97_playback_prepare, +++ .trigger = at91_ac97_trigger, +++ .pointer = snd_at91_ac97_pointer, +++ }; +++ #endif +++ +++ static struct ac97_pcm at91_ac97_pcm_defs[] __devinitdata = { +++ /* Playback */ +++ { +++ .exclusive = 1, +++ .r = { { +++ .slots = ((1 << AC97_SLOT_PCM_LEFT) +++ | (1 << AC97_SLOT_PCM_RIGHT)), +++ } }, +++ }, +++ #if CAPTURE +++ { /* Mic in */ +++ .stream = 1, +++ .exclusive = 1, +++ .r = { +++ [0] = { +++ .slots = (1 << AC97_SLOT_MIC), +++ }, +++ }, +++ } +++ #endif +++ }; +++ +++ static int __devinit snd_at91_ac97_pcm_new(at91_ac97_t *chip) +++ { +++ struct snd_pcm *pcm; +++ int err; +++ +++ err = snd_ac97_pcm_assign(chip->ac97_bus, 1, at91_ac97_pcm_defs); +++ if (err) +++ return err; +++ +++ err = snd_pcm_new(chip->card, "Atmel AC97", 0, 1, 0, &pcm); +++ if (err) +++ return err; +++ +++ snd_pcm_lib_preallocate_pages_for_all(pcm, SNDRV_DMA_TYPE_DEV, +++ &chip->pdev->dev, +++ 128 * 1024, 256 * 1024); +++ +++ snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK, &at91_ac97_playback_ops); +++ #if CAPTURE +++ snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_CAPTURE, &at91_ac97_capture_ops); +++ #endif +++ pcm->private_data = chip; +++ pcm->info_flags = 0; +++ strcpy(pcm->name, "Atmel AC97"); +++ chip->pcm = pcm; +++ +++ return 0; +++ } +++ +++ /* Mixer part */ +++ static int snd_at91_ac97_mixer_new(at91_ac97_t *chip) +++ { +++ int err; +++ struct snd_ac97_template template; +++ +++ memset(&template, 0, sizeof(template)); +++ template.private_data = chip; +++ template.num = 0; +++ template.addr = 0; +++ err = snd_ac97_mixer(chip->ac97_bus, &template, &chip->ac97); +++ +++ return err; +++ } +++ +++ +++ static irqreturn_t snd_at91_ac97_interrupt(int irq, void *dev_id) +++ { +++ at91_ac97_t *chip = dev_id; +++ unsigned long status; +++ unsigned long dummy; +++ +++ status = ac97c_readl(chip, SR); +++ +++ if (status & AT91C_AC97C_CAEVT) { +++ struct snd_pcm_runtime *runtime; +++ int offset, next_period, block_size; +++ unsigned long casr; +++ +++ runtime = chip->playback_substream->runtime; +++ block_size = frames_to_bytes(runtime, runtime->period_size); +++ +++ casr = ac97c_readl(chip, CASR); +++ +++ if (casr & AT91C_AC97C_ENDTX) { +++ chip->period++; +++ if (chip->period == runtime->periods) +++ chip->period = 0; +++ next_period = chip->period + 1; +++ if (next_period == runtime->periods) +++ next_period = 0; +++ +++ offset = block_size * next_period; +++ +++ writel(runtime->dma_addr + offset, chip->regs + ATMEL_PDC_TNPR); +++ writel(block_size / 2, chip->regs + ATMEL_PDC_TNCR); +++ +++ snd_pcm_period_elapsed(chip->playback_substream); +++ } else { +++ printk(KERN_WARNING +++ "Spurious AC97A interrupt, status = 0x%08lx\n", +++ (unsigned long)casr); +++ } +++ } else { +++ printk(KERN_WARNING +++ "Spurious AC97 interrupt, status = 0x%08lx\n", +++ status); +++ } +++ +++ dummy = ac97c_readl(chip, SR); +++ +++ return IRQ_HANDLED; +++ } +++ +++ +++ /* CODEC part */ +++ +++ static void snd_at91_ac97_hard_reset(at91_ac97_t *chip) +++ { +++ // Enable AC97 Controller. +++ // Perform a cold (hard) reset of the AC97 codec. +++ ac97c_writel(chip, MR, 0); +++ ac97c_writel(chip, MR, AT91C_AC97C_ENA); +++ +++ at91_ac97c_drive_reset(chip, 0); +++ udelay(1); +++ at91_ac97c_drive_reset(chip, 1); +++ udelay(1); +++ } +++ +++ +++ static void snd_at91_ac97_write(struct snd_ac97 *ac97, unsigned short reg, +++ unsigned short val) +++ { +++ at91_ac97_t *chip = ac97->private_data; +++ unsigned long word; +++ int timeout = 0x100; +++ +++ snd_printd(KERN_DEBUG "%s : Writing codec register 0x%x = 0x%x\n\r", driver_name, reg, val); +++ +++ word = (reg & 0x7f) << 16 | val; +++ +++ do { +++ if (ac97c_readl(chip, COSR) & AT91C_AC97C_TXRDY) { +++ ac97c_writel(chip, COTHR, word); +++ return; +++ } +++ udelay(1); +++ } while (--timeout); +++ +++ snd_printk(KERN_WARNING "at91-ac97: codec write timeout\n\r"); +++ } +++ +++ static unsigned short snd_at91_ac97_read(struct snd_ac97 *ac97, +++ unsigned short reg) +++ { +++ at91_ac97_t *chip = ac97->private_data; +++ unsigned long word; +++ int timeout = 0x100; +++ +++ +++ word = (0x80 | (reg & 0x7f)) << 16; +++ +++ do { +++ if (ac97c_readl(chip, COSR) & AT91C_AC97C_TXRDY){ +++ ac97c_writel(chip, COTHR, word); +++ break; +++ } +++ udelay(1); +++ } while (--timeout); +++ +++ if (!timeout) +++ goto timed_out; +++ +++ timeout = 0x100; +++ +++ do { +++ if (ac97c_readl(chip, COSR) & AT91C_AC97C_RXRDY){ +++ unsigned short val = (unsigned short) ac97c_readl(chip, CORHR); +++ return val; +++ } +++ udelay(1); +++ } while (--timeout); +++ +++ if (!timeout) +++ goto timed_out1; +++ +++ timed_out: +++ snd_printk(KERN_WARNING "at91-ac97: codec read timeout\n\r"); +++ return 0xffff; +++ +++ timed_out1: +++ #if EXTRA_DEBUG +++ snd_printk(KERN_WARNING "at91-ac97: codec read timeout 1\n\r"); +++ #endif +++ return 0xffff; +++ } +++ +++ static void snd_at91_ac97_warm_reset(struct snd_ac97 *ac97) +++ { +++ at91_ac97_t *chip = ac97->private_data; +++ volatile unsigned int mr = ac97c_readl(chip, MR); +++ +++ mr |= AT91C_AC97C_WRST; +++ +++ ac97c_writel(chip, MR, mr); +++ udelay(1); +++ +++ mr &= ~AT91C_AC97C_WRST; +++ ac97c_writel(chip, MR, mr); +++ } +++ +++ static void snd_at91_ac97_destroy(struct snd_card *card) +++ { +++ at91_ac97_t *chip = get_chip(card); +++ +++ #if 0 +++ // Disable AC97 Controller +++ ac97c_writel(chip, MR, 0); +++ +++ // Disable AC97 Controller clock +++ if (chip->ac97_clk) clk_disable(chip->ac97_clk); +++ #endif +++ if (chip->irq != -1) { +++ free_irq(chip->irq, chip); +++ chip->irq = -1; +++ } +++ if (chip->regs) { +++ iounmap(chip->regs); +++ chip->regs = NULL; +++ } +++ } +++ +++ static int __devinit snd_at91_ac97_create(struct snd_card *card, +++ struct platform_device *pdev) +++ { +++ static struct snd_ac97_bus_ops ops = { +++ .write = snd_at91_ac97_write, +++ .read = snd_at91_ac97_read, +++ .reset = snd_at91_ac97_warm_reset, +++ }; +++ +++ at91_ac97_t *chip = get_chip(card); +++ int irq, err = 0; +++ +++ card->private_free = snd_at91_ac97_destroy; +++ +++ spin_lock_init(&chip->lock); +++ chip->card = card; +++ chip->pdev = pdev; +++ chip->irq = -1; +++ +++ if (!(platform_resource_flags(pdev, 0) & IORESOURCE_MEM) +++ || !(platform_resource_flags(pdev, 1) & IORESOURCE_IRQ)) +++ return -ENODEV; +++ +++ irq = platform_resource_start(pdev, 1); +++ +++ err = request_irq(irq, snd_at91_ac97_interrupt, 0, "ac97", chip); +++ if (err) { +++ snd_printk(KERN_WARNING "unable to request IRQ%d\n", irq); +++ return err; +++ } +++ +++ chip->irq = irq; +++ #if EXTRA_DEBUG +++ snd_printk(KERN_INFO "AC97C regs = %08X \n", platform_resource_start(pdev, 0)); +++ snd_printk(KERN_INFO "AC97C irq = %d \n",irq); +++ #endif +++ +++ chip->regs = ioremap(platform_resource_start(pdev, 0), +++ platform_resource_len(pdev, 0)); +++ if (!chip->regs) { +++ snd_printk(KERN_WARNING "unable to remap AC97C io memory\n"); +++ return -ENOMEM; +++ } +++ +++ snd_card_set_dev(card, &pdev->dev); +++ +++ err = snd_ac97_bus(card, 0, &ops, chip, &chip->ac97_bus); +++ +++ return err; +++ } +++ +++ static int __devinit snd_at91_ac97_probe(struct platform_device *pdev) +++ { +++ static int dev; +++ struct atmel_ac97_data *pdata = pdev->dev.platform_data; +++ struct snd_card *card; +++ at91_ac97_t *chip; +++ int err; +++ +++ if (dev >= SNDRV_CARDS) +++ return -ENODEV; +++ if (!enable[dev]) { +++ dev++; +++ return -ENOENT; +++ } +++ card = snd_card_new(index[dev], id[dev], THIS_MODULE, +++ sizeof(at91_ac97_t)); +++ if (!card) +++ return -ENOMEM; +++ chip = get_chip(card); +++ +++ err = snd_at91_ac97_create(card, pdev); +++ if (err) +++ goto out_free_card; +++ +++ // Enable AC97 Controller clock +++ chip->reset_pin = pdata->reset_pin; +++ chip->ac97_clk = clk_get(NULL, "ac97_clk"); +++ if(!chip->ac97_clk) +++ goto out_free_card; +++ +++ clk_enable(chip->ac97_clk); +++ +++ // Perform a codec hard reset. +++ // This also enables the AC97 Controller. +++ snd_at91_ac97_hard_reset(chip); +++ +++ err = snd_at91_ac97_mixer_new(chip); +++ if (err) +++ goto out_free_card; +++ +++ err = snd_at91_ac97_pcm_new(chip); +++ if (err) +++ goto out_free_card; +++ +++ +++ strcpy(card->driver, "ac97c"); +++ strcpy(card->shortname, "Atmel AC97"); +++ sprintf(card->longname, "Atmel AC97 Controller at %#lx, irq %i", +++ (unsigned long) platform_resource_start(pdev, 0), (int) chip->irq); +++ +++ err = snd_card_register(card); +++ if (err) +++ goto out_free_card; +++ +++ dev_set_drvdata(&pdev->dev, card); +++ dev++; +++ return 0; +++ +++ out_free_card: +++ snd_card_free(card); +++ return err; +++ } +++ +++ static int __devexit snd_at91_ac97_remove(struct platform_device *pdev) +++ { +++ struct snd_card *card = dev_get_drvdata(&pdev->dev); +++ at91_ac97_t *chip; +++ +++ +++ if (! card) return 0; +++ +++ chip = get_chip(card); +++ +++ snd_card_free(card); +++ +++ // Disable AC97 Controller +++ ac97c_writel(chip, MR, 0); +++ +++ // Disable AC97 Controller clock +++ clk_disable(chip->ac97_clk); +++ +++ dev_set_drvdata(&pdev->dev, NULL); +++ +++ return 0; +++ } +++ +++ static struct platform_driver at91_ac97_driver = +++ { +++ .probe = snd_at91_ac97_probe, +++ .remove = __devexit_p(snd_at91_ac97_remove), +++ .driver = +++ { +++ .name = "ac97c", +++ } +++ , +++ }; +++ +++ static int __init at91_ac97_init(void) +++ { +++ return platform_driver_register(&at91_ac97_driver); +++ } +++ +++ static void __exit at91_ac97_exit(void) +++ { +++ platform_driver_unregister(&at91_ac97_driver); +++ } +++ +++ module_init(at91_ac97_init); +++ module_exit(at91_ac97_exit); +++ +++ MODULE_LICENSE("GPL"); +++ MODULE_DESCRIPTION("Driver for Atmel AC97 Controller"); +++ MODULE_AUTHOR("Atmel"); +diff -urNp linux-2.6.28-at91/sound/arm/Kconfig linux-2.6.28-at91-ronetix/sound/arm/Kconfig +--- linux-2.6.28-at91/sound/arm/Kconfig 2009-01-12 15:59:32.000000000 +0100 ++++ linux-2.6.28-at91-ronetix/sound/arm/Kconfig 2009-01-12 16:00:42.000000000 +0100 +@@ -59,5 +59,14 @@ config SND_AT91_AC97 + Say Y or M if you want to support any AC97 codec attached to + the SAM926X AC97 Controller. + ++config SND_AT91_AC97 ++ tristate "AC97 Controller driver for SAM926X familly from ATMEL" ++ depends on SND && ARCH_AT91SAM9263 ++ select SND_PCM ++ select SND_AC97_CODEC ++ help ++ Say Y or M if you want to support any AC97 codec attached to ++ the SAM926X AC97 Controller. ++ + endif # SND_ARM + +diff -urNp linux-2.6.28-at91/sound/arm/Kconfig.orig linux-2.6.28-at91-ronetix/sound/arm/Kconfig.orig +--- linux-2.6.28-at91/sound/arm/Kconfig.orig 1970-01-01 01:00:00.000000000 +0100 ++++ linux-2.6.28-at91-ronetix/sound/arm/Kconfig.orig 2009-01-12 16:00:31.000000000 +0100 +@@ -0,0 +1,63 @@ ++# ALSA ARM drivers ++ ++menuconfig SND_ARM ++ bool "ARM sound devices" ++ depends on ARM ++ default y ++ help ++ Support for sound devices specific to ARM architectures. ++ Drivers that are implemented on ASoC can be found in ++ "ALSA for SoC audio support" section. ++ ++if SND_ARM ++ ++config SND_SA11XX_UDA1341 ++ tristate "SA11xx UDA1341TS driver (iPaq H3600)" ++ depends on ARCH_SA1100 && L3 ++ select SND_PCM ++ help ++ Say Y here if you have a Compaq iPaq H3x00 handheld computer ++ and want to use its Philips UDA 1341 audio chip. ++ ++ To compile this driver as a module, choose M here: the module ++ will be called snd-sa11xx-uda1341. ++ ++config SND_ARMAACI ++ tristate "ARM PrimeCell PL041 AC Link support" ++ depends on ARM_AMBA ++ select SND_PCM ++ select SND_AC97_CODEC ++ ++config SND_PXA2XX_PCM ++ tristate ++ select SND_PCM ++ ++config SND_PXA2XX_LIB ++ tristate ++ select SND_AC97_CODEC if SND_PXA2XX_LIB_AC97 ++ ++config SND_PXA2XX_LIB_AC97 ++ bool ++ ++config SND_PXA2XX_AC97 ++ tristate "AC97 driver for the Intel PXA2xx chip" ++ depends on ARCH_PXA ++ select SND_PXA2XX_PCM ++ select SND_AC97_CODEC ++ select SND_PXA2XX_LIB ++ select SND_PXA2XX_LIB_AC97 ++ help ++ Say Y or M if you want to support any AC97 codec attached to ++ the PXA2xx AC97 interface. ++ ++config SND_AT91_AC97 ++ tristate "AC97 Controller driver for SAM926X familly from ATMEL" ++ depends on SND && ARCH_AT91 ++ select SND_PCM ++ select SND_AC97_CODEC ++ help ++ Say Y or M if you want to support any AC97 codec attached to ++ the SAM926X AC97 Controller. ++ ++endif # SND_ARM ++ +diff -urNp linux-2.6.28-at91/sound/arm/Makefile.orig linux-2.6.28-at91-ronetix/sound/arm/Makefile.orig +--- linux-2.6.28-at91/sound/arm/Makefile.orig 1970-01-01 01:00:00.000000000 +0100 ++++ linux-2.6.28-at91-ronetix/sound/arm/Makefile.orig 2009-01-12 16:00:31.000000000 +0100 +@@ -0,0 +1,23 @@ ++# ++# Makefile for ALSA ++# ++ ++obj-$(CONFIG_SND_SA11XX_UDA1341) += snd-sa11xx-uda1341.o ++snd-sa11xx-uda1341-objs := sa11xx-uda1341.o ++ ++obj-$(CONFIG_SND_ARMAACI) += snd-aaci.o ++snd-aaci-objs := aaci.o devdma.o ++ ++obj-$(CONFIG_SND_PXA2XX_PCM) += snd-pxa2xx-pcm.o ++snd-pxa2xx-pcm-objs := pxa2xx-pcm.o ++ ++obj-$(CONFIG_SND_PXA2XX_LIB) += snd-pxa2xx-lib.o ++snd-pxa2xx-lib-y := pxa2xx-pcm-lib.o ++snd-pxa2xx-lib-$(CONFIG_SND_PXA2XX_LIB_AC97) += pxa2xx-ac97-lib.o ++ ++obj-$(CONFIG_SND_PXA2XX_AC97) += snd-pxa2xx-ac97.o ++snd-pxa2xx-ac97-objs := pxa2xx-ac97.o ++ ++obj-$(CONFIG_SND_AT91_AC97) += snd-at91-ac97.o ++snd-at91-ac97-objs := at91-ac97.o ++ +diff -urNp linux-2.6.28-at91/sound/arm/Makefile.rej linux-2.6.28-at91-ronetix/sound/arm/Makefile.rej +--- linux-2.6.28-at91/sound/arm/Makefile.rej 1970-01-01 01:00:00.000000000 +0100 ++++ linux-2.6.28-at91-ronetix/sound/arm/Makefile.rej 2009-01-12 16:00:42.000000000 +0100 +@@ -0,0 +1,12 @@ ++*************** ++*** 17,19 **** ++ ++ obj-$(CONFIG_SND_PXA2XX_AC97) += snd-pxa2xx-ac97.o ++ snd-pxa2xx-ac97-objs := pxa2xx-ac97.o ++--- 17,22 ---- ++ ++ obj-$(CONFIG_SND_PXA2XX_AC97) += snd-pxa2xx-ac97.o ++ snd-pxa2xx-ac97-objs := pxa2xx-ac97.o +++ +++ obj-$(CONFIG_SND_AT91_AC97) += snd-at91-ac97.o +++ snd-at91-ac97-objs := at91-ac97.o diff --git a/packages/linux/linux-linkstationppc/defconfig b/packages/linux/linux-linkstationppc/defconfig index 5f0dd18e8d..4d700a2882 100644 --- a/packages/linux/linux-linkstationppc/defconfig +++ b/packages/linux/linux-linkstationppc/defconfig @@ -1,7 +1,7 @@ # # Automatically generated make config: don't edit -# Linux kernel version: 2.6.27.9 -# Sun Dec 14 21:26:49 2008 +# Linux kernel version: 2.6.27.10 +# Wed Feb 11 00:10:13 2009 # # CONFIG_PPC64 is not set @@ -1158,14 +1158,99 @@ CONFIG_SSB_POSSIBLE=y # # Multimedia core support # -# CONFIG_VIDEO_DEV is not set +CONFIG_VIDEO_DEV=m +CONFIG_VIDEO_V4L2_COMMON=m +CONFIG_VIDEO_ALLOW_V4L1=y +CONFIG_VIDEO_V4L1_COMPAT=y # CONFIG_DVB_CORE is not set -# CONFIG_VIDEO_MEDIA is not set +CONFIG_VIDEO_MEDIA=m # # Multimedia drivers # -# CONFIG_DAB is not set +# CONFIG_MEDIA_ATTACH is not set +CONFIG_MEDIA_TUNER=m +# CONFIG_MEDIA_TUNER_CUSTOMIZE is not set +CONFIG_MEDIA_TUNER_SIMPLE=m +CONFIG_MEDIA_TUNER_TDA8290=m +CONFIG_MEDIA_TUNER_TDA9887=m +CONFIG_MEDIA_TUNER_TEA5761=m +CONFIG_MEDIA_TUNER_TEA5767=m +CONFIG_MEDIA_TUNER_MT20XX=m +CONFIG_MEDIA_TUNER_XC2028=m +CONFIG_MEDIA_TUNER_XC5000=m +CONFIG_VIDEO_V4L2=m +CONFIG_VIDEO_V4L1=m +CONFIG_VIDEOBUF_GEN=m +CONFIG_VIDEOBUF_VMALLOC=m +CONFIG_VIDEO_IR=m +CONFIG_VIDEO_TVEEPROM=m +CONFIG_VIDEO_TUNER=m +CONFIG_VIDEO_CAPTURE_DRIVERS=y +# CONFIG_VIDEO_ADV_DEBUG is not set +CONFIG_VIDEO_HELPER_CHIPS_AUTO=y +CONFIG_VIDEO_IR_I2C=m +CONFIG_VIDEO_MSP3400=m +CONFIG_VIDEO_CS53L32A=m +CONFIG_VIDEO_WM8775=m +CONFIG_VIDEO_SAA711X=m +CONFIG_VIDEO_TVP5150=m +CONFIG_VIDEO_CX25840=m +CONFIG_VIDEO_CX2341X=m +# CONFIG_VIDEO_VIVI is not set +# CONFIG_VIDEO_BT848 is not set +# CONFIG_VIDEO_CPIA is not set +# CONFIG_VIDEO_CPIA2 is not set +# CONFIG_VIDEO_SAA5246A is not set +# CONFIG_VIDEO_SAA5249 is not set +# CONFIG_TUNER_3036 is not set +# CONFIG_VIDEO_STRADIS is not set +# CONFIG_VIDEO_SAA7134 is not set +# CONFIG_VIDEO_MXB is not set +# CONFIG_VIDEO_DPC is not set +# CONFIG_VIDEO_HEXIUM_ORION is not set +# CONFIG_VIDEO_HEXIUM_GEMINI is not set +# CONFIG_VIDEO_CX88 is not set +# CONFIG_VIDEO_IVTV is not set +# CONFIG_VIDEO_CAFE_CCIC is not set +CONFIG_V4L_USB_DRIVERS=y +CONFIG_USB_VIDEO_CLASS=m +CONFIG_USB_VIDEO_CLASS_INPUT_EVDEV=y +CONFIG_USB_GSPCA=m +CONFIG_VIDEO_PVRUSB2=m +CONFIG_VIDEO_PVRUSB2_SYSFS=y +# CONFIG_VIDEO_PVRUSB2_DEBUGIFC is not set +CONFIG_VIDEO_EM28XX=m +CONFIG_VIDEO_EM28XX_ALSA=m +CONFIG_VIDEO_USBVISION=m +CONFIG_VIDEO_USBVIDEO=m +CONFIG_USB_VICAM=m +CONFIG_USB_IBMCAM=m +CONFIG_USB_KONICAWC=m +CONFIG_USB_QUICKCAM_MESSENGER=m +CONFIG_USB_ET61X251=m +CONFIG_VIDEO_OVCAMCHIP=m +CONFIG_USB_W9968CF=m +CONFIG_USB_OV511=m +CONFIG_USB_SE401=m +CONFIG_USB_SN9C102=m +CONFIG_USB_STV680=m +CONFIG_USB_ZC0301=m +CONFIG_USB_PWC=m +# CONFIG_USB_PWC_DEBUG is not set +CONFIG_USB_ZR364XX=m +CONFIG_USB_STKWEBCAM=m +CONFIG_USB_S2255=m +# CONFIG_SOC_CAMERA is not set +# CONFIG_VIDEO_SH_MOBILE_CEU is not set +CONFIG_RADIO_ADAPTERS=y +# CONFIG_RADIO_GEMTEK_PCI is not set +# CONFIG_RADIO_MAXIRADIO is not set +# CONFIG_RADIO_MAESTRO is not set +CONFIG_USB_DSBR=m +# CONFIG_USB_SI470X is not set +CONFIG_DAB=y +CONFIG_USB_DABUSB=m # # Graphics support diff --git a/packages/linux/linux-linkstationppc/fw-and-powerpc-install.patch b/packages/linux/linux-linkstationppc/fw-and-powerpc-install.patch new file mode 100644 index 0000000000..9f1eda7ef5 --- /dev/null +++ b/packages/linux/linux-linkstationppc/fw-and-powerpc-install.patch @@ -0,0 +1,36 @@ +diff -urN linux-2.6.27.7.old//arch/powerpc/boot/Makefile linux-2.6.27.7//arch/powerpc/boot/Makefile +--- linux-2.6.27.7.old//arch/powerpc/boot/Makefile 2008-11-20 23:02:37.000000000 +0000 ++++ linux-2.6.27.7//arch/powerpc/boot/Makefile 2008-11-22 21:02:13.456791583 +0000 +@@ -376,16 +376,16 @@ + cmd_mkdir = mkdir -p $@ + + quiet_cmd_install = INSTALL $(patsubst $(DESTDIR)$(WRAPPER_OBJDIR)/%,%,$@) +- cmd_install = $(INSTALL) -m0644 $(patsubst $(DESTDIR)$(WRAPPER_OBJDIR)/%,$(obj)/%,$@) $@ ++ cmd_install = $(INSTALL) -m 0644 $(patsubst $(DESTDIR)$(WRAPPER_OBJDIR)/%,$(obj)/%,$@) $@ + + quiet_cmd_install_dts = INSTALL $(patsubst $(DESTDIR)$(WRAPPER_DTSDIR)/%,dts/%,$@) +- cmd_install_dts = $(INSTALL) -m0644 $(patsubst $(DESTDIR)$(WRAPPER_DTSDIR)/%,$(srctree)/$(obj)/dts/%,$@) $@ ++ cmd_install_dts = $(INSTALL) -m 0644 $(patsubst $(DESTDIR)$(WRAPPER_DTSDIR)/%,$(srctree)/$(obj)/dts/%,$@) $@ + + quiet_cmd_install_exe = INSTALL $(patsubst $(DESTDIR)$(WRAPPER_BINDIR)/%,%,$@) +- cmd_install_exe = $(INSTALL) -m0755 $(patsubst $(DESTDIR)$(WRAPPER_BINDIR)/%,$(obj)/%,$@) $@ ++ cmd_install_exe = $(INSTALL) -m 0755 $(patsubst $(DESTDIR)$(WRAPPER_BINDIR)/%,$(obj)/%,$@) $@ + + quiet_cmd_install_wrapper = INSTALL $(patsubst $(DESTDIR)$(WRAPPER_BINDIR)/%,%,$@) +- cmd_install_wrapper = $(INSTALL) -m0755 $(patsubst $(DESTDIR)$(WRAPPER_BINDIR)/%,$(srctree)/$(obj)/%,$@) $@ ;\ ++ cmd_install_wrapper = $(INSTALL) -m 0755 $(patsubst $(DESTDIR)$(WRAPPER_BINDIR)/%,$(srctree)/$(obj)/%,$@) $@ ;\ + sed -i $@ -e 's%^object=.*%object=$(WRAPPER_OBJDIR)%' \ + -e 's%^objbin=.*%objbin=$(WRAPPER_BINDIR)%' \ + +diff -urN linux-2.6.27.7.old//scripts/Makefile.fwinst linux-2.6.27.7//scripts/Makefile.fwinst +--- linux-2.6.27.7.old//scripts/Makefile.fwinst 2008-11-20 23:02:37.000000000 +0000 ++++ linux-2.6.27.7//scripts/Makefile.fwinst 2008-11-22 21:01:50.870504646 +0000 +@@ -37,7 +37,7 @@ + @true + + quiet_cmd_install = INSTALL $(subst $(srctree)/,,$@) +- cmd_install = $(INSTALL) -m0644 $< $@ ++ cmd_install = $(INSTALL) -m 0644 $< $@ + + $(installed-fw-dirs): + $(call cmd,mkdir) diff --git a/packages/linux/linux-linkstationppc_2.6.27.10.bb b/packages/linux/linux-linkstationppc_2.6.28.4.bb index 2f6308cd27..3c15d78e42 100644 --- a/packages/linux/linux-linkstationppc_2.6.27.10.bb +++ b/packages/linux/linux-linkstationppc_2.6.28.4.bb @@ -1,16 +1,17 @@ DESCRIPTION = "Linux Kernel for the Buffalo Linkstation HD/HG" SECTION = "kernel" LICENSE = "GPL" -PR = "r3" +PR = "r0" DEPENDS = "dtc-native u-boot-mkimage-native" COMPATIBLE_MACHINE = "(lsppchd|lsppchg)" -SRC_URI = "${KERNELORG_MIRROR}/pub/linux/kernel/v2.6/linux-2.6.27.tar.bz2 \ +SRC_URI = "${KERNELORG_MIRROR}/pub/linux/kernel/v2.6/linux-2.6.28.tar.bz2 \ ${KERNELORG_MIRROR}/pub/linux/kernel/v2.6/patch-${PV}.gz;patch=1 \ + file://fw-and-powerpc-install.patch;patch=1 \ file://defconfig \ " -S = "${WORKDIR}/linux-2.6.27" +S = "${WORKDIR}/linux-2.6.28" require linux.inc diff --git a/packages/linux/linux-n1200/defconfig b/packages/linux/linux-n1200/defconfig index f37ff8b640..6b5d5b5dfd 100644 --- a/packages/linux/linux-n1200/defconfig +++ b/packages/linux/linux-n1200/defconfig @@ -1,7 +1,7 @@ # # Automatically generated make config: don't edit # Linux kernel version: 2.6.27-rc9 -# Sun Jan 11 02:29:21 2009 +# Tue Feb 10 21:33:38 2009 # # CONFIG_PPC64 is not set @@ -1214,13 +1214,97 @@ CONFIG_SSB_POSSIBLE=y # # Multimedia core support # -# CONFIG_VIDEO_DEV is not set +CONFIG_VIDEO_DEV=m +CONFIG_VIDEO_V4L2_COMMON=m +CONFIG_VIDEO_ALLOW_V4L1=y +CONFIG_VIDEO_V4L1_COMPAT=y # CONFIG_DVB_CORE is not set -# CONFIG_VIDEO_MEDIA is not set +CONFIG_VIDEO_MEDIA=m # # Multimedia drivers # +# CONFIG_MEDIA_ATTACH is not set +CONFIG_MEDIA_TUNER=m +# CONFIG_MEDIA_TUNER_CUSTOMIZE is not set +CONFIG_MEDIA_TUNER_SIMPLE=m +CONFIG_MEDIA_TUNER_TDA8290=m +CONFIG_MEDIA_TUNER_TDA9887=m +CONFIG_MEDIA_TUNER_TEA5761=m +CONFIG_MEDIA_TUNER_TEA5767=m +CONFIG_MEDIA_TUNER_MT20XX=m +CONFIG_MEDIA_TUNER_XC2028=m +CONFIG_MEDIA_TUNER_XC5000=m +CONFIG_VIDEO_V4L2=m +CONFIG_VIDEO_V4L1=m +CONFIG_VIDEOBUF_GEN=m +CONFIG_VIDEOBUF_VMALLOC=m +CONFIG_VIDEO_IR=m +CONFIG_VIDEO_TVEEPROM=m +CONFIG_VIDEO_TUNER=m +CONFIG_VIDEO_CAPTURE_DRIVERS=y +# CONFIG_VIDEO_ADV_DEBUG is not set +CONFIG_VIDEO_HELPER_CHIPS_AUTO=y +CONFIG_VIDEO_IR_I2C=m +CONFIG_VIDEO_MSP3400=m +CONFIG_VIDEO_CS53L32A=m +CONFIG_VIDEO_WM8775=m +CONFIG_VIDEO_SAA711X=m +CONFIG_VIDEO_TVP5150=m +CONFIG_VIDEO_CX25840=m +CONFIG_VIDEO_CX2341X=m +# CONFIG_VIDEO_VIVI is not set +# CONFIG_VIDEO_BT848 is not set +# CONFIG_VIDEO_CPIA is not set +# CONFIG_VIDEO_CPIA2 is not set +# CONFIG_VIDEO_SAA5246A is not set +# CONFIG_VIDEO_SAA5249 is not set +# CONFIG_TUNER_3036 is not set +# CONFIG_VIDEO_STRADIS is not set +# CONFIG_VIDEO_SAA7134 is not set +# CONFIG_VIDEO_MXB is not set +# CONFIG_VIDEO_DPC is not set +# CONFIG_VIDEO_HEXIUM_ORION is not set +# CONFIG_VIDEO_HEXIUM_GEMINI is not set +# CONFIG_VIDEO_CX88 is not set +# CONFIG_VIDEO_IVTV is not set +# CONFIG_VIDEO_CAFE_CCIC is not set +CONFIG_V4L_USB_DRIVERS=y +CONFIG_USB_VIDEO_CLASS=m +CONFIG_USB_VIDEO_CLASS_INPUT_EVDEV=y +CONFIG_USB_GSPCA=m +CONFIG_VIDEO_PVRUSB2=m +CONFIG_VIDEO_PVRUSB2_SYSFS=y +# CONFIG_VIDEO_PVRUSB2_DEBUGIFC is not set +CONFIG_VIDEO_EM28XX=m +CONFIG_VIDEO_EM28XX_ALSA=m +CONFIG_VIDEO_USBVISION=m +CONFIG_VIDEO_USBVIDEO=m +CONFIG_USB_VICAM=m +CONFIG_USB_IBMCAM=m +CONFIG_USB_KONICAWC=m +CONFIG_USB_QUICKCAM_MESSENGER=m +CONFIG_USB_ET61X251=m +CONFIG_VIDEO_OVCAMCHIP=m +CONFIG_USB_W9968CF=m +CONFIG_USB_OV511=m +CONFIG_USB_SE401=m +CONFIG_USB_SN9C102=m +CONFIG_USB_STV680=m +CONFIG_USB_ZC0301=m +CONFIG_USB_PWC=m +# CONFIG_USB_PWC_DEBUG is not set +CONFIG_USB_ZR364XX=m +CONFIG_USB_STKWEBCAM=m +CONFIG_USB_S2255=m +# CONFIG_SOC_CAMERA is not set +# CONFIG_VIDEO_SH_MOBILE_CEU is not set +CONFIG_RADIO_ADAPTERS=y +# CONFIG_RADIO_GEMTEK_PCI is not set +# CONFIG_RADIO_MAXIRADIO is not set +# CONFIG_RADIO_MAESTRO is not set +CONFIG_USB_DSBR=m +# CONFIG_USB_SI470X is not set CONFIG_DAB=y CONFIG_USB_DABUSB=m diff --git a/packages/linux/linux-n1200_2.6.27-rc9+git.bb b/packages/linux/linux-n1200_2.6.27-rc9+git.bb index 04062679ca..7674379a6b 100644 --- a/packages/linux/linux-n1200_2.6.27-rc9+git.bb +++ b/packages/linux/linux-n1200_2.6.27-rc9+git.bb @@ -1,7 +1,7 @@ DESCRIPTION = "Linux Kernel for the Thecus n1200" SECTION = "kernel" LICENSE = "GPL" -PR = "r2" +PR = "r3" DEPENDS = "u-boot-mkimage-native" COMPATIBLE_MACHINE = "n1200" diff --git a/packages/linux/linux-omap-2.6.28/add-resizer-driver.patch b/packages/linux/linux-omap-2.6.28/add-resizer-driver.patch new file mode 100644 index 0000000000..9457bec576 --- /dev/null +++ b/packages/linux/linux-omap-2.6.28/add-resizer-driver.patch @@ -0,0 +1,19823 @@ +Index: git/drivers/media/video/isp/bluegamma_table.h +=================================================================== +--- /dev/null 1970-01-01 00:00:00.000000000 +0000 ++++ git/drivers/media/video/isp/bluegamma_table.h 2009-02-12 10:29:26.000000000 -0600 +@@ -0,0 +1,1040 @@ ++/* ++ * drivers/media/video/omap/isp/redgamma_table.h ++ * ++ * Gamma Table values for Red for TI's OMAP3430 Camera ISP ++ * ++ * Copyright (C) 2007 Texas Instruments, Inc. ++ * ++ * This package 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 PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR ++ * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED ++ * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. ++ */ ++ ++0, ++0, ++1, ++2, ++3, ++3, ++4, ++5, ++6, ++8, ++10, ++12, ++14, ++16, ++18, ++20, ++22, ++23, ++25, ++26, ++28, ++29, ++31, ++32, ++34, ++35, ++36, ++37, ++39, ++40, ++41, ++42, ++43, ++44, ++45, ++46, ++47, ++48, ++49, ++50, ++51, ++52, ++52, ++53, ++54, ++55, ++56, ++57, ++58, ++59, ++60, ++61, ++62, ++63, ++63, ++64, ++65, ++66, ++66, ++67, ++68, ++69, ++69, ++70, ++71, ++72, ++72, ++73, ++74, ++75, ++75, ++76, ++77, ++78, ++78, ++79, ++80, ++81, ++81, ++82, ++83, ++84, ++84, ++85, ++86, ++87, ++88, ++88, ++89, ++90, ++91, ++91, ++92, ++93, ++94, ++94, ++95, ++96, ++97, ++97, ++98, ++98, ++99, ++99, ++100, ++100, ++101, ++101, ++102, ++103, ++104, ++104, ++105, ++106, ++107, ++108, ++108, ++109, ++110, ++111, ++111, ++112, ++113, ++114, ++114, ++115, ++116, ++117, ++117, ++118, ++119, ++119, ++120, ++120, ++121, ++121, ++122, ++122, ++123, ++123, ++124, ++124, ++125, ++125, ++126, ++126, ++127, ++127, ++128, ++128, ++129, ++129, ++130, ++130, ++131, ++131, ++132, ++132, ++133, ++133, ++134, ++134, ++135, ++135, ++136, ++136, ++137, ++137, ++138, ++138, ++139, ++139, ++140, ++140, ++141, ++141, ++142, ++142, ++143, ++143, ++144, ++144, ++145, ++145, ++146, ++146, ++147, ++147, ++148, ++148, ++149, ++149, ++150, ++150, ++151, ++151, ++152, ++152, ++153, ++153, ++153, ++153, ++154, ++154, ++154, ++154, ++155, ++155, ++156, ++156, ++157, ++157, ++158, ++158, ++158, ++159, ++159, ++159, ++160, ++160, ++160, ++161, ++161, ++162, ++162, ++163, ++163, ++164, ++164, ++164, ++164, ++165, ++165, ++165, ++165, ++166, ++166, ++167, ++167, ++168, ++168, ++169, ++169, ++170, ++170, ++170, ++170, ++171, ++171, ++171, ++171, ++172, ++172, ++173, ++173, ++174, ++174, ++175, ++175, ++176, ++176, ++176, ++176, ++177, ++177, ++177, ++177, ++178, ++178, ++178, ++178, ++179, ++179, ++179, ++179, ++180, ++180, ++180, ++180, ++181, ++181, ++181, ++181, ++182, ++182, ++182, ++182, ++183, ++183, ++183, ++183, ++184, ++184, ++184, ++184, ++185, ++185, ++185, ++185, ++186, ++186, ++186, ++186, ++187, ++187, ++187, ++187, ++188, ++188, ++188, ++188, ++189, ++189, ++189, ++189, ++190, ++190, ++190, ++190, ++191, ++191, ++191, ++191, ++192, ++192, ++192, ++192, ++193, ++193, ++193, ++193, ++194, ++194, ++194, ++194, ++195, ++195, ++195, ++195, ++196, ++196, ++196, ++196, ++197, ++197, ++197, ++197, ++198, ++198, ++198, ++198, ++199, ++199, ++199, ++199, ++200, ++200, ++200, ++200, ++201, ++201, ++201, ++201, ++202, ++202, ++202, ++203, ++203, ++203, ++203, ++204, ++204, ++204, ++204, ++205, ++205, ++205, ++205, ++206, ++206, ++206, ++206, ++207, ++207, ++207, ++207, ++208, ++208, ++208, ++208, ++209, ++209, ++209, ++209, ++210, ++210, ++210, ++210, ++210, ++210, ++210, ++210, ++210, ++210, ++210, ++210, ++211, ++211, ++211, ++211, ++211, ++211, ++211, ++211, ++211, ++211, ++211, ++212, ++212, ++212, ++212, ++213, ++213, ++213, ++213, ++213, ++213, ++213, ++213, ++213, ++213, ++213, ++213, ++214, ++214, ++214, ++214, ++215, ++215, ++215, ++215, ++215, ++215, ++215, ++215, ++215, ++215, ++215, ++216, ++216, ++216, ++216, ++217, ++217, ++217, ++217, ++218, ++218, ++218, ++218, ++219, ++219, ++219, ++219, ++219, ++219, ++219, ++219, ++219, ++219, ++219, ++219, ++220, ++220, ++220, ++220, ++221, ++221, ++221, ++221, ++221, ++221, ++221, ++221, ++221, ++221, ++221, ++222, ++222, ++222, ++222, ++223, ++223, ++223, ++223, ++223, ++223, ++223, ++223, ++223, ++223, ++223, ++223, ++224, ++224, ++224, ++224, ++225, ++225, ++225, ++225, ++225, ++225, ++225, ++225, ++225, ++225, ++225, ++225, ++225, ++225, ++225, ++225, ++225, ++225, ++225, ++226, ++226, ++226, ++226, ++227, ++227, ++227, ++227, ++227, ++227, ++227, ++227, ++227, ++227, ++227, ++227, ++228, ++228, ++228, ++229, ++229, ++229, ++229, ++229, ++229, ++229, ++229, ++229, ++229, ++229, ++229, ++230, ++230, ++230, ++230, ++231, ++231, ++231, ++231, ++231, ++231, ++231, ++231, ++231, ++231, ++231, ++231, ++232, ++232, ++232, ++232, ++232, ++232, ++232, ++232, ++232, ++232, ++232, ++232, ++232, ++232, ++232, ++232, ++232, ++232, ++232, ++233, ++233, ++233, ++233, ++234, ++234, ++234, ++234, ++234, ++234, ++234, ++234, ++234, ++234, ++234, ++235, ++235, ++235, ++235, ++236, ++236, ++236, ++236, ++236, ++236, ++236, ++236, ++236, ++236, ++236, ++236, ++236, ++236, ++236, ++236, ++236, ++236, ++236, ++237, ++237, ++237, ++237, ++238, ++238, ++238, ++238, ++238, ++238, ++238, ++238, ++238, ++238, ++238, ++238, ++238, ++238, ++238, ++238, ++238, ++238, ++238, ++238, ++238, ++238, ++238, ++238, ++238, ++238, ++238, ++239, ++239, ++239, ++239, ++240, ++240, ++240, ++240, ++240, ++240, ++240, ++240, ++240, ++240, ++240, ++240, ++240, ++240, ++240, ++240, ++240, ++240, ++240, ++240, ++240, ++240, ++240, ++240, ++240, ++240, ++240, ++241, ++241, ++241, ++241, ++242, ++242, ++242, ++242, ++242, ++242, ++242, ++242, ++242, ++242, ++242, ++242, ++242, ++242, ++242, ++242, ++242, ++242, ++242, ++242, ++242, ++242, ++242, ++242, ++242, ++242, ++243, ++243, ++243, ++243, ++244, ++244, ++244, ++244, ++244, ++244, ++244, ++244, ++244, ++244, ++244, ++244, ++244, ++244, ++244, ++244, ++244, ++244, ++244, ++244, ++244, ++244, ++244, ++244, ++244, ++244, ++244, ++245, ++245, ++245, ++245, ++246, ++246, ++246, ++246, ++246, ++246, ++246, ++246, ++246, ++246, ++246, ++246, ++246, ++246, ++246, ++246, ++246, ++246, ++246, ++246, ++246, ++246, ++246, ++246, ++246, ++246, ++246, ++246, ++246, ++246, ++246, ++246, ++246, ++246, ++247, ++247, ++247, ++247, ++248, ++248, ++248, ++248, ++248, ++248, ++248, ++248, ++248, ++248, ++248, ++248, ++248, ++248, ++248, ++248, ++248, ++248, ++248, ++248, ++248, ++248, ++248, ++248, ++248, ++248, ++248, ++249, ++249, ++249, ++249, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++251, ++251, ++251, ++251, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++254, ++254, ++254, ++254, ++255, ++255, ++255, ++255, ++255, ++255, ++255, ++255, ++255, ++255, ++255, ++255, ++255, ++255, ++255, ++255, ++255, ++255, ++255, ++255, ++255, ++255, ++255, ++255, ++255, ++255, ++255 +Index: git/drivers/media/video/isp/cfa_coef_table.h +=================================================================== +--- /dev/null 1970-01-01 00:00:00.000000000 +0000 ++++ git/drivers/media/video/isp/cfa_coef_table.h 2009-02-12 10:29:26.000000000 -0600 +@@ -0,0 +1,592 @@ ++/* ++ * drivers/media/video/omap/isp/cfa_coef_table.h ++ * ++ * CFA Coefficient Table values for TI's OMAP3430 Camera ISP ++ * ++ * Copyright (C) 2007 Texas Instruments, Inc. ++ * ++ * This package 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 PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR ++ * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED ++ * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. ++ */ ++ ++0, ++247, ++0, ++244, ++247, ++36, ++27, ++12, ++0, ++27, ++0, ++250, ++244, ++12, ++250, ++4, ++0, ++0, ++0, ++248, ++0, ++0, ++40, ++0, ++4, ++250, ++12, ++244, ++250, ++0, ++27, ++0, ++12, ++27, ++36, ++247, ++244, ++0, ++247, ++0, ++0, ++40, ++0, ++0, ++248, ++0, ++0, ++0, ++0, ++247, ++0, ++244, ++247, ++36, ++27, ++12, ++0, ++27, ++0, ++250, ++244, ++12, ++250, ++4, ++0, ++0, ++0, ++248, ++0, ++0, ++40, ++0, ++4, ++250, ++12, ++244, ++250, ++0, ++27, ++0, ++12, ++27, ++36, ++247, ++244, ++0, ++247, ++0, ++0, ++40, ++0, ++0, ++248, ++0, ++0, ++0, ++0, ++247, ++0, ++244, ++247, ++36, ++27, ++12, ++0, ++27, ++0, ++250, ++244, ++12, ++250, ++4, ++0, ++0, ++0, ++248, ++0, ++0, ++40, ++0, ++4, ++250, ++12, ++244, ++250, ++0, ++27, ++0, ++12, ++27, ++36, ++247, ++244, ++0, ++247, ++0, ++0, ++40, ++0, ++0, ++248, ++0, ++0, ++0, ++244, ++0, ++247, ++0, ++12, ++27, ++36, ++247, ++250, ++0, ++27, ++0, ++4, ++250, ++12, ++244, ++248, ++0, ++0, ++0, ++0, ++40, ++0, ++0, ++244, ++12, ++250, ++4, ++0, ++27, ++0, ++250, ++247, ++36, ++27, ++12, ++0, ++247, ++0, ++244, ++0, ++0, ++40, ++0, ++0, ++0, ++0, ++248, ++244, ++0, ++247, ++0, ++12, ++27, ++36, ++247, ++250, ++0, ++27, ++0, ++4, ++250, ++12, ++244, ++248, ++0, ++0, ++0, ++0, ++40, ++0, ++0, ++244, ++12, ++250, ++4, ++0, ++27, ++0, ++250, ++247, ++36, ++27, ++12, ++0, ++247, ++0, ++244, ++0, ++0, ++40, ++0, ++0, ++0, ++0, ++248, ++244, ++0, ++247, ++0, ++12, ++27, ++36, ++247, ++250, ++0, ++27, ++0, ++4, ++250, ++12, ++244, ++248, ++0, ++0, ++0, ++0, ++40, ++0, ++0, ++244, ++12, ++250, ++4, ++0, ++27, ++0, ++250, ++247, ++36, ++27, ++12, ++0, ++247, ++0, ++244, ++0, ++0, ++40, ++0, ++0, ++0, ++0, ++248, ++244, ++12, ++250, ++4, ++0, ++27, ++0, ++250, ++247, ++36, ++27, ++12, ++0, ++247, ++0, ++244, ++248, ++0, ++0, ++0, ++0, ++40, ++0, ++0, ++244, ++0, ++247, ++0, ++12, ++27, ++36, ++247, ++250, ++0, ++27, ++0, ++4, ++250, ++12, ++244, ++0, ++0, ++40, ++0, ++0, ++0, ++0, ++248, ++244, ++12, ++250, ++4, ++0, ++27, ++0, ++250, ++247, ++36, ++27, ++12, ++0, ++247, ++0, ++244, ++248, ++0, ++0, ++0, ++0, ++40, ++0, ++0, ++244, ++0, ++247, ++0, ++12, ++27, ++36, ++247, ++250, ++0, ++27, ++0, ++4, ++250, ++12, ++244, ++0, ++0, ++40, ++0, ++0, ++0, ++0, ++248, ++244, ++12, ++250, ++4, ++0, ++27, ++0, ++250, ++247, ++36, ++27, ++12, ++0, ++247, ++0, ++244, ++248, ++0, ++0, ++0, ++0, ++40, ++0, ++0, ++244, ++0, ++247, ++0, ++12, ++27, ++36, ++247, ++250, ++0, ++27, ++0, ++4, ++250, ++12, ++244, ++0, ++0, ++40, ++0, ++0, ++0, ++0, ++248, ++4, ++250, ++12, ++244, ++250, ++0, ++27, ++0, ++12, ++27, ++36, ++247, ++244, ++0, ++247, ++0, ++0, ++0, ++0, ++248, ++0, ++0, ++40, ++0, ++0, ++247, ++0, ++244, ++247, ++36, ++27, ++12, ++0, ++27, ++0, ++250, ++244, ++12, ++250, ++4, ++0, ++40, ++0, ++0, ++248, ++0, ++0, ++0, ++4, ++250, ++12, ++244, ++250, ++0, ++27, ++0, ++12, ++27, ++36, ++247, ++244, ++0, ++247, ++0, ++0, ++0, ++0, ++248, ++0, ++0, ++40, ++0, ++0, ++247, ++0, ++244, ++247, ++36, ++27, ++12, ++0, ++27, ++0, ++250, ++244, ++12, ++250, ++4, ++0, ++40, ++0, ++0, ++248, ++0, ++0, ++0, ++4, ++250, ++12, ++244, ++250, ++0, ++27, ++0, ++12, ++27, ++36, ++247, ++244, ++0, ++247, ++0, ++0, ++0, ++0, ++248, ++0, ++0, ++40, ++0, ++0, ++247, ++0, ++244, ++247, ++36, ++27, ++12, ++0, ++27, ++0, ++250, ++244, ++12, ++250, ++4, ++0, ++40, ++0, ++0, ++248, ++0, ++0, ++0 +Index: git/drivers/media/video/isp/greengamma_table.h +=================================================================== +--- /dev/null 1970-01-01 00:00:00.000000000 +0000 ++++ git/drivers/media/video/isp/greengamma_table.h 2009-02-12 10:29:26.000000000 -0600 +@@ -0,0 +1,1040 @@ ++/* ++ * drivers/media/video/omap/isp/redgamma_table.h ++ * ++ * Gamma Table values for Red for TI's OMAP3430 Camera ISP ++ * ++ * Copyright (C) 2007 Texas Instruments, Inc. ++ * ++ * This package 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 PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR ++ * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED ++ * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. ++ */ ++ ++0, ++0, ++1, ++2, ++3, ++3, ++4, ++5, ++6, ++8, ++10, ++12, ++14, ++16, ++18, ++20, ++22, ++23, ++25, ++26, ++28, ++29, ++31, ++32, ++34, ++35, ++36, ++37, ++39, ++40, ++41, ++42, ++43, ++44, ++45, ++46, ++47, ++48, ++49, ++50, ++51, ++52, ++52, ++53, ++54, ++55, ++56, ++57, ++58, ++59, ++60, ++61, ++62, ++63, ++63, ++64, ++65, ++66, ++66, ++67, ++68, ++69, ++69, ++70, ++71, ++72, ++72, ++73, ++74, ++75, ++75, ++76, ++77, ++78, ++78, ++79, ++80, ++81, ++81, ++82, ++83, ++84, ++84, ++85, ++86, ++87, ++88, ++88, ++89, ++90, ++91, ++91, ++92, ++93, ++94, ++94, ++95, ++96, ++97, ++97, ++98, ++98, ++99, ++99, ++100, ++100, ++101, ++101, ++102, ++103, ++104, ++104, ++105, ++106, ++107, ++108, ++108, ++109, ++110, ++111, ++111, ++112, ++113, ++114, ++114, ++115, ++116, ++117, ++117, ++118, ++119, ++119, ++120, ++120, ++121, ++121, ++122, ++122, ++123, ++123, ++124, ++124, ++125, ++125, ++126, ++126, ++127, ++127, ++128, ++128, ++129, ++129, ++130, ++130, ++131, ++131, ++132, ++132, ++133, ++133, ++134, ++134, ++135, ++135, ++136, ++136, ++137, ++137, ++138, ++138, ++139, ++139, ++140, ++140, ++141, ++141, ++142, ++142, ++143, ++143, ++144, ++144, ++145, ++145, ++146, ++146, ++147, ++147, ++148, ++148, ++149, ++149, ++150, ++150, ++151, ++151, ++152, ++152, ++153, ++153, ++153, ++153, ++154, ++154, ++154, ++154, ++155, ++155, ++156, ++156, ++157, ++157, ++158, ++158, ++158, ++159, ++159, ++159, ++160, ++160, ++160, ++161, ++161, ++162, ++162, ++163, ++163, ++164, ++164, ++164, ++164, ++165, ++165, ++165, ++165, ++166, ++166, ++167, ++167, ++168, ++168, ++169, ++169, ++170, ++170, ++170, ++170, ++171, ++171, ++171, ++171, ++172, ++172, ++173, ++173, ++174, ++174, ++175, ++175, ++176, ++176, ++176, ++176, ++177, ++177, ++177, ++177, ++178, ++178, ++178, ++178, ++179, ++179, ++179, ++179, ++180, ++180, ++180, ++180, ++181, ++181, ++181, ++181, ++182, ++182, ++182, ++182, ++183, ++183, ++183, ++183, ++184, ++184, ++184, ++184, ++185, ++185, ++185, ++185, ++186, ++186, ++186, ++186, ++187, ++187, ++187, ++187, ++188, ++188, ++188, ++188, ++189, ++189, ++189, ++189, ++190, ++190, ++190, ++190, ++191, ++191, ++191, ++191, ++192, ++192, ++192, ++192, ++193, ++193, ++193, ++193, ++194, ++194, ++194, ++194, ++195, ++195, ++195, ++195, ++196, ++196, ++196, ++196, ++197, ++197, ++197, ++197, ++198, ++198, ++198, ++198, ++199, ++199, ++199, ++199, ++200, ++200, ++200, ++200, ++201, ++201, ++201, ++201, ++202, ++202, ++202, ++203, ++203, ++203, ++203, ++204, ++204, ++204, ++204, ++205, ++205, ++205, ++205, ++206, ++206, ++206, ++206, ++207, ++207, ++207, ++207, ++208, ++208, ++208, ++208, ++209, ++209, ++209, ++209, ++210, ++210, ++210, ++210, ++210, ++210, ++210, ++210, ++210, ++210, ++210, ++210, ++211, ++211, ++211, ++211, ++211, ++211, ++211, ++211, ++211, ++211, ++211, ++212, ++212, ++212, ++212, ++213, ++213, ++213, ++213, ++213, ++213, ++213, ++213, ++213, ++213, ++213, ++213, ++214, ++214, ++214, ++214, ++215, ++215, ++215, ++215, ++215, ++215, ++215, ++215, ++215, ++215, ++215, ++216, ++216, ++216, ++216, ++217, ++217, ++217, ++217, ++218, ++218, ++218, ++218, ++219, ++219, ++219, ++219, ++219, ++219, ++219, ++219, ++219, ++219, ++219, ++219, ++220, ++220, ++220, ++220, ++221, ++221, ++221, ++221, ++221, ++221, ++221, ++221, ++221, ++221, ++221, ++222, ++222, ++222, ++222, ++223, ++223, ++223, ++223, ++223, ++223, ++223, ++223, ++223, ++223, ++223, ++223, ++224, ++224, ++224, ++224, ++225, ++225, ++225, ++225, ++225, ++225, ++225, ++225, ++225, ++225, ++225, ++225, ++225, ++225, ++225, ++225, ++225, ++225, ++225, ++226, ++226, ++226, ++226, ++227, ++227, ++227, ++227, ++227, ++227, ++227, ++227, ++227, ++227, ++227, ++227, ++228, ++228, ++228, ++229, ++229, ++229, ++229, ++229, ++229, ++229, ++229, ++229, ++229, ++229, ++229, ++230, ++230, ++230, ++230, ++231, ++231, ++231, ++231, ++231, ++231, ++231, ++231, ++231, ++231, ++231, ++231, ++232, ++232, ++232, ++232, ++232, ++232, ++232, ++232, ++232, ++232, ++232, ++232, ++232, ++232, ++232, ++232, ++232, ++232, ++232, ++233, ++233, ++233, ++233, ++234, ++234, ++234, ++234, ++234, ++234, ++234, ++234, ++234, ++234, ++234, ++235, ++235, ++235, ++235, ++236, ++236, ++236, ++236, ++236, ++236, ++236, ++236, ++236, ++236, ++236, ++236, ++236, ++236, ++236, ++236, ++236, ++236, ++236, ++237, ++237, ++237, ++237, ++238, ++238, ++238, ++238, ++238, ++238, ++238, ++238, ++238, ++238, ++238, ++238, ++238, ++238, ++238, ++238, ++238, ++238, ++238, ++238, ++238, ++238, ++238, ++238, ++238, ++238, ++238, ++239, ++239, ++239, ++239, ++240, ++240, ++240, ++240, ++240, ++240, ++240, ++240, ++240, ++240, ++240, ++240, ++240, ++240, ++240, ++240, ++240, ++240, ++240, ++240, ++240, ++240, ++240, ++240, ++240, ++240, ++240, ++241, ++241, ++241, ++241, ++242, ++242, ++242, ++242, ++242, ++242, ++242, ++242, ++242, ++242, ++242, ++242, ++242, ++242, ++242, ++242, ++242, ++242, ++242, ++242, ++242, ++242, ++242, ++242, ++242, ++242, ++243, ++243, ++243, ++243, ++244, ++244, ++244, ++244, ++244, ++244, ++244, ++244, ++244, ++244, ++244, ++244, ++244, ++244, ++244, ++244, ++244, ++244, ++244, ++244, ++244, ++244, ++244, ++244, ++244, ++244, ++244, ++245, ++245, ++245, ++245, ++246, ++246, ++246, ++246, ++246, ++246, ++246, ++246, ++246, ++246, ++246, ++246, ++246, ++246, ++246, ++246, ++246, ++246, ++246, ++246, ++246, ++246, ++246, ++246, ++246, ++246, ++246, ++246, ++246, ++246, ++246, ++246, ++246, ++246, ++247, ++247, ++247, ++247, ++248, ++248, ++248, ++248, ++248, ++248, ++248, ++248, ++248, ++248, ++248, ++248, ++248, ++248, ++248, ++248, ++248, ++248, ++248, ++248, ++248, ++248, ++248, ++248, ++248, ++248, ++248, ++249, ++249, ++249, ++249, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++251, ++251, ++251, ++251, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++254, ++254, ++254, ++254, ++255, ++255, ++255, ++255, ++255, ++255, ++255, ++255, ++255, ++255, ++255, ++255, ++255, ++255, ++255, ++255, ++255, ++255, ++255, ++255, ++255, ++255, ++255, ++255, ++255, ++255, ++255 +Index: git/drivers/media/video/isp/isp.c +=================================================================== +--- /dev/null 1970-01-01 00:00:00.000000000 +0000 ++++ git/drivers/media/video/isp/isp.c 2009-02-12 15:21:14.000000000 -0600 +@@ -0,0 +1,2301 @@ ++/* ++ * drivers/media/video/isp/isp.c ++ * ++ * Driver Library for ISP Control module in TI's OMAP3430 Camera ISP ++ * ISP interface and IRQ related APIs are defined here. ++ * ++ * Copyright (C) 2008 Texas Instruments. ++ * ++ * This package 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 PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR ++ * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED ++ * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. ++ */ ++ ++#include <linux/module.h> ++#include <linux/errno.h> ++#include <linux/sched.h> ++#include <linux/delay.h> ++#include <linux/err.h> ++#include <linux/interrupt.h> ++#include <linux/clk.h> ++#include <asm/irq.h> ++#include <asm/scatterlist.h> ++#include <asm/mach-types.h> ++#include <linux/device.h> ++#include <linux/autoconf.h> ++#include <asm/io.h> ++ ++#include "isp.h" ++#include "ispreg.h" ++#include "ispccdc.h" ++#include "isppreview.h" ++#include "ispresizer.h" ++#include "ispmmu.h" ++#include "isph3a.h" ++#include "isp_af.h" ++#include "isphist.h" ++ ++#define ISP_XCLKA_DEFAULT 0x12 ++ ++#ifdef CONFIG_VIDEO_OMAP34XX_ISP_PREVIEWER ++#define USE_ISP_PREVIEW ++#endif ++ ++#ifdef CONFIG_VIDEO_OMAP34XX_ISP_RESIZER ++#define USE_ISP_RESZ ++#endif ++/* list of image formats supported via OMAP ISP */ ++const static struct v4l2_fmtdesc isp_formats[] = { ++ { ++#ifndef ENABLE_BT_656_CAPTURE ++ .description = "UYVY, packed", ++#else ++ .description = "UYVY (YUV 4:2:2), packed", ++#endif ++ .pixelformat = V4L2_PIX_FMT_UYVY, ++ }, ++ { ++ .description = "YUYV (YUV 4:2:2), packed", ++ .pixelformat = V4L2_PIX_FMT_YUYV, ++ }, ++ { ++ .description = "Bayer10 (GrR/BGb)", ++ .pixelformat = V4L2_PIX_FMT_SGRBG10, ++ }, ++}; ++ ++#define NUM_ISP_CAPTURE_FORMATS (sizeof(isp_formats)/sizeof(isp_formats[0])) ++ ++ ++/* ISP Crop capabilities */ ++static struct v4l2_rect ispcroprect; ++static struct v4l2_rect cur_rect; ++ ++/* Video controls */ ++static struct vcontrol { ++ struct v4l2_queryctrl qc; ++ int current_value; ++} video_control[] = { ++ { ++ { ++ .id = V4L2_CID_BRIGHTNESS, ++ .type = V4L2_CTRL_TYPE_INTEGER, ++ .name = "Brightness", ++ .minimum = ISPPRV_BRIGHT_LOW, ++ .maximum = ISPPRV_BRIGHT_HIGH, ++ .step = ISPPRV_BRIGHT_STEP, ++ .default_value = ISPPRV_BRIGHT_DEF, ++ }, ++ .current_value = ISPPRV_BRIGHT_DEF, ++ }, ++ { ++ { ++ .id = V4L2_CID_CONTRAST, ++ .type = V4L2_CTRL_TYPE_INTEGER, ++ .name = "Contrast", ++ .minimum = ISPPRV_CONTRAST_LOW, ++ .maximum = ISPPRV_CONTRAST_HIGH, ++ .step = ISPPRV_CONTRAST_STEP, ++ .default_value = ISPPRV_CONTRAST_DEF, ++ }, ++ .current_value = ISPPRV_CONTRAST_DEF, ++ }, ++ { ++ { ++ .id = V4L2_CID_PRIVATE_ISP_COLOR_FX, ++ .type = V4L2_CTRL_TYPE_INTEGER, ++ .name = "Color Effects", ++ .minimum = PREV_DEFAULT_COLOR, ++ .maximum = PREV_SEPIA_COLOR, ++ .step = 1, ++ .default_value = PREV_DEFAULT_COLOR, ++ }, ++ .current_value = PREV_DEFAULT_COLOR, ++ }, ++ { ++ { ++ .id = V4L2_CID_PRIVATE_ISP_CCDC_CFG, ++ .type = V4L2_CTRL_TYPE_INTEGER, ++ .name = "CCDC", ++ .minimum = 0, ++ .maximum = 1, ++ .step = 1, ++ .default_value = 0, ++ }, ++ .current_value = 0, ++ }, ++ { ++ { ++ .id = V4L2_CID_PRIVATE_ISP_PRV_CFG, ++ .type = V4L2_CTRL_TYPE_INTEGER, ++ .name = "Previewer", ++ .minimum = 0, ++ .maximum = 1, ++ .step = 1, ++ .default_value = 0, ++ }, ++ .current_value = 0, ++ }, ++ { ++ { ++ .id = V4L2_CID_PRIVATE_ISP_LSC_UPDATE, ++ .type = V4L2_CTRL_TYPE_INTEGER, ++ .name = "Tables", ++ .minimum = 0, ++ .maximum = 1, ++ .step = 1, ++ .default_value = 0, ++ }, ++ .current_value = 0, ++ }, ++ { ++ { ++ .id = V4L2_CID_PRIVATE_ISP_AEWB_CFG, ++ .type = V4L2_CTRL_TYPE_INTEGER, ++ .name = "Auto Exposure, Auto WB Config", ++ .minimum = 0, ++ .maximum = 1, ++ .step = 1, ++ .default_value = 0, ++ }, ++ .current_value = 0, ++ }, ++ { ++ { ++ .id = V4L2_CID_PRIVATE_ISP_AEWB_REQ, ++ .type = V4L2_CTRL_TYPE_INTEGER, ++ .name = "AEWB Request Statistics", ++ .minimum = 0, ++ .maximum = 1, ++ .step = 1, ++ .default_value = 0, ++ }, ++ .current_value = 0, ++ }, ++ { ++ { ++ .id = V4L2_CID_PRIVATE_ISP_AF_CFG, ++ .type = V4L2_CTRL_TYPE_INTEGER, ++ .name = "Auto Focus Config", ++ .minimum = 0, ++ .maximum = 1, ++ .step = 1, ++ .default_value = 0, ++ }, ++ .current_value = 0, ++ }, ++ { ++ { ++ .id = V4L2_CID_PRIVATE_ISP_AF_REQ, ++ .type = V4L2_CTRL_TYPE_INTEGER, ++ .name = "AF Request Statistics", ++ .minimum = 0, ++ .maximum = 1, ++ .step = 1, ++ .default_value = 0, ++ }, ++ .current_value = 0, ++ } ++}; ++ ++/*Structure for IRQ related info */ ++static struct ispirq { ++ isp_callback_t isp_callbk[10]; ++ isp_vbq_callback_ptr isp_callbk_arg1[10]; ++ void *isp_callbk_arg2[10]; ++} ispirq_obj; ++ ++/* Structure for storing ISP Control module information*/ ++static struct isp { ++ spinlock_t lock; /* spinlock to sync b/w isr and processes */ ++ spinlock_t isp_temp_buf_lock; ++ struct mutex isp_mutex; ++ u8 if_status; ++ u8 interfacetype; ++ int ref_count; ++ struct clk *cam_ick; ++ struct clk *cam_fck; ++} isp_obj; ++ ++struct isp_sgdma ispsg; ++ ++/* Structure for storing ISP sub-module information - CCDC,PRV,RSZ */ ++struct ispmodule { ++ /* Bit mask for sub-modules enabled within the ISP */ ++ unsigned int isp_pipeline; ++ int isp_temp_state; ++ int applyCrop; ++ struct v4l2_pix_format pix; ++ /* tried ISP output sizes for video mode */ ++ unsigned int ccdc_input_width; ++ unsigned int ccdc_input_height; ++ unsigned int ccdc_output_width; ++ unsigned int ccdc_output_height; ++ unsigned int preview_input_width; ++ unsigned int preview_input_height; ++ unsigned int preview_output_width; ++ unsigned int preview_output_height; ++ unsigned int resizer_input_width; ++ unsigned int resizer_input_height; ++ unsigned int resizer_output_width; ++ unsigned int resizer_output_height; ++#ifdef ENABLE_BT_656_CAPTURE ++ /* Flag to indicate whether capture is interlaced or progressive */ ++ int capture_type; ++ int current_field; ++ __u32 input_pixelformat; ++#endif ++}; ++ ++#ifdef ENABLE_BT_656_CAPTURE ++#define ISP_SD_STD_PARAMS \ ++ {"NTSC", 858, 525, 720, 480, 720 * 2, 30, V4L2_PIX_FMT_UYVY, \ ++ V4L2_FIELD_INTERLACED, 720 * 2, 720 * 2 * 480, \ ++ V4L2_COLORSPACE_SMPTE170M}, \ ++ {"PAL", 864, 625, 720, 576, 720 * 2, 25, V4L2_PIX_FMT_UYVY, \ ++ V4L2_FIELD_INTERLACED, 720 * 2, 720 * 2 * 480, \ ++ V4L2_COLORSPACE_SMPTE170M} ++ ++struct isp_std_config_params { ++ char name[30]; ++ unsigned int num_pixels; ++ unsigned int num_lines; ++ unsigned int active_pixels; ++ unsigned int active_lines; ++ unsigned int pitch; ++ unsigned int fps; ++ __u32 pixelformat; ++ enum v4l2_field field; ++ __u32 bytesperline; ++ __u32 sizeimage; ++ enum v4l2_colorspace colorspace; ++}; ++ ++static struct isp_std_config_params std_params[] = { ++ ISP_SD_STD_PARAMS ++}; ++#endif ++ ++static struct ispmodule ispmodule_obj = { ++ .isp_pipeline = OMAP_ISP_CCDC, ++ .isp_temp_state = ISP_BUF_INIT, ++ .applyCrop = 0, ++ .pix = { ++ .width = 176, ++ .height = 144, ++ .pixelformat = V4L2_PIX_FMT_UYVY, ++ .field = V4L2_FIELD_NONE, ++ .bytesperline = 176*2, ++ .colorspace = V4L2_COLORSPACE_JPEG, ++ .priv = 0, ++ }, ++#ifdef ENABLE_BT_656_CAPTURE ++ .capture_type = 0, ++ .current_field = 0, ++ .input_pixelformat = V4L2_PIX_FMT_UYVY, ++#endif ++}; ++ ++/* Structure for saving/restoring ISP module registers*/ ++ ++static struct isp_reg isp_reg_list[] = { ++ {ISP_SYSCONFIG, 0x0000}, ++ {ISP_IRQ0ENABLE, 0x0000}, ++ {ISP_IRQ1ENABLE, 0x0000}, ++ {ISP_TCTRL_GRESET_LENGTH, 0x0000}, ++ {ISP_TCTRL_PSTRB_REPLAY, 0x0000}, ++ {ISP_CTRL, 0x0000}, ++ {ISP_TCTRL_CTRL, 0x0000}, ++ {ISP_TCTRL_FRAME, 0x0000}, ++ {ISP_TCTRL_PSTRB_DELAY, 0x0000}, ++ {ISP_TCTRL_STRB_DELAY, 0x0000}, ++ {ISP_TCTRL_SHUT_DELAY, 0x0000}, ++ {ISP_TCTRL_PSTRB_LENGTH, 0x0000}, ++ {ISP_TCTRL_STRB_LENGTH, 0x0000}, ++ {ISP_TCTRL_SHUT_LENGTH, 0x0000}, ++ {ISP_CBUFF_SYSCONFIG, 0x0000}, ++ {ISP_CBUFF_IRQENABLE, 0x0000}, ++ {ISP_CBUFF0_CTRL, 0x0000}, ++ {ISP_CBUFF1_CTRL, 0x0000}, ++ {ISP_CBUFF0_START, 0x0000}, ++ {ISP_CBUFF1_START, 0x0000}, ++ {ISP_CBUFF0_END, 0x0000}, ++ {ISP_CBUFF1_END, 0x0000}, ++ {ISP_CBUFF0_WINDOWSIZE, 0x0000}, ++ {ISP_CBUFF1_WINDOWSIZE, 0x0000}, ++ {ISP_CBUFF0_THRESHOLD, 0x0000}, ++ {ISP_CBUFF1_THRESHOLD, 0x0000}, ++ {ISP_TOK_TERM, 0x0000} ++}; ++ ++/* ++ * ++ * V4L2 Handling ++ * ++ */ ++ ++/* Returns the index of the requested ID from the control structure array */ ++static int ++find_vctrl(int id) ++{ ++ int i; ++ ++ if (id < V4L2_CID_BASE) ++ return -EDOM; ++ ++ for (i = (ARRAY_SIZE(video_control) - 1); i >= 0; i--) ++ if (video_control[i].qc.id == id) ++ break; ++ if (i < 0) ++ i = -EINVAL; ++ return i; ++} ++ ++void isp_open(void) ++{ ++ ispccdc_request(); ++ isppreview_request(); ++ ispresizer_request(); ++ return; ++} ++EXPORT_SYMBOL(isp_open); ++ ++void isp_close(void) ++{ ++ ispccdc_free(); ++ isppreview_free(); ++ ispresizer_free(); ++ memset(&ispcroprect, 0, sizeof(ispcroprect)); ++ memset(&cur_rect, 0, sizeof(cur_rect)); ++ return; ++} ++EXPORT_SYMBOL(isp_close); ++ ++/* flag to check first time of isp_get */ ++static int off_mode; ++ ++int isp_set_sgdma_callback(struct isp_sgdma_state *sgdma_state, ++ isp_vbq_callback_ptr func_ptr) ++{ ++#ifdef USE_ISP_RESZ ++ if (ispmodule_obj.isp_pipeline & OMAP_ISP_RESIZER) { ++ isp_set_callback(CBK_RESZ_DONE, sgdma_state->callback, ++ func_ptr, sgdma_state->arg); ++ } ++#endif ++ ++#ifdef USE_ISP_PREVIEW ++ if (ispmodule_obj.isp_pipeline & OMAP_ISP_PREVIEW) { ++ isp_set_callback(CBK_PREV_DONE, sgdma_state->callback, ++ func_ptr, sgdma_state->arg); ++ } ++#endif ++ if (ispmodule_obj.isp_pipeline & OMAP_ISP_CCDC) { ++ isp_set_callback(CBK_CCDC_VD0, sgdma_state->callback, func_ptr, ++ sgdma_state->arg); ++ isp_set_callback(CBK_CCDC_VD1, sgdma_state->callback, func_ptr, ++ sgdma_state->arg); ++#ifndef ENABLE_BT_656_CAPTURE ++ isp_set_callback(CBK_LSC_ISR, NULL, NULL, NULL); ++#endif ++ } ++ isp_set_callback(CBK_HS_VS, sgdma_state->callback, func_ptr, ++ sgdma_state->arg); ++ return 0; ++} ++ ++/* ++ *Sets the callback for the ISP module done events. ++ * type : Type of the event for which callback is requested. ++ * callback : Method to be called as callback in the ISR context. ++ * arg1 : Argument to be passed when callback is called in ISR. ++ * arg2 : Argument to be passed when callback is called in ISR. ++ */ ++int isp_set_callback(enum isp_callback_type type, isp_callback_t callback, ++ isp_vbq_callback_ptr arg1, ++ void *arg2) ++{ ++ unsigned long irqflags = 0; ++ ++ if (callback == NULL) { ++ DPRINTK_ISPCTRL("ISP_ERR : Null Callback\n"); ++ return -EINVAL; ++ } ++ ++ spin_lock_irqsave(&isp_obj.lock, irqflags); ++ ispirq_obj.isp_callbk[type] = callback; ++ ispirq_obj.isp_callbk_arg1[type] = arg1; ++ ispirq_obj.isp_callbk_arg2[type] = arg2; ++ spin_unlock_irqrestore(&isp_obj.lock, irqflags); ++ ++ switch (type) { ++ case CBK_HS_VS: ++ omap_writel(IRQ0ENABLE_HS_VS_IRQ, ISP_IRQ0STATUS); ++ omap_writel(omap_readl(ISP_IRQ0ENABLE) | IRQ0ENABLE_HS_VS_IRQ, ++ ISP_IRQ0ENABLE); ++ break; ++ case CBK_PREV_DONE: ++ omap_writel(IRQ0ENABLE_PRV_DONE_IRQ, ISP_IRQ0STATUS); ++ omap_writel(omap_readl(ISP_IRQ0ENABLE) | ++ IRQ0ENABLE_PRV_DONE_IRQ, ++ ISP_IRQ0ENABLE); ++ break; ++ case CBK_RESZ_DONE: ++ omap_writel(IRQ0ENABLE_RSZ_DONE_IRQ, ISP_IRQ0STATUS); ++ omap_writel(omap_readl(ISP_IRQ0ENABLE) | ++ IRQ0ENABLE_RSZ_DONE_IRQ, ++ ISP_IRQ0ENABLE); ++ break; ++ case CBK_MMU_ERR: ++ omap_writel(omap_readl(ISP_IRQ0ENABLE) | ++ IRQ0ENABLE_MMU_ERR_IRQ, ++ ISP_IRQ0ENABLE); ++ ++ omap_writel(omap_readl(ISPMMU_IRQENABLE) | ++ IRQENABLE_MULTIHITFAULT | ++ IRQENABLE_TWFAULT | ++ IRQENABLE_EMUMISS | ++ IRQENABLE_TRANSLNFAULT | ++ IRQENABLE_TLBMISS, ++ ISPMMU_IRQENABLE); ++ break; ++ case CBK_H3A_AWB_DONE: ++ omap_writel(IRQ0ENABLE_H3A_AWB_DONE_IRQ, ISP_IRQ0STATUS); ++ omap_writel(omap_readl(ISP_IRQ0ENABLE) | ++ IRQ0ENABLE_H3A_AWB_DONE_IRQ, ++ ISP_IRQ0ENABLE); ++ break; ++ case CBK_H3A_AF_DONE: ++ omap_writel(IRQ0ENABLE_H3A_AF_DONE_IRQ, ISP_IRQ0STATUS); ++ omap_writel(omap_readl(ISP_IRQ0ENABLE)| ++ IRQ0ENABLE_H3A_AF_DONE_IRQ, ++ ISP_IRQ0ENABLE); ++ break; ++ case CBK_HIST_DONE: ++ omap_writel(IRQ0ENABLE_HIST_DONE_IRQ, ISP_IRQ0STATUS); ++ omap_writel(omap_readl(ISP_IRQ0ENABLE) | ++ IRQ0ENABLE_HIST_DONE_IRQ, ++ ISP_IRQ0ENABLE); ++ break; ++ case CBK_LSC_ISR: ++ omap_writel(IRQ0ENABLE_CCDC_LSC_DONE_IRQ | ++ IRQ0ENABLE_CCDC_LSC_PREF_COMP_IRQ | ++ IRQ0ENABLE_CCDC_LSC_PREF_ERR_IRQ, ++ ISP_IRQ0STATUS); ++ omap_writel(omap_readl(ISP_IRQ0ENABLE) | ++ IRQ0ENABLE_CCDC_LSC_DONE_IRQ | ++ IRQ0ENABLE_CCDC_LSC_PREF_COMP_IRQ | ++ IRQ0ENABLE_CCDC_LSC_PREF_ERR_IRQ, ++ ISP_IRQ0ENABLE); ++ break; ++ default: ++ break; ++ }; ++ ++ return 0; ++} ++EXPORT_SYMBOL(isp_set_callback); ++ ++/** ++ * isp_unset_callback - Clears the callback for the ISP module done events. ++ * @type: Type of the event for which callback to be cleared. ++ * ++ * This function clears a callback function for a done event in the ISP ++ * module, and disables the corresponding interrupt. ++ **/ ++int isp_unset_callback(enum isp_callback_type type) ++{ ++ unsigned long irqflags = 0; ++ ++ spin_lock_irqsave(&isp_obj.lock, irqflags); ++ ispirq_obj.isp_callbk[type] = NULL; ++ ispirq_obj.isp_callbk_arg1[type] = NULL; ++ ispirq_obj.isp_callbk_arg2[type] = NULL; ++ spin_unlock_irqrestore(&isp_obj.lock, irqflags); ++ ++ switch (type) { ++ case CBK_CCDC_VD0: ++ omap_writel((omap_readl(ISP_IRQ0ENABLE)) & ++ ~IRQ0ENABLE_CCDC_VD0_IRQ, ++ ISP_IRQ0ENABLE); ++ break; ++ case CBK_CCDC_VD1: ++ omap_writel((omap_readl(ISP_IRQ0ENABLE)) & ++ ~IRQ0ENABLE_CCDC_VD1_IRQ, ++ ISP_IRQ0ENABLE); ++ break; ++ case CBK_PREV_DONE: ++ omap_writel((omap_readl(ISP_IRQ0ENABLE)) & ++ ~IRQ0ENABLE_PRV_DONE_IRQ, ++ ISP_IRQ0ENABLE); ++ break; ++ case CBK_RESZ_DONE: ++ omap_writel((omap_readl(ISP_IRQ0ENABLE)) & ++ ~IRQ0ENABLE_RSZ_DONE_IRQ, ++ ISP_IRQ0ENABLE); ++ break; ++ case CBK_MMU_ERR: ++ omap_writel(omap_readl(ISPMMU_IRQENABLE) & ++ ~(IRQENABLE_MULTIHITFAULT | ++ IRQENABLE_TWFAULT | ++ IRQENABLE_EMUMISS | ++ IRQENABLE_TRANSLNFAULT | ++ IRQENABLE_TLBMISS), ++ ISPMMU_IRQENABLE); ++ break; ++ case CBK_H3A_AWB_DONE: ++ omap_writel((omap_readl(ISP_IRQ0ENABLE)) & ++ ~IRQ0ENABLE_H3A_AWB_DONE_IRQ, ++ ISP_IRQ0ENABLE); ++ break; ++ case CBK_H3A_AF_DONE: ++ omap_writel((omap_readl(ISP_IRQ0ENABLE))& ++ (~IRQ0ENABLE_H3A_AF_DONE_IRQ),ISP_IRQ0ENABLE); ++ break; ++ case CBK_HIST_DONE: ++ omap_writel((omap_readl(ISP_IRQ0ENABLE)) & ++ ~IRQ0ENABLE_HIST_DONE_IRQ, ++ ISP_IRQ0ENABLE); ++ break; ++ case CBK_HS_VS: ++ omap_writel((omap_readl(ISP_IRQ0ENABLE)) & ++ ~IRQ0ENABLE_HS_VS_IRQ, ++ ISP_IRQ0ENABLE); ++ break; ++ case CBK_LSC_ISR: ++ omap_writel(omap_readl(ISP_IRQ0ENABLE) & ++ ~(IRQ0ENABLE_CCDC_LSC_DONE_IRQ | ++ IRQ0ENABLE_CCDC_LSC_PREF_COMP_IRQ | ++ IRQ0ENABLE_CCDC_LSC_PREF_ERR_IRQ), ++ ISP_IRQ0ENABLE); ++ break; ++ default: ++ break; ++ }; ++ return 0; ++} ++EXPORT_SYMBOL(isp_unset_callback); ++ ++/** ++ * isp_request_interface - Requests an ISP interface type (parallel or serial). ++ * @if_t: Type of requested ISP interface (parallel or serial). ++ * ++ * This function requests for allocation of an ISP interface type. ++ **/ ++int isp_request_interface(enum isp_interface_type if_t) ++{ ++ if (isp_obj.if_status & if_t) { ++ DPRINTK_ISPCTRL("ISP_ERR : Requested Interface already \ ++ allocated\n"); ++ goto err_ebusy; ++ } ++ if ((isp_obj.if_status == (ISP_PARLL | ISP_CSIA)) ++ || isp_obj.if_status == (ISP_CSIA | ISP_CSIB)) { ++ DPRINTK_ISPCTRL("ISP_ERR : No Free interface now\n"); ++ goto err_ebusy; ++ } ++ ++ if (((isp_obj.if_status == ISP_PARLL) && (if_t == ISP_CSIA)) || ++ ((isp_obj.if_status == ISP_CSIA) && ++ (if_t == ISP_PARLL)) || ++ ((isp_obj.if_status == ISP_CSIA) && ++ (if_t == ISP_CSIB)) || ++ ((isp_obj.if_status == ISP_CSIB) && ++ (if_t == ISP_CSIA)) || ++ (isp_obj.if_status == 0)) { ++ isp_obj.if_status |= if_t; ++ return 0; ++ } else { ++ DPRINTK_ISPCTRL("ISP_ERR : Invalid Combination Serial- \ ++ Parallel interface\n"); ++ return -EINVAL; ++ } ++ ++err_ebusy: ++ return -EBUSY; ++} ++EXPORT_SYMBOL(isp_request_interface); ++ ++/** ++ * isp_free_interface - Frees an ISP interface type (parallel or serial). ++ * @if_t: Type of ISP interface to be freed (parallel or serial). ++ * ++ * This function frees the allocation of an ISP interface type. ++ **/ ++int isp_free_interface(enum isp_interface_type if_t) ++{ ++ isp_obj.if_status &= ~if_t; ++ return 0; ++} ++EXPORT_SYMBOL(isp_free_interface); ++ ++/** ++ * isp_set_xclk - Configures the specified cam_xclk to the desired frequency. ++ * @xclk: Desired frequency of the clock in Hz. ++ * @xclksel: XCLK to configure (0 = A, 1 = B). ++ * ++ * Configures the specified MCLK divisor in the ISP timing control register ++ * (TCTRL_CTRL) to generate the desired xclk clock value. ++ * ++ * Divisor = CM_CAM_MCLK_HZ / xclk ++ * ++ * Returns the final frequency that is actually being generated ++ **/ ++u32 isp_set_xclk(u32 xclk, u8 xclksel) ++{ ++ u32 divisor; ++ u32 currentxclk; ++ ++ if (xclk == CM_CAM_MCLK_HZ) { ++ divisor = (xclksel == 0) ? ISPTCTRL_CTRL_DIVA_Bypass : ++ ISPTCTRL_CTRL_DIVB_Bypass; ++ currentxclk = CM_CAM_MCLK_HZ; ++ } else { ++ if (xclk >= 2) { ++ divisor = CM_CAM_MCLK_HZ / xclk; ++ divisor &= (xclksel == 0) ? ISPTCTRL_CTRL_DIVA_Bypass : ++ ISPTCTRL_CTRL_DIVB_Bypass; ++ currentxclk = CM_CAM_MCLK_HZ / divisor; ++ } else { ++ divisor = xclk; ++ currentxclk = 0; ++ } ++ } ++ ++ switch (xclksel) { ++ case 0: ++ omap_writel((omap_readl(ISP_TCTRL_CTRL) & ++ ~ISPTCTRL_CTRL_DIVA_Bypass) | ++ (divisor << ISPTCTRL_CTRL_DIVA_SHIFT), ++ ISP_TCTRL_CTRL); ++ DPRINTK_ISPCTRL("isp_set_xclk(): cam_xclka set to %x Hz\n", ++ currentxclk); ++ break; ++ case 1: ++ omap_writel((omap_readl(ISP_TCTRL_CTRL) & ++ ~ISPTCTRL_CTRL_DIVB_Bypass) | ++ (divisor << ISPTCTRL_CTRL_DIVB_SHIFT), ++ ISP_TCTRL_CTRL); ++ DPRINTK_ISPCTRL("isp_set_xclk(): cam_xclkb set to %x Hz\n", ++ currentxclk); ++ break; ++ default: ++ DPRINTK_ISPCTRL("ISP_ERR: isp_set_xclk(): Invalid requested " ++ "xclk. Must be 0 (A) or 1 (B)." ++ "\n"); ++ return -EINVAL; ++ } ++ ++ return currentxclk; ++} ++EXPORT_SYMBOL(isp_set_xclk); ++ ++/** ++ * isp_get_xclk - Returns the frequency in Hz of the desired cam_xclk. ++ * @xclksel: XCLK to retrieve (0 = A, 1 = B). ++ * ++ * This function returns the External Clock (XCLKA or XCLKB) value generated ++ * by the ISP. ++ **/ ++u32 isp_get_xclk(u8 xclksel) ++{ ++ u32 xclkdiv; ++ u32 xclk; ++ ++ switch (xclksel) { ++ case 0: ++ xclkdiv = omap_readl(ISP_TCTRL_CTRL) & ISPTCTRL_CTRL_DIVA_MASK; ++ xclkdiv = xclkdiv >> ISPTCTRL_CTRL_DIVA_SHIFT; ++ break; ++ case 1: ++ xclkdiv = omap_readl(ISP_TCTRL_CTRL) & ISPTCTRL_CTRL_DIVB_MASK; ++ xclkdiv = xclkdiv >> ISPTCTRL_CTRL_DIVB_SHIFT; ++ break; ++ default: ++ DPRINTK_ISPCTRL("ISP_ERR: isp_get_xclk(): Invalid requested " ++ "xclk. Must be 0 (A) or 1 (B)." ++ "\n"); ++ return -EINVAL; ++ } ++ ++ switch (xclkdiv) { ++ case 0: ++ case 1: ++ xclk = 0; ++ break; ++ case 0x1f: ++ xclk = CM_CAM_MCLK_HZ; ++ break; ++ default: ++ xclk = CM_CAM_MCLK_HZ / xclkdiv; ++ } ++ ++ return xclk; ++} ++EXPORT_SYMBOL(isp_get_xclk); ++ ++/** ++ * isp_power_settings - Sysconfig settings, for Power Management. ++ * @isp_sysconfig: Structure containing the power settings for ISP to configure ++ * ++ * Sets the power settings for the ISP, and SBL bus. ++ **/ ++void isp_power_settings(struct isp_sysc isp_sysconfig) ++{ ++ if (isp_sysconfig.idle_mode) { ++ omap_writel(ISP_SYSCONFIG_AUTOIDLE | ++ (ISP_SYSCONFIG_MIdleMode_SmartStandBy << ++ ISP_SYSCONFIG_MIdleMode_SHIFT), ++ ISP_SYSCONFIG); ++ ++ omap_writel(ISPMMU_AUTOIDLE | (ISPMMU_SIdlemode_Smartidle << ++ ISPMMU_SIdlemode_Shift), ++ ISPMMU_SYSCONFIG); ++/// if (is_sil_rev_equal_to(OMAP3430_REV_ES1_0)) { ++ omap_writel(ISPCSI1_AUTOIDLE | ++ (ISPCSI1_MIdleMode_SmartStandBy << ++ ISPCSI1_MIdleMode_Shift), ++ ISP_CSIA_SYSCONFIG); ++ omap_writel(ISPCSI1_AUTOIDLE | ++ (ISPCSI1_MIdleMode_SmartStandBy << ++ ISPCSI1_MIdleMode_Shift), ++ ISP_CSIB_SYSCONFIG); ++/// } ++ omap_writel(ISPCTRL_SBL_AutoIdle, ISP_CTRL); ++ ++ } else { ++ omap_writel(ISP_SYSCONFIG_AUTOIDLE | ++ (ISP_SYSCONFIG_MIdleMode_ForceStandBy << ++ ISP_SYSCONFIG_MIdleMode_SHIFT), ISP_SYSCONFIG); ++ ++ omap_writel(ISPMMU_AUTOIDLE | ++ (ISPMMU_SIdlemode_Noidle << ISPMMU_SIdlemode_Shift), ++ ISPMMU_SYSCONFIG); ++/// if (is_sil_rev_equal_to(OMAP3430_REV_ES1_0)) { ++ omap_writel(ISPCSI1_AUTOIDLE | ++ (ISPCSI1_MIdleMode_ForceStandBy << ++ ISPCSI1_MIdleMode_Shift), ISP_CSIA_SYSCONFIG); ++ ++ omap_writel(ISPCSI1_AUTOIDLE | ++ (ISPCSI1_MIdleMode_ForceStandBy << ++ ISPCSI1_MIdleMode_Shift), ISP_CSIB_SYSCONFIG); ++/// } ++ ++ omap_writel(ISPCTRL_SBL_AutoIdle, ISP_CTRL); ++ ++ } ++ ++ ++} ++EXPORT_SYMBOL(isp_power_settings); ++ ++/** ++ * isp_configure_interface - Configures ISP Control I/F related parameters. ++ * @config: Structure containing the desired configuration for the ISP. ++ * ++ * Configures ISP control register (ISP_CTRL) with the values specified inside ++ * the config structure. Controls: ++ * - Selection of parallel or serial input to the preview hardware. ++ * - Data lane shifter. ++ * - Pixel clock polarity. ++ * - 8 to 16-bit bridge at the input of CCDC module. ++ * - HS or VS synchronization signal detection ++ **/ ++int isp_configure_interface(struct isp_interface_config *config) ++{ ++ u32 ispctrl_val = omap_readl(ISP_CTRL); ++ u32 ispccdc_vdint_val; ++ ++ ispctrl_val &= (ISPCTRL_PAR_SER_CLK_SEL_MASK); ++ ispctrl_val |= config->ccdc_par_ser; ++ ispctrl_val &= ISPCTRL_SHIFT_MASK; ++ ispctrl_val |= (config->dataline_shift << ISPCTRL_SHIFT_SHIFT); ++ ispctrl_val &= ~ISPCTRL_PAR_CLK_POL_INV; ++ ispctrl_val |= (config->para_clk_pol << ISPCTRL_PAR_CLK_POL_SHIFT); ++ ispctrl_val &= ~ISPCTRL_PAR_BRIDGE_BENDIAN; ++ ispctrl_val |= (config->par_bridge << ISPCTRL_PAR_BRIDGE_SHIFT); ++ ispctrl_val &= ~(ISPCTRL_SYNC_DETECT_VSRISE); ++ ispctrl_val |= (config->hsvs_syncdetect << ISPCTRL_SYNC_DETECT_SHIFT); ++ ++ omap_writel(ispctrl_val, ISP_CTRL); ++ ++ ispccdc_vdint_val = omap_readl(ISPCCDC_VDINT); ++ ispccdc_vdint_val &= ~(ISPCCDC_VDINT_0_MASK << ISPCCDC_VDINT_0_SHIFT); ++ ispccdc_vdint_val &= ~(ISPCCDC_VDINT_1_MASK << ISPCCDC_VDINT_1_SHIFT); ++ omap_writel((config->vdint0_timing << ISPCCDC_VDINT_0_SHIFT) | ++ (config->vdint1_timing << ++ ISPCCDC_VDINT_1_SHIFT), ++ ISPCCDC_VDINT); ++ return 0; ++} ++EXPORT_SYMBOL(isp_configure_interface); ++ ++/** ++ * isp_CCDC_VD01_enable - Enables VD0 and VD1 IRQs. ++ * ++ * Sets VD0 and VD1 bits in IRQ0STATUS to reset the flag, and sets them in ++ * IRQ0ENABLE to enable the corresponding IRQs. ++ **/ ++void isp_CCDC_VD01_enable(void) ++{ ++ omap_writel(IRQ0STATUS_CCDC_VD0_IRQ | IRQ0STATUS_CCDC_VD1_IRQ, ++ ISP_IRQ0STATUS); ++ omap_writel(omap_readl(ISP_IRQ0ENABLE) | IRQ0ENABLE_CCDC_VD0_IRQ | ++ IRQ0ENABLE_CCDC_VD1_IRQ, ISP_IRQ0ENABLE); ++} ++ ++/** ++ * isp_CCDC_VD01_disable - Disables VD0 and VD1 IRQs. ++ * ++ * Clears VD0 and VD1 bits in IRQ0ENABLE register. ++ **/ ++void isp_CCDC_VD01_disable(void) ++{ ++ omap_writel(omap_readl(ISP_IRQ0ENABLE) & ++ ~(IRQ0ENABLE_CCDC_VD0_IRQ | IRQ0ENABLE_CCDC_VD1_IRQ), ++ ISP_IRQ0ENABLE); ++} ++ ++/** ++ * omap34xx_isp_isr - Interrupt Service Routine for Camera ISP module. ++ * @irq: Not used currently. ++ * @ispirq_disp: The object that is passed while request_irq is called. ++ * This is the ispirq_obj object containing info on the callback. ++ * ++ * Handles the corresponding callback if plugged in. ++ **/ ++static irqreturn_t omap34xx_isp_isr(int irq, void *ispirq_disp) ++{ ++ struct ispirq *irqdis = (struct ispirq *) ispirq_disp; ++ u32 irqstatus = 0; ++ unsigned long irqflags = 0; ++ u8 is_irqhandled = 0; ++ ++ irqstatus = omap_readl(ISP_IRQ0STATUS); ++ ++ spin_lock_irqsave(&isp_obj.lock, irqflags); ++ ++ if ((irqstatus & MMU_ERR) == MMU_ERR) { ++ if (irqdis->isp_callbk[CBK_MMU_ERR]) ++ irqdis->isp_callbk[CBK_MMU_ERR](irqstatus, ++ irqdis->isp_callbk_arg1[CBK_MMU_ERR], ++ irqdis->isp_callbk_arg2[CBK_MMU_ERR]); ++ is_irqhandled = 1; ++ goto out; ++ } ++ ++ if ((irqstatus & CCDC_VD1) == CCDC_VD1) { ++ if (irqdis->isp_callbk[CBK_CCDC_VD1]) ++ irqdis->isp_callbk[CBK_CCDC_VD1](CCDC_VD1, ++ irqdis->isp_callbk_arg1[CBK_CCDC_VD1], ++ irqdis->isp_callbk_arg2[CBK_CCDC_VD1]); ++ is_irqhandled = 1; ++ } ++ ++ if ((irqstatus & CCDC_VD0) == CCDC_VD0) { ++ if (irqdis->isp_callbk[CBK_CCDC_VD0]) ++ irqdis->isp_callbk[CBK_CCDC_VD0](CCDC_VD0, ++ irqdis->isp_callbk_arg1[CBK_CCDC_VD0], ++ irqdis->isp_callbk_arg2[CBK_CCDC_VD0]); ++ is_irqhandled = 1; ++ } ++ ++ if ((irqstatus & PREV_DONE) == PREV_DONE) { ++ if (irqdis->isp_callbk[CBK_PREV_DONE]) ++ irqdis->isp_callbk[CBK_PREV_DONE](PREV_DONE, ++ irqdis->isp_callbk_arg1[CBK_PREV_DONE], ++ irqdis->isp_callbk_arg2[CBK_PREV_DONE]); ++ is_irqhandled = 1; ++ } ++ ++ if ((irqstatus & RESZ_DONE) == RESZ_DONE) { ++ if (irqdis->isp_callbk[CBK_RESZ_DONE]) ++ irqdis->isp_callbk[CBK_RESZ_DONE](RESZ_DONE, ++ irqdis->isp_callbk_arg1[CBK_RESZ_DONE], ++ irqdis->isp_callbk_arg2[CBK_RESZ_DONE]); ++ is_irqhandled = 1; ++ } ++ ++ if ((irqstatus & H3A_AWB_DONE) == H3A_AWB_DONE) { ++ if (irqdis->isp_callbk[CBK_H3A_AWB_DONE]) ++ irqdis->isp_callbk[CBK_H3A_AWB_DONE](H3A_AWB_DONE, ++ irqdis->isp_callbk_arg1[CBK_H3A_AWB_DONE], ++ irqdis->isp_callbk_arg2[CBK_H3A_AWB_DONE]); ++ is_irqhandled = 1; ++ } ++ ++ if ((irqstatus & HIST_DONE) == HIST_DONE) { ++ if (irqdis->isp_callbk[CBK_HIST_DONE]) ++ irqdis->isp_callbk[CBK_HIST_DONE](HIST_DONE, ++ irqdis->isp_callbk_arg1[CBK_HIST_DONE], ++ irqdis->isp_callbk_arg2[CBK_HIST_DONE]); ++ is_irqhandled = 1; ++ } ++ ++ if ((irqstatus & HS_VS) == HS_VS) { ++ if (irqdis->isp_callbk[CBK_HS_VS]) ++ irqdis->isp_callbk[CBK_HS_VS](HS_VS, ++ irqdis->isp_callbk_arg1[CBK_HS_VS], ++ irqdis->isp_callbk_arg2[CBK_HS_VS]); ++ is_irqhandled = 1; ++ } ++ ++ if ((irqstatus & H3A_AF_DONE) == H3A_AF_DONE){ ++ if (irqdis->isp_callbk[CBK_H3A_AF_DONE]) ++ irqdis->isp_callbk[CBK_H3A_AF_DONE](H3A_AF_DONE, ++ irqdis->isp_callbk_arg1[CBK_H3A_AF_DONE], ++ irqdis->isp_callbk_arg2[CBK_H3A_AF_DONE]); ++ is_irqhandled = 1; ++ } ++ ++ if (irqstatus & LSC_PRE_ERR) { ++ DPRINTK_ISPCTRL("isp_sr: LSC_PRE_ERR \n"); ++ omap_writel(irqstatus, ISP_IRQ0STATUS); ++ ispccdc_enable_lsc(0); ++ ispccdc_enable_lsc(1); ++ spin_unlock_irqrestore(&isp_obj.lock, irqflags); ++ return IRQ_HANDLED; ++ } ++out: ++ omap_writel(irqstatus, ISP_IRQ0STATUS); ++ spin_unlock_irqrestore(&isp_obj.lock, irqflags); ++ ++ if (is_irqhandled) ++ return IRQ_HANDLED; ++ else ++ return IRQ_NONE; ++} ++#ifdef CONFIG_TRACK_RESOURCES ++/* device name needed for resource tracking layer */ ++struct device_driver camera_drv = { ++ .name = "camera" ++}; ++ ++struct device camera_dev = { ++ .driver = &camera_drv, ++}; ++#endif ++ ++void isp_set_pipeline(int soc_type) ++{ ++ ispmodule_obj.isp_pipeline |= OMAP_ISP_CCDC; ++ ++ /* 1- Smart sensor, 0 - Raw sensor */ ++ if (!soc_type) ++ ispmodule_obj.isp_pipeline |= (OMAP_ISP_PREVIEW | ++ OMAP_ISP_RESIZER); ++ ++ return; ++} ++ ++void ++omapisp_unset_callback() ++{ ++ isp_unset_callback(CBK_HS_VS); ++#ifdef USE_ISP_RESZ ++ /* This has to occur before the vysnc of the intended frame comes */ ++ if (ispmodule_obj.isp_pipeline & OMAP_ISP_RESIZER) ++ isp_unset_callback(CBK_RESZ_DONE); ++#endif ++#ifdef USE_ISP_PREVIEW ++ if (ispmodule_obj.isp_pipeline & OMAP_ISP_PREVIEW) ++ isp_unset_callback(CBK_PREV_DONE); ++#endif ++ if (ispmodule_obj.isp_pipeline & OMAP_ISP_CCDC) { ++ isp_unset_callback(CBK_CCDC_VD0); ++ isp_unset_callback(CBK_CCDC_VD1); ++ isp_unset_callback(CBK_LSC_ISR); ++ } ++ omap_writel(omap_readl(ISP_IRQ0STATUS) | ISP_INT_CLR, ISP_IRQ0STATUS); ++} ++ ++void isp_start(void) ++{ ++ /* start the needed isp components assuming these components ++ * are configured correctly. ++ */ ++#ifdef USE_ISP_PREVIEW ++ if (ispmodule_obj.isp_pipeline & OMAP_ISP_PREVIEW) ++ isppreview_enable(1); ++#endif ++ return ; ++} ++EXPORT_SYMBOL(isp_start); ++ ++void isp_stop() ++{ ++ int timeout; ++ ++ spin_lock(&isp_obj.isp_temp_buf_lock); ++ ispmodule_obj.isp_temp_state = ISP_FREE_RUNNING; ++ spin_unlock(&isp_obj.isp_temp_buf_lock); ++ omapisp_unset_callback(); ++ ++#ifdef USE_ISP_RESZ ++ if (ispmodule_obj.isp_pipeline & OMAP_ISP_RESIZER) { ++ ispresizer_enable(0); ++ timeout = 0; ++ while (ispresizer_busy() && (timeout < 20)) { ++ timeout++; ++ schedule(); ++ } ++ } ++#endif ++#ifdef USE_ISP_PREVIEW ++ if (ispmodule_obj.isp_pipeline & OMAP_ISP_PREVIEW) { ++ isppreview_enable(0); ++ timeout = 0; ++ while (isppreview_busy() && (timeout < 20)) { ++ timeout++; ++ schedule(); ++ } ++ } ++#endif ++ if (ispmodule_obj.isp_pipeline & OMAP_ISP_CCDC) { ++ ispccdc_enable(0); ++ timeout = 0; ++ while (ispccdc_busy() && (timeout < 20)) { ++ timeout++; ++ schedule(); ++ } ++ } ++ if (ispccdc_busy() || isppreview_busy() || ispresizer_busy()) { ++ isp_save_ctx(); ++ omap_writel(omap_readl(ISP_SYSCONFIG) | ++ ISP_SYSCONFIG_SOFTRESET, ISP_SYSCONFIG); ++ timeout = 0; ++ while ((!(omap_readl(ISP_SYSSTATUS) & 0x1)) && timeout < 40) { ++ timeout++; ++ mdelay(1); ++ } ++ isp_restore_ctx(); ++ } ++} ++EXPORT_SYMBOL(isp_stop); ++ ++void isp_set_buf(struct isp_sgdma_state *sgdma_state) ++{ ++#ifdef USE_ISP_RESZ ++ /* This has to occur before the vysnc of the intended frame comes */ ++ if (ispmodule_obj.isp_pipeline & OMAP_ISP_RESIZER) { ++ ispresizer_set_outaddr(sgdma_state->isp_addr); ++ } else ++#endif ++#ifdef USE_ISP_PREVIEW ++ if (ispmodule_obj.isp_pipeline & OMAP_ISP_PREVIEW) { ++ isppreview_set_outaddr(sgdma_state->isp_addr); ++ } else ++#endif ++ if (ispmodule_obj.isp_pipeline & OMAP_ISP_CCDC) { ++ ispccdc_set_outaddr(sgdma_state->isp_addr); ++ } ++} ++ ++void isp_calc_pipeline(struct v4l2_pix_format *pix_input, ++ struct v4l2_pix_format *pix_output) ++{ ++ ++ ispmodule_obj.isp_pipeline = OMAP_ISP_CCDC; ++ ++#ifdef ENABLE_BT_656_CAPTURE ++ if (pix_input->field == V4L2_FIELD_NONE) ++ ispmodule_obj.capture_type = 0; /* Progressive */ ++ else ++ ispmodule_obj.capture_type = 1; /* Interlaced */ ++ ++ ispmodule_obj.input_pixelformat = pix_input->pixelformat; ++#endif ++ ++ if ((pix_input->pixelformat == V4L2_PIX_FMT_SGRBG10) && ++ (pix_output->pixelformat != V4L2_PIX_FMT_SGRBG10)) { ++ ispmodule_obj.isp_pipeline |= (OMAP_ISP_PREVIEW | ++ OMAP_ISP_RESIZER); ++ ispccdc_config_datapath(CCDC_RAW, CCDC_OTHERS_VP); ++ isppreview_config_datapath(PRV_RAW_CCDC, ++ PREVIEW_RSZ); ++ ispresizer_config_datapath(RSZ_OTFLY_YUV); ++ } else { ++ if (pix_input->pixelformat == V4L2_PIX_FMT_SGRBG10) ++ ispccdc_config_datapath(CCDC_RAW, CCDC_OTHERS_MEM); ++ else ++#ifndef ENABLE_BT_656_CAPTURE ++ ispccdc_config_datapath(CCDC_YUV_SYNC, CCDC_OTHERS_MEM); ++#else ++ ispccdc_config_datapath(CCDC_YUV_BT, CCDC_OTHERS_MEM); ++#endif ++ } ++ return; ++} ++ ++ ++void isp_config_pipeline(struct v4l2_pix_format *pix_input, ++ struct v4l2_pix_format *pix_output) ++{ ++ ispccdc_config_size(ispmodule_obj.ccdc_input_width, ++ ispmodule_obj.ccdc_input_height, ++ ispmodule_obj.ccdc_output_width, ++ ispmodule_obj.ccdc_output_height); ++ ++ if (ispmodule_obj.isp_pipeline & OMAP_ISP_PREVIEW) ++ isppreview_config_size(ispmodule_obj.preview_input_width, ++ ispmodule_obj.preview_input_height, ++ ispmodule_obj.preview_output_width, ++ ispmodule_obj.preview_output_height); ++ ++ if (ispmodule_obj.isp_pipeline & OMAP_ISP_RESIZER) ++ ispresizer_config_size(ispmodule_obj.resizer_input_width, ++ ispmodule_obj.resizer_input_height, ++ ispmodule_obj.resizer_output_width, ++ ispmodule_obj.resizer_output_height); ++ ++#ifdef ENABLE_BT_656_CAPTURE ++ if (pix_input->pixelformat == V4L2_PIX_FMT_UYVY) ++ ispccdc_config_y8pos(Y8POS_ODD); ++ else if (pix_input->pixelformat == V4L2_PIX_FMT_YUYV) ++ ispccdc_config_y8pos(Y8POS_EVEN); ++ ++ if (((pix_input->pixelformat == V4L2_PIX_FMT_UYVY) && ++ (pix_output->pixelformat == V4L2_PIX_FMT_UYVY)) || ++ ((pix_input->pixelformat == V4L2_PIX_FMT_YUYV) && ++ (pix_output->pixelformat == V4L2_PIX_FMT_YUYV))) ++ /* input and output formats are in same order */ ++ ispccdc_config_byteswap(0); ++ else if (((pix_input->pixelformat == V4L2_PIX_FMT_YUYV) && ++ (pix_output->pixelformat == V4L2_PIX_FMT_UYVY)) || ++ ((pix_input->pixelformat == V4L2_PIX_FMT_UYVY) && ++ (pix_output->pixelformat == V4L2_PIX_FMT_YUYV))) ++ /* input and output formats are in reverse order */ ++ ispccdc_config_byteswap(1); ++ ++ /* Configure Pitch */ ++ ispccdc_config_outlineoffset(ispmodule_obj.pix.bytesperline, 0, 0); ++#endif ++ ++ if (pix_output->pixelformat == V4L2_PIX_FMT_UYVY) { ++ isppreview_config_ycpos(YCPOS_YCrYCb); ++#ifdef USE_ISP_RESZ ++ ispresizer_config_ycpos(0); ++#endif ++ } else { ++ isppreview_config_ycpos(YCPOS_CrYCbY); ++#ifdef USE_ISP_RESZ ++ ispresizer_config_ycpos(1); ++#endif ++ } ++ ++ return; ++} ++ ++/* Callback for interrupt completion*/ ++void isp_vbq_done(unsigned long status, isp_vbq_callback_ptr arg1, void *arg2) ++{ ++ struct videobuf_buffer *vb = (struct videobuf_buffer *) arg2; ++ int notify = 0; ++ int rval = 0; ++ unsigned long flags; ++#ifdef ENABLE_BT_656_CAPTURE ++ unsigned long fld_stat = (omap_readl(ISPCCDC_SYN_MODE) >> 15) & 0x1; ++#endif ++ switch (status) { ++ case CCDC_VD0: ++#ifdef ENABLE_BT_656_CAPTURE ++ if (ispmodule_obj.capture_type) { ++ spin_lock(&isp_obj.isp_temp_buf_lock); ++ if (ispmodule_obj.current_field != fld_stat) { ++ if (fld_stat == 0) ++ ispmodule_obj.current_field = fld_stat; ++ ++ spin_unlock(&isp_obj.isp_temp_buf_lock); ++ return; ++ } ++ spin_unlock(&isp_obj.isp_temp_buf_lock); ++ ++ if (fld_stat == 0) { /* Skip even fields */ ++ return; ++ } ++ } ++#endif ++ ++ ispccdc_config_shadow_registers(); ++ if ((ispmodule_obj.isp_pipeline & OMAP_ISP_RESIZER) || ++ (ispmodule_obj.isp_pipeline & OMAP_ISP_PREVIEW)) ++ return; ++ else { ++ spin_lock(&isp_obj.isp_temp_buf_lock); ++ if (ispmodule_obj.isp_temp_state != ISP_BUF_INIT) { ++ spin_unlock(&isp_obj.isp_temp_buf_lock); ++ return; ++ ++ } else { ++ spin_unlock(&isp_obj.isp_temp_buf_lock); ++ break; ++ } ++ } ++ break; ++ case CCDC_VD1: ++#ifdef ENABLE_BT_656_CAPTURE ++ if (ispmodule_obj.capture_type) { ++ spin_lock(&isp_obj.isp_temp_buf_lock); ++ if (ispmodule_obj.current_field != fld_stat) { ++ if (fld_stat == 0) ++ ispmodule_obj.current_field = fld_stat; ++ ++ spin_unlock(&isp_obj.isp_temp_buf_lock); ++ return; ++ } ++ ++ if (fld_stat == 0) { /* Skip even fields */ ++ return; ++ } ++ ++ spin_unlock(&isp_obj.isp_temp_buf_lock); ++ } ++#endif ++ ++ if ((ispmodule_obj.isp_pipeline & OMAP_ISP_RESIZER) || ++ (ispmodule_obj.isp_pipeline & OMAP_ISP_PREVIEW)) ++ return; ++ spin_lock(&isp_obj.isp_temp_buf_lock); ++ if (ispmodule_obj.isp_temp_state == ISP_BUF_INIT) { ++ spin_unlock(&isp_obj.isp_temp_buf_lock); ++ ispccdc_enable(0); ++ return; ++ } ++ spin_unlock(&isp_obj.isp_temp_buf_lock); ++ return; ++ break; ++ ++#ifdef USE_ISP_PREVIEW ++ case PREV_DONE: ++ if (ispmodule_obj.isp_pipeline & OMAP_ISP_RESIZER) { ++ if (!ispmodule_obj.applyCrop && ++ (ispmodule_obj.isp_temp_state == ++ ISP_BUF_INIT)) ++ ispresizer_enable(1); ++ if (ispmodule_obj.applyCrop && !ispresizer_busy()) { ++ ispresizer_enable(0); ++ ispresizer_applycrop(); ++ ispmodule_obj.applyCrop = 0; ++ } ++ } ++ isppreview_config_shadow_registers(); ++ isph3a_update_wb(); ++ if (ispmodule_obj.isp_pipeline & OMAP_ISP_RESIZER) ++ return; ++ break; ++#endif ++ ++#ifdef USE_ISP_RESZ ++ case RESZ_DONE: ++ ispresizer_config_shadow_registers(); ++ spin_lock(&isp_obj.isp_temp_buf_lock); ++ if (ispmodule_obj.isp_temp_state != ISP_BUF_INIT) { ++ spin_unlock(&isp_obj.isp_temp_buf_lock); ++ return; ++ } ++ spin_unlock(&isp_obj.isp_temp_buf_lock); ++ break; ++#endif ++ ++ case HS_VS: ++#ifndef ENABLE_BT_656_CAPTURE ++ spin_lock(&isp_obj.isp_temp_buf_lock); ++ if (ispmodule_obj.isp_temp_state == ISP_BUF_TRAN) { ++ isp_CCDC_VD01_enable(); ++ ispmodule_obj.isp_temp_state = ISP_BUF_INIT; ++ } ++ spin_unlock(&isp_obj.isp_temp_buf_lock); ++ return; ++#else ++ if (ispmodule_obj.capture_type) { ++ ispmodule_obj.current_field ^= 1; ++ spin_lock(&isp_obj.isp_temp_buf_lock); ++ if ((ispmodule_obj.isp_temp_state == ISP_BUF_TRAN) && ++ (fld_stat == 1)) { ++ isp_CCDC_VD01_enable(); ++ ispmodule_obj.current_field = fld_stat; ++ ispmodule_obj.isp_temp_state = ISP_BUF_INIT; ++ } ++ spin_unlock(&isp_obj.isp_temp_buf_lock); ++ return; ++ } else { ++ spin_lock(&isp_obj.isp_temp_buf_lock); ++ if (ispmodule_obj.isp_temp_state == ISP_BUF_TRAN) { ++ isp_CCDC_VD01_enable(); ++ ispmodule_obj.isp_temp_state = ISP_BUF_INIT; ++ } ++ spin_unlock(&isp_obj.isp_temp_buf_lock); ++ return; ++ } ++#endif ++ ++ default: ++ break; ++ } ++ ++ spin_lock_irqsave(&ispsg.lock, flags); ++ ispsg.free_sgdma++; ++ if (ispsg.free_sgdma > NUM_SG_DMA) ++ ispsg.free_sgdma = NUM_SG_DMA; ++ spin_unlock_irqrestore(&ispsg.lock, flags); ++ ++ rval = arg1(vb); ++ ++ if (rval) ++ isp_sgdma_process(&ispsg, 1, ¬ify, arg1); ++ ++ return; ++} ++ ++void ++isp_sgdma_init() ++{ ++ int sg; ++ ++ ispsg.free_sgdma = NUM_SG_DMA; ++ ispsg.next_sgdma = 0; ++ for (sg = 0; sg < NUM_SG_DMA; sg++) { ++ ispsg.sg_state[sg].status = 0; ++ ispsg.sg_state[sg].callback = NULL; ++ ispsg.sg_state[sg].arg = NULL; ++ } ++} ++EXPORT_SYMBOL(isp_sgdma_init); ++ ++void isp_sgdma_process(struct isp_sgdma *sgdma, int irq, int *dma_notify, ++ isp_vbq_callback_ptr func_ptr) ++{ ++ struct isp_sgdma_state *sgdma_state; ++ unsigned long flags; ++ spin_lock_irqsave(&sgdma->lock, flags); ++ ++ /* we can at most start or queue one sgdma */ ++ if ((NUM_SG_DMA - sgdma->free_sgdma) > 0) { ++ /* get the next sgdma */ ++ sgdma_state = sgdma->sg_state + ++ (sgdma->next_sgdma + sgdma->free_sgdma) % NUM_SG_DMA; ++ if (!irq) { ++ if (*dma_notify) { ++ /* case 1: queue & start. */ ++ isp_set_sgdma_callback(sgdma_state, func_ptr); ++ isp_set_buf(sgdma_state); ++ ispccdc_enable(1); ++ isp_start(); ++ *dma_notify = 0; ++ ispmodule_obj.isp_temp_state = ISP_BUF_TRAN; ++ } else { ++ /* ++ * case 3: only need to queue ++ * (update buf ptr). ++ */ ++ if (ispmodule_obj.isp_temp_state == ++ ISP_FREE_RUNNING) { ++ isp_set_sgdma_callback(sgdma_state, ++ func_ptr); ++ isp_set_buf(sgdma_state); ++ /* Non startup case */ ++ ispccdc_enable(1); ++ ispmodule_obj.isp_temp_state = ++ ISP_BUF_TRAN; ++ } ++ } ++ } else { ++ /* case 3:only need to queue (update buf ptr). */ ++ isp_set_sgdma_callback(sgdma_state, func_ptr); ++ isp_set_buf(sgdma_state); ++ /* Non startup case */ ++ ispccdc_enable(1); ++ ispmodule_obj.isp_temp_state = ISP_BUF_INIT; ++ /* TODO: clear irq. old interrupt can come first. ++ * OK for preview. ++ */ ++ if (*dma_notify) { ++ isp_start(); ++ *dma_notify = 0; ++ } ++ } ++ } else { ++ spin_lock(&isp_obj.isp_temp_buf_lock); ++ /* Disable VD0 and CCDC here before next VSYNC */ ++ isp_CCDC_VD01_disable(); ++ ispmodule_obj.isp_temp_state = ISP_FREE_RUNNING; ++ spin_unlock(&isp_obj.isp_temp_buf_lock); ++ } ++ spin_unlock_irqrestore(&sgdma->lock, flags); ++ return; ++} ++ ++int isp_sgdma_queue(struct videobuf_dmabuf *vdma, struct videobuf_buffer *vb, ++ int irq, int *dma_notify, ++ isp_vbq_callback_ptr func_ptr) ++{ ++ unsigned long flags; ++ struct isp_sgdma_state *sg_state; ++ const struct scatterlist *sglist = vdma->sglist; ++ int sglen = vdma->sglen; ++ ++ if ((sglen < 0) || ((sglen > 0) & !sglist)) ++ return -EINVAL; ++ ++ spin_lock_irqsave(&ispsg.lock, flags); ++ ++ if (!ispsg.free_sgdma) { ++ spin_unlock_irqrestore(&ispsg.lock, flags); ++ return -EBUSY; ++ } ++ ++ sg_state = ispsg.sg_state + ispsg.next_sgdma; ++ sg_state->isp_addr = ispsg.isp_addr_capture[vb->i]; ++ sg_state->status = 0; ++ sg_state->callback = isp_vbq_done; ++ sg_state->arg = vb; ++ ++ ispsg.next_sgdma = (ispsg.next_sgdma + 1) % NUM_SG_DMA; ++ ispsg.free_sgdma--; ++ ++ spin_unlock_irqrestore(&ispsg.lock, flags); ++ ++ isp_sgdma_process(&ispsg, irq, dma_notify, func_ptr); ++ ++ return 0; ++} ++EXPORT_SYMBOL(isp_sgdma_queue); ++ ++int isp_vbq_prepare(struct videobuf_queue *vbq, struct videobuf_buffer *vb, ++ enum v4l2_field field) ++{ ++ unsigned int isp_addr; ++ struct videobuf_dmabuf *vdma; ++ ++ int err = 0; ++ ++ vdma = videobuf_to_dma(vb); ++ ++ /* Map the address to ISP MMU */ ++ isp_addr = ispmmu_map_sg(vdma->sglist, vdma->sglen); ++ ++ if (!isp_addr) ++ err = -EIO; ++ else ++ ispsg.isp_addr_capture[vb->i] = isp_addr; ++ ++ return err; ++} ++EXPORT_SYMBOL(isp_vbq_prepare); ++ ++void isp_vbq_release(struct videobuf_queue *vbq, struct videobuf_buffer *vb) ++{ ++ /* Un-Map the address in ISP MMU */ ++ ispmmu_unmap(ispsg.isp_addr_capture[vb->i]); ++ ispsg.isp_addr_capture[vb->i] = (dma_addr_t) NULL; ++ vb->state = VIDEOBUF_NEEDS_INIT; ++ return; ++} ++EXPORT_SYMBOL(isp_vbq_release); ++ ++int isp_queryctrl(struct v4l2_queryctrl *a) ++{ ++ int i; ++ ++ i = find_vctrl(a->id); ++ if (i == -EINVAL) ++ a->flags = V4L2_CTRL_FLAG_DISABLED; ++ ++ if (i < 0) ++ return -EINVAL; ++ ++ *a = video_control[i].qc; ++ return 0; ++} ++EXPORT_SYMBOL(isp_queryctrl); ++ ++int isp_g_ctrl(struct v4l2_control *a) ++{ ++ u8 current_value; ++ int rval = 0; ++ ++ switch (a->id) { ++ case V4L2_CID_BRIGHTNESS: ++ isppreview_query_brightness(¤t_value); ++ a->value = current_value / ISPPRV_BRIGHT_UNITS; ++ break; ++ case V4L2_CID_CONTRAST: ++ isppreview_query_contrast(¤t_value); ++ a->value = current_value / ISPPRV_CONTRAST_UNITS; ++ break; ++ case V4L2_CID_PRIVATE_ISP_COLOR_FX: ++ isppreview_get_color(¤t_value); ++ a->value = current_value; ++ break; ++ case V4L2_CID_PRIVATE_ISP_CCDC_CFG: ++ a->value = 0; ++ break; ++ case V4L2_CID_PRIVATE_ISP_PRV_CFG: ++ a->value = 0; ++ break; ++ case V4L2_CID_PRIVATE_ISP_LSC_UPDATE: ++ a->value = 0; ++ break; ++ case V4L2_CID_PRIVATE_ISP_AEWB_CFG: ++ a->value = 0; ++ break; ++ case V4L2_CID_PRIVATE_ISP_AEWB_REQ: ++ a->value = 0; ++ break; ++ case V4L2_CID_PRIVATE_ISP_AF_CFG: ++ a->value = 0; ++ break; ++ case V4L2_CID_PRIVATE_ISP_AF_REQ: ++ a->value = 0; ++ break; ++ default: ++ rval = -EINVAL; ++ break; ++ } ++ return rval; ++} ++EXPORT_SYMBOL(isp_g_ctrl); ++ ++int isp_s_ctrl(struct v4l2_control *a) ++{ ++ int rval = 0; ++ u8 new_value = a->value; ++ ++ switch (a->id) { ++ case V4L2_CID_BRIGHTNESS: ++ if (new_value > ISPPRV_BRIGHT_HIGH) ++ rval = -EINVAL; ++ else ++ isppreview_update_brightness(&new_value); ++ break; ++ case V4L2_CID_CONTRAST: ++ if (new_value > ISPPRV_CONTRAST_HIGH) ++ rval = -EINVAL; ++ else ++ isppreview_update_contrast(&new_value); ++ break; ++ case V4L2_CID_PRIVATE_ISP_COLOR_FX: ++ if (new_value > PREV_SEPIA_COLOR) ++ rval = -EINVAL; ++ else ++ isppreview_set_color(&new_value); ++ break; ++ case V4L2_CID_PRIVATE_ISP_CCDC_CFG: ++ omap34xx_isp_ccdc_config((void *)a->value); ++ break; ++ case V4L2_CID_PRIVATE_ISP_PRV_CFG: ++ omap34xx_isp_preview_config((void *)a->value); ++ break; ++ case V4L2_CID_PRIVATE_ISP_LSC_UPDATE: ++ omap34xx_isp_tables_update((void *)a->value); ++ omap34xx_isp_lsc_update((void *)a->value); ++ break; ++ case V4L2_CID_PRIVATE_ISP_AEWB_CFG: ++ if (!a->value) ++ rval = -EFAULT; ++ else { ++ struct isph3a_aewb_config params; ++ if (copy_from_user(¶ms, (void *)a->value, ++ sizeof(params))) { ++ rval = -EFAULT; ++ printk(KERN_ERR "Failed copy_from_user\n"); ++ } else ++ rval = isph3a_aewb_configure(¶ms); ++ } ++ break; ++ case V4L2_CID_PRIVATE_ISP_AEWB_REQ: ++ if (!a->value) ++ rval = -EFAULT; ++ else { ++ struct isph3a_aewb_data data; ++ if (copy_from_user(&data, (void *)a->value, ++ sizeof(data))) { ++ rval = -EFAULT; ++ printk(KERN_ERR "Failed copy_from_user\n"); ++ break; ++ } ++ rval = isph3a_aewb_request_statistics(&data); ++ if (!rval) ++ if (copy_to_user((void *)a->value, &data, ++ sizeof(data))) { ++ rval = -EFAULT; ++ printk(KERN_ERR ++ "Failed copy_to_user\n"); ++ } ++ } ++ break; ++ case V4L2_CID_PRIVATE_ISP_AF_CFG: ++ if (!a->value) ++ rval = -EFAULT; ++ else { ++ struct af_configuration params; ++ ++ if (copy_from_user(¶ms, (struct af_configuration *)a->value, ++ sizeof(struct af_configuration))) { ++ rval = -EFAULT; ++ printk(KERN_ERR "Failed copy_from_user\n"); ++ } else ++ rval = isp_af_configure(¶ms); ++ } ++ break; ++ case V4L2_CID_PRIVATE_ISP_AF_REQ: ++ if (!a->value) ++ rval = -EFAULT; ++ else { ++ struct isp_af_data data; ++ if (copy_from_user(&data, (void *) (a->value), ++ sizeof(data))) { ++ printk(KERN_ERR "Failed copy_from_user\n"); ++ return -EFAULT; ++ } ++ ++ if(data.update & LENS_CURRENT_POSITION){ ++#if 0 ++ if(dw9710_af_getfocus(&data.lens_current_position)) ++#endif ++ return -EFAULT; ++ ++ if (copy_to_user((void *)a->value, &data, ++ sizeof(data))) { ++ rval = -EFAULT; ++ printk(KERN_ERR ++ "Failed copy_to_user\n"); ++ } ++ } ++ if(data.update & LENS_DESIRED_POSITION) ++#if 0 ++ if(dw9710_af_setfocus(data.desired_lens_direction)) ++#endif ++ return -EFAULT; ++ ++ rval = isp_af_request_statistics(&data); ++ if (!rval) ++ if (copy_to_user((void *)a->value, &data, ++ sizeof(data))) { ++ rval = -EFAULT; ++ printk(KERN_ERR ++ "Failed copy_to_user\n"); ++ } ++ } ++ ++ break; ++ case V4L2_CID_PRIVATE_ISP_HIST_CFG: ++ if (!a->value) ++ rval = -EFAULT; ++ else { ++ struct isp_hist_config params; ++ if (copy_from_user(¶ms, (struct isp_hist_config *)a->value, ++ sizeof(struct isp_hist_config))) { ++ rval = -EFAULT; ++ printk(KERN_ERR "Failed copy_from_user\n"); ++ } else ++ rval = isp_hist_configure(¶ms); ++ } ++ break; ++ ++ case V4L2_CID_PRIVATE_ISP_HIST_REQ: ++ if (!a->value) ++ rval = -EFAULT; ++ else { ++ struct isp_hist_data data; ++ ++ if (copy_from_user(&data, (struct isp_hist_data *)a->value, ++ sizeof(struct isp_hist_data))) { ++ rval = -EFAULT; ++ printk(KERN_ERR "Failed copy_from_user\n"); ++ } else ++ rval = isp_hist_request_statistics(&data); ++ } ++ break; ++ default: ++ rval = -EINVAL; ++ break; ++ } ++ return rval; ++} ++EXPORT_SYMBOL(isp_s_ctrl); ++ ++int isp_enum_fmt_cap(struct v4l2_fmtdesc *f) ++{ ++ int index = f->index; ++ enum v4l2_buf_type type = f->type; ++ int rval = -EINVAL; ++#ifdef ENABLE_BT_656_CAPTURE ++ int num_formats = NUM_ISP_CAPTURE_FORMATS; ++ ++ if (ispmodule_obj.input_pixelformat != V4L2_PIX_FMT_SGRBG10) ++ num_formats--; ++#endif ++ ++#ifndef ENABLE_BT_656_CAPTURE ++ if (index >= NUM_ISP_CAPTURE_FORMATS) ++ goto err; ++#else ++ if (index >= num_formats) ++ goto err; ++#endif ++ ++ memset(f, 0, sizeof(*f)); ++ f->index = index; ++ f->type = type; ++ ++ switch (f->type) { ++ case V4L2_BUF_TYPE_VIDEO_CAPTURE: ++ rval = 0; ++ break; ++ default: ++ goto err; ++ } ++ ++ f->flags = isp_formats[index].flags; ++ strncpy(f->description, isp_formats[index].description, ++ sizeof(f->description)); ++ f->pixelformat = isp_formats[index].pixelformat; ++err: ++ return rval; ++} ++EXPORT_SYMBOL(isp_enum_fmt_cap); ++ ++void isp_g_fmt_cap(struct v4l2_format *f) ++{ ++ f->fmt.pix = ispmodule_obj.pix; ++ return; ++} ++EXPORT_SYMBOL(isp_g_fmt_cap); ++ ++int isp_s_fmt_cap(struct v4l2_pix_format *pix_input, ++ struct v4l2_pix_format *pix_output) ++{ ++ int crop_scaling_w = 0; ++ int crop_scaling_h = 0; ++ int rval; ++ ++ /* Call Try Size for the ISP */ ++ isp_calc_pipeline(pix_input, pix_output); ++ rval = isp_try_size(pix_input, pix_output); ++ ++ if (rval) ++ goto out; ++ ++ rval = isp_try_fmt(pix_input, pix_output); ++ if (rval) ++ goto out; ++ ++ /* Reset crop settings if needed as image size might have changed */ ++ if (ispcroprect.width == pix_output->width) { ++ crop_scaling_w = 0; ++ } else { ++ if (ispcroprect.width != 0) ++ crop_scaling_w = 1; ++ ispcroprect.left = 0; ++ ispcroprect.width = pix_output->width; ++ } ++ ++ if (ispcroprect.height == pix_output->height) { ++ crop_scaling_h = 0; ++ } else { ++ if (ispcroprect.height != 0) ++ crop_scaling_h = 1; ++ ispcroprect.top = 0; ++ ispcroprect.height = pix_output->height; ++ } ++ ++ /* Configure the ISP */ ++ isp_config_pipeline(pix_input, pix_output); ++ /* Reapply resizer settings in case a crop is set. */ ++ if (crop_scaling_h || crop_scaling_w) ++ isp_config_crop(pix_output); ++out: ++ return rval; ++} ++EXPORT_SYMBOL(isp_s_fmt_cap); ++ ++void isp_config_crop(struct v4l2_pix_format *croppix) ++{ ++ u8 crop_scaling_w; ++ u8 crop_scaling_h; ++ struct v4l2_pix_format *pix = croppix; ++ ++ crop_scaling_w = (ispmodule_obj.preview_output_width * 10) / ++ pix->width; ++ crop_scaling_h = (ispmodule_obj.preview_output_height * 10) / ++ pix->height; ++ ++ cur_rect.left = (ispcroprect.left * crop_scaling_w) / 10; ++ cur_rect.top = (ispcroprect.top * crop_scaling_h) / 10; ++ cur_rect.width = (ispcroprect.width * crop_scaling_w) / 10; ++ cur_rect.height = (ispcroprect.height * crop_scaling_h) / 10; ++ ++ ispresizer_trycrop(cur_rect.left, cur_rect.top, cur_rect.width, ++ cur_rect.height, ++ ispmodule_obj.resizer_output_width, ++ ispmodule_obj.resizer_output_height); ++ return; ++} ++ ++int isp_g_crop(struct v4l2_crop *a) ++{ ++ struct v4l2_crop *crop = a; ++ ++ crop->c = ispcroprect; ++ return 0; ++} ++EXPORT_SYMBOL(isp_g_crop); ++ ++int isp_s_crop(struct v4l2_crop *a, struct v4l2_pix_format *pix) ++{ ++ struct v4l2_crop *crop = a; ++ int rval = 0; ++ ++ if ((crop->c.left + crop->c.width) > pix->width) { ++ rval = -EINVAL; ++ goto out; ++ } ++ ++ if ((crop->c.top + crop->c.height) > pix->height) { ++ rval = -EINVAL; ++ goto out; ++ } ++ ++ ispcroprect.left = crop->c.left; ++ ispcroprect.top = crop->c.top; ++ ispcroprect.width = crop->c.width; ++ ispcroprect.height = crop->c.height; ++ ++ isp_config_crop(pix); ++ ++ ispmodule_obj.applyCrop = 1; ++out: ++ return rval; ++} ++EXPORT_SYMBOL(isp_s_crop); ++ ++int isp_try_fmt_cap(struct v4l2_pix_format *pix_input, ++ struct v4l2_pix_format *pix_output) ++{ ++ int rval = 0; ++ ++ isp_calc_pipeline(pix_input, pix_output); ++ rval = isp_try_size(pix_input, pix_output); ++ ++ if (rval) ++ goto out; ++ ++ rval = isp_try_fmt(pix_input, pix_output); ++ ++ if (rval) ++ goto out; ++ ++out: ++ return rval; ++} ++EXPORT_SYMBOL(isp_try_fmt_cap); ++ ++int isp_try_size(struct v4l2_pix_format *pix_input, ++ struct v4l2_pix_format *pix_output) ++{ ++ int rval = 0; ++ /* ++ * First initialize local ISP struct ++ */ ++ ispmodule_obj.ccdc_input_width = pix_input->width; ++ ispmodule_obj.ccdc_input_height = pix_input->height; ++ ispmodule_obj.resizer_output_width = pix_output->width; ++ ispmodule_obj.resizer_output_height = pix_output->height; ++ ++ /* Try size for CCDC Module if enabled */ ++ if (ispmodule_obj.isp_pipeline & OMAP_ISP_CCDC) { ++ rval = ispccdc_try_size(ispmodule_obj.ccdc_input_width, ++ ispmodule_obj.ccdc_input_height, ++ &ispmodule_obj.ccdc_output_width, ++ &ispmodule_obj.ccdc_output_height); ++ pix_output->width = ispmodule_obj.ccdc_output_width; ++ pix_output->height = ispmodule_obj.ccdc_output_height; ++ } ++ ++ if (ispmodule_obj.isp_pipeline & OMAP_ISP_PREVIEW) { ++ ispmodule_obj.preview_input_width = ++ ispmodule_obj.ccdc_output_width; ++ ispmodule_obj.preview_input_height = ++ ispmodule_obj.ccdc_output_height; ++ rval = isppreview_try_size(ispmodule_obj.preview_input_width, ++ ispmodule_obj.preview_input_height, ++ &ispmodule_obj.preview_output_width, ++ &ispmodule_obj.preview_output_height); ++ pix_output->width = ispmodule_obj.preview_output_width; ++ pix_output->height = ispmodule_obj.preview_output_height; ++ } ++ ++ if (ispmodule_obj.isp_pipeline & OMAP_ISP_RESIZER) { ++ ispmodule_obj.resizer_input_width = ++ ispmodule_obj.preview_output_width; ++ ispmodule_obj.resizer_input_height = ++ ispmodule_obj.preview_output_height; ++ rval = ispresizer_try_size(&ispmodule_obj.resizer_input_width, ++ &ispmodule_obj.resizer_input_height, ++ &ispmodule_obj.resizer_output_width, ++ &ispmodule_obj.resizer_output_height); ++ pix_output->width = ispmodule_obj.resizer_output_width; ++ pix_output->height = ispmodule_obj.resizer_output_height; ++ } ++ return rval; ++} ++EXPORT_SYMBOL(isp_try_size); ++ ++int isp_try_fmt(struct v4l2_pix_format *pix_input, ++ struct v4l2_pix_format *pix_output) ++{ ++ int ifmt; ++ ++ /* done with size negotiation, now fill other info */ ++ for (ifmt = 0; ifmt < NUM_ISP_CAPTURE_FORMATS; ifmt++) { ++ if (pix_output->pixelformat == isp_formats[ifmt].pixelformat) ++ break; ++ } ++ if (ifmt == NUM_ISP_CAPTURE_FORMATS) ++ ifmt = 1; ++ pix_output->pixelformat = isp_formats[ifmt].pixelformat; ++ ++#ifndef ENABLE_BT_656_CAPTURE ++ pix_output->field = V4L2_FIELD_NONE; ++ pix_output->bytesperline = pix_output->width * 2; ++#else ++ pix_output->field = pix_input->field; ++#endif ++ ++ pix_output->sizeimage = pix_output->bytesperline * pix_output->height; ++ pix_output->priv = 0; ++ switch (pix_output->pixelformat) { ++ case V4L2_PIX_FMT_YUYV: ++ case V4L2_PIX_FMT_UYVY: ++#ifndef ENABLE_BT_656_CAPTURE ++ pix_output->colorspace = V4L2_COLORSPACE_JPEG; ++#else ++ pix_output->colorspace = pix_input->colorspace; ++#endif ++ break; ++ default: ++ pix_output->colorspace = V4L2_COLORSPACE_SRGB; ++ break; ++ } ++ ++ ispmodule_obj.pix.pixelformat = pix_output->pixelformat; ++ ispmodule_obj.pix.width = pix_output->width; ++ ispmodule_obj.pix.height = pix_output->height; ++ ispmodule_obj.pix.field = pix_output->field; ++ ispmodule_obj.pix.bytesperline = pix_output->bytesperline; ++ ispmodule_obj.pix.sizeimage = pix_output->sizeimage; ++ ispmodule_obj.pix.priv = pix_output->priv; ++ ispmodule_obj.pix.colorspace = pix_output->colorspace; ++ return 0; ++} ++ ++#ifdef ENABLE_BT_656_CAPTURE ++/* Configure ISP depending on standard */ ++int isp_configure_std(v4l2_std_id std) ++{ ++ struct isp_std_config_params *params; ++ int rval = 0; ++ struct v4l2_pix_format pix_input, pix_output; ++ ++ if (std & V4L2_STD_NTSC) { ++ params = &std_params[0]; ++ } else if (std & V4L2_STD_PAL) { ++ params = &std_params[1]; ++ } else ++ return -EINVAL; ++ ++ ispmodule_obj.pix.pixelformat = params->pixelformat; ++ ispmodule_obj.pix.width = params->active_pixels; ++ ispmodule_obj.pix.height = params->active_lines; ++ ispmodule_obj.pix.field = params->field; ++ ispmodule_obj.pix.bytesperline = params->bytesperline; ++ ispmodule_obj.pix.sizeimage = params->sizeimage; ++ ispmodule_obj.pix.colorspace = params->colorspace; ++ ++ if ((std & V4L2_STD_NTSC) || (std & V4L2_STD_PAL)) { ++ pix_input = ispmodule_obj.pix; ++ pix_output = ispmodule_obj.pix; ++ } else ++ return -EINVAL; ++ ++ rval = isp_s_fmt_cap(&pix_input, &pix_output); ++ ++ return rval; ++} ++EXPORT_SYMBOL(isp_configure_std); ++ ++/* Checks for proper pixel parameters */ ++int isp_check_format(struct v4l2_pix_format *pixfmt) ++{ ++ u32 hpitch, vpitch; ++ ++ if (pixfmt->bytesperline <= 0) { ++ DPRINTK_ISPCTRL("Invalid pitch\n"); ++ return -EINVAL; ++ } ++ ++ hpitch = pixfmt->bytesperline; ++ vpitch = pixfmt->sizeimage / hpitch; ++ ++ /* Check for valid value of pitch */ ++ if ((hpitch < ispmodule_obj.pix.width * 2) || ++ (vpitch < ispmodule_obj.pix.height)) { ++ DPRINTK_ISPCTRL("Invalid pitch\n"); ++ return -EINVAL; ++ } ++ /* Check for 32 byte alignment */ ++ if (hpitch != (hpitch & ~0x1F)) { ++ DPRINTK_ISPCTRL("Invalid pitch alignment\n"); ++ return -EINVAL; ++ } ++ pixfmt->width = ispmodule_obj.pix.width; ++ pixfmt->height = ispmodule_obj.pix.height; ++ return 0; ++} ++EXPORT_SYMBOL(isp_check_format); ++#endif ++ ++/** ++ * isp_save_ctx - Saves ISP, CCDC, HIST, H3A, PREV, RESZ & MMU context. ++ * ++ * Routine for saving the context of each module in the ISP. ++ * CCDC, HIST, H3A, PREV, RESZ and MMU. ++ **/ ++void isp_save_ctx(void) ++{ ++ isp_save_context(isp_reg_list); ++ ispccdc_save_context(); ++ isphist_save_context(); ++ isph3a_save_context(); ++ isppreview_save_context(); ++ ispresizer_save_context(); ++ ispmmu_save_context(); ++} ++EXPORT_SYMBOL(isp_save_ctx); ++ ++/** ++ * isp_restore_ctx - Restores ISP, CCDC, HIST, H3A, PREV, RESZ & MMU context. ++ * ++ * Routine for restoring the context of each module in the ISP. ++ * CCDC, HIST, H3A, PREV, RESZ and MMU. ++ **/ ++void isp_restore_ctx(void) ++{ ++ isp_restore_context(isp_reg_list); ++ ispccdc_restore_context(); ++ isphist_restore_context(); ++ isph3a_restore_context(); ++ isppreview_restore_context(); ++ ispresizer_restore_context(); ++ ispmmu_restore_context(); ++} ++EXPORT_SYMBOL(isp_restore_ctx); ++ ++/** ++ * isp_get - Adquires the ISP resource. ++ * ++ * Initializes the clocks for the first acquire. ++ **/ ++int isp_get(void) ++{ ++ int ret_err = 0; ++ DPRINTK_ISPCTRL("isp_get: old %d\n", isp_obj.ref_count); ++ mutex_lock(&(isp_obj.isp_mutex)); ++ if (isp_obj.ref_count == 0) { ++#ifdef CONFIG_TRACK_RESOURCES ++ isp_obj.cam_ick = clk_get(&camera_dev, "cam_ick"); ++#else ++ isp_obj.cam_ick = clk_get(NULL, "cam_ick"); ++#endif ++ if (IS_ERR(isp_obj.cam_ick)) { ++ mutex_unlock(&(isp_obj.isp_mutex)); ++ DPRINTK_ISPCTRL("ISP_ERR: clk_get for ick failed\n"); ++ return PTR_ERR(isp_obj.cam_ick); ++ } ++#ifndef ENABLE_BT_656_CAPTURE ++#ifdef CONFIG_TRACK_RESOURCES ++ isp_obj.cam_fck = clk_get(&camera_dev, "cam_mclk"); ++#else ++ isp_obj.cam_fck = clk_get(NULL, "cam_mclk"); ++#endif ++#else ++#ifdef CONFIG_TRACK_RESOURCES ++ isp_obj.cam_fck = clk_get(&camera_dev, "cam_fck"); ++#else ++ isp_obj.cam_fck = clk_get(NULL, "cam_fck"); ++#endif ++#endif ++ if (IS_ERR(isp_obj.cam_fck)) { ++ mutex_unlock(&(isp_obj.isp_mutex)); ++ DPRINTK_ISPCTRL("ISP_ERR: clk_get for fck failed\n"); ++ return PTR_ERR(isp_obj.cam_fck); ++ } ++ /* Cam IF Clk */ ++ ret_err = clk_enable(isp_obj.cam_ick); ++ if (ret_err) { ++ mutex_unlock(&(isp_obj.isp_mutex)); ++ clk_put(isp_obj.cam_ick); ++ clk_put(isp_obj.cam_fck); ++ DPRINTK_ISPCTRL("ISP_ERR: clk_en for ick failed\n"); ++ return ret_err; ++ } ++ /* Cam Func Clk */ ++ ret_err = clk_enable(isp_obj.cam_fck); ++ if (ret_err) { ++ mutex_unlock(&(isp_obj.isp_mutex)); ++ clk_put(isp_obj.cam_ick); ++ clk_put(isp_obj.cam_fck); ++ DPRINTK_ISPCTRL("ISP_ERR: clk_en for fck failed\n"); ++ return ret_err; ++ } ++ /* Context restore */ ++ if (off_mode == 1) ++ isp_restore_ctx(); ++ } ++ isp_obj.ref_count++; ++ mutex_unlock(&(isp_obj.isp_mutex)); ++ ++ ++ DPRINTK_ISPCTRL("isp_get: new %d\n", isp_obj.ref_count); ++ return isp_obj.ref_count; ++} ++EXPORT_SYMBOL(isp_get); ++ ++/** ++ * isp_put - Releases the ISP resource. ++ * ++ * Releases the clocks also for the last release. ++ **/ ++int isp_put(void) ++{ ++ DPRINTK_ISPCTRL("isp_put: old %d\n", isp_obj.ref_count); ++ mutex_lock(&(isp_obj.isp_mutex)); ++ if (isp_obj.ref_count) ++ if (--isp_obj.ref_count == 0) { ++ isp_save_ctx(); ++ off_mode = 1; ++ ++ /* Disable all interrupts */ ++ /* shut down ISP clocks */ ++ clk_disable(isp_obj.cam_ick); ++ clk_disable(isp_obj.cam_fck); ++ clk_put(isp_obj.cam_ick); ++ clk_put(isp_obj.cam_fck); ++ } ++ mutex_unlock(&(isp_obj.isp_mutex)); ++ DPRINTK_ISPCTRL("isp_put: new %d\n", isp_obj.ref_count); ++ return isp_obj.ref_count; ++} ++EXPORT_SYMBOL(isp_put); ++ ++/** ++ * isp_save_context - Saves the values of the ISP module registers. ++ * @reg_list: Structure containing pairs of register address and value to ++ * modify on OMAP. ++ **/ ++void isp_save_context(struct isp_reg *reg_list) ++{ ++ struct isp_reg *next = reg_list; ++ ++ for (; next->reg != ISP_TOK_TERM; next++) ++ next->val = omap_readl(next->reg); ++} ++EXPORT_SYMBOL(isp_save_context); ++ ++/** ++ * isp_restore_context - Restores the values of the ISP module registers. ++ * @reg_list: Structure containing pairs of register address and value to ++ * modify on OMAP. ++ **/ ++void isp_restore_context(struct isp_reg *reg_list) ++{ ++ struct isp_reg *next = reg_list; ++ ++ for (; next->reg != ISP_TOK_TERM; next++) ++ omap_writel(next->val, next->reg); ++} ++EXPORT_SYMBOL(isp_restore_context); ++ ++/** ++ * isp_init - ISP module initialization. ++ **/ ++static int __init isp_init(void) ++{ ++ DPRINTK_ISPCTRL("+isp_init for Omap 3430 Camera ISP\n"); ++ isp_obj.ref_count = 0; ++ ++ mutex_init(&(isp_obj.isp_mutex)); ++ spin_lock_init(&isp_obj.isp_temp_buf_lock); ++ ++ if (request_irq(INT_34XX_CAM_IRQ, omap34xx_isp_isr, IRQF_SHARED, ++ "Omap 34xx Camera ISP", &ispirq_obj)) { ++ DPRINTK_ISPCTRL("Could not install ISR\n"); ++ return -EINVAL; ++ } else { ++ spin_lock_init(&isp_obj.lock); ++ DPRINTK_ISPCTRL("-isp_init for Omap 3430 Camera ISP\n"); ++ return 0; ++ } ++} ++ ++/** ++ * isp_cleanup - ISP module cleanup. ++ **/ ++static void __exit isp_cleanup(void) ++{ ++ free_irq(INT_34XX_CAM_IRQ, &ispirq_obj); ++} ++ ++/** ++ * isp_print_status - Prints the values of the ISP Control Module registers ++ * ++ * Also prints other debug information stored in the ISP module structure. ++ **/ ++void isp_print_status(void) ++{ ++#ifdef OMAP_ISPCTRL_DEBUG ++ DPRINTK_ISPCTRL("###CM_FCLKEN_CAM=0x%x\n", ++ omap_readl(CM_FCLKEN_CAM)); ++ DPRINTK_ISPCTRL("###CM_ICLKEN_CAM=0x%x\n", ++ omap_readl(CM_ICLKEN_CAM)); ++ DPRINTK_ISPCTRL("###CM_CLKSEL_CAM=0x%x\n", ++ omap_readl(CM_CLKSEL_CAM)); ++ DPRINTK_ISPCTRL("###CM_AUTOIDLE_CAM=0x%x\n", ++ omap_readl(CM_AUTOIDLE_CAM)); ++ DPRINTK_ISPCTRL("###CM_CLKEN_PLL[18:16] \ ++ should be 0x7, = 0x%x\n", ++ omap_readl(CM_CLKEN_PLL)); ++ DPRINTK_ISPCTRL("###CM_CLKSEL2_PLL[18:8] should be 0x2D,\ ++ [6:0] should be 1 = 0x%x\n", ++ omap_readl(CM_CLKSEL2_PLL)); ++ DPRINTK_ISPCTRL("###CTRL_PADCONF_CAM_HS=0x%x\n", ++ omap_readl(CTRL_PADCONF_CAM_HS)); ++ DPRINTK_ISPCTRL("###CTRL_PADCONF_CAM_XCLKA=0x%x\n", ++ omap_readl(CTRL_PADCONF_CAM_XCLKA)); ++ DPRINTK_ISPCTRL("###CTRL_PADCONF_CAM_D1=0x%x\n", ++ omap_readl(CTRL_PADCONF_CAM_D1)); ++ DPRINTK_ISPCTRL("###CTRL_PADCONF_CAM_D3=0x%x\n", ++ omap_readl(CTRL_PADCONF_CAM_D3)); ++ DPRINTK_ISPCTRL("###CTRL_PADCONF_CAM_D5=0x%x\n", ++ omap_readl(CTRL_PADCONF_CAM_D5)); ++ DPRINTK_ISPCTRL("###CTRL_PADCONF_CAM_D7=0x%x\n", ++ omap_readl(CTRL_PADCONF_CAM_D7)); ++ DPRINTK_ISPCTRL("###CTRL_PADCONF_CAM_D9=0x%x\n", ++ omap_readl(CTRL_PADCONF_CAM_D9)); ++ DPRINTK_ISPCTRL("###CTRL_PADCONF_CAM_D11=0x%x\n", ++ omap_readl(CTRL_PADCONF_CAM_D11)); ++#endif ++} ++EXPORT_SYMBOL(isp_print_status); ++ ++module_init(isp_init); ++module_exit(isp_cleanup); ++ ++MODULE_AUTHOR("Texas Instruments"); ++MODULE_DESCRIPTION("ISP Control Module Library"); ++MODULE_LICENSE("GPL"); +Index: git/drivers/media/video/isp/isp.h +=================================================================== +--- /dev/null 1970-01-01 00:00:00.000000000 +0000 ++++ git/drivers/media/video/isp/isp.h 2009-02-12 10:29:26.000000000 -0600 +@@ -0,0 +1,275 @@ ++/* ++ * drivers/media/video/isp/isp.h ++ * ++ * Top level public header file for ISP Control module in ++ * TI's OMAP3430 Camera ISP ++ * ++ * Copyright (C) 2008 Texas Instruments. ++ * ++ * This package 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 PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR ++ * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED ++ * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. ++ */ ++ ++#ifndef OMAP_ISP_TOP_H ++#define OMAP_ISP_TOP_H ++#include <media/videobuf-dma-sg.h> ++#include <linux/videodev2.h> ++#define OMAP_ISP_CCDC (1 << 0) ++#define OMAP_ISP_PREVIEW (1 << 1) ++#define OMAP_ISP_RESIZER (1 << 2) ++#define OMAP_ISP_AEWB (1 << 3) ++#define OMAP_ISP_AF (1 << 4) ++#define OMAP_ISP_HIST (1 << 5) ++ ++/* Define this macro to enable BT.656 capture support. Comment this out when ++ BT.656 capture support is not needed */ ++#define ENABLE_BT_656_CAPTURE ++ ++/* Our ISP specific controls */ ++#define V4L2_CID_PRIVATE_ISP_COLOR_FX (V4L2_CID_PRIVATE_BASE + 0) ++#define V4L2_CID_PRIVATE_ISP_CCDC_CFG (V4L2_CID_PRIVATE_BASE + 1) ++#define V4L2_CID_PRIVATE_ISP_PRV_CFG (V4L2_CID_PRIVATE_BASE + 2) ++#define V4L2_CID_PRIVATE_ISP_LSC_UPDATE (V4L2_CID_PRIVATE_BASE + 3) ++#define V4L2_CID_PRIVATE_ISP_AEWB_CFG (V4L2_CID_PRIVATE_BASE + 4) ++#define V4L2_CID_PRIVATE_ISP_AEWB_REQ (V4L2_CID_PRIVATE_BASE + 5) ++#define V4L2_CID_PRIVATE_ISP_AF_CFG (V4L2_CID_PRIVATE_BASE + 6) ++#define V4L2_CID_PRIVATE_ISP_AF_REQ (V4L2_CID_PRIVATE_BASE + 7) ++#define V4L2_CID_PRIVATE_ISP_HIST_CFG (V4L2_CID_PRIVATE_BASE + 8) ++#define V4L2_CID_PRIVATE_ISP_HIST_REQ (V4L2_CID_PRIVATE_BASE + 9) ++ ++typedef int (*isp_vbq_callback_ptr) (struct videobuf_buffer *vb); ++typedef void (*isp_callback_t) (unsigned long status, ++ isp_vbq_callback_ptr arg1, void *arg2); ++ ++enum isp_interface_type{ ++ ISP_PARLL = 1, ++ ISP_CSIA = 2, ++ ISP_CSIB = 4 ++}; ++enum isp_irqevents{ ++ CCDC_VD0 = 0x100, ++ CCDC_VD1 = 0x200, ++ CCDC_VD2 = 0x400, ++ CCDC_ERR = 0x800, ++ H3A_AWB_DONE = 0x2000, ++ H3A_AF_DONE = 0x1000, ++ HIST_DONE = 0x10000, ++ PREV_DONE = 0x100000, ++ LSC_DONE = 0x20000, ++ LSC_PRE_COMP = 0x40000, ++ LSC_PRE_ERR = 0x80000, ++ RESZ_DONE = 0x1000000, ++ SBL_OVF = 0x2000000, ++ MMU_ERR = 0x10000000, ++ OCP_ERR = 0x20000000, ++ HS_VS = 0x80000000 ++}; ++ ++enum isp_callback_type{ ++ CBK_CCDC_VD0, ++ CBK_CCDC_VD1, ++ CBK_PREV_DONE, ++ CBK_RESZ_DONE, ++ CBK_MMU_ERR, ++ CBK_H3A_AWB_DONE, ++ CBK_HIST_DONE, ++ CBK_HS_VS, ++ CBK_LSC_ISR, ++ CBK_H3A_AF_DONE ++}; ++ ++#define ISP_TOK_TERM 0xFFFFFFFF /* terminating token for ISP modules ++ * reg list ++ */ ++#define NUM_SG_DMA (VIDEO_MAX_FRAME+2) ++ ++#define ISP_BUF_INIT 0 ++#define ISP_FREE_RUNNING 1 ++#define ISP_BUF_TRAN 2 ++/* defines a structure for isp registers values */ ++struct isp_reg { ++ u32 reg; /* 32-bit address */ ++ u32 val; /* 32-bit value */ ++}; ++ ++/* sgdma state for each of the possible videobuf_buffers + 2 overlays */ ++struct isp_sgdma_state { ++ /* mapped ISP mmu addrs */ ++ dma_addr_t isp_addr; /* ISP space addr */ ++ u32 status; /* DMA return code */ ++ isp_callback_t callback; ++ void *arg; ++}; ++ ++struct isp_sgdma { ++ dma_addr_t isp_addr_capture[VIDEO_MAX_FRAME]; ++ /* scatter-gather DMA management */ ++ spinlock_t lock; ++ int free_sgdma; /* number of free sg dma slots */ ++ int next_sgdma; /* index of next sg dma slot to use */ ++ struct isp_sgdma_state sg_state[NUM_SG_DMA]; ++}; ++ ++void isp_open(void); ++ ++void isp_close(void); ++ ++void isp_start(void); ++ ++void isp_stop(void); ++ ++void isp_sgdma_init(void); ++ ++void isp_vbq_done(unsigned long status, isp_vbq_callback_ptr arg1, void *arg2); ++ ++void isp_sgdma_process(struct isp_sgdma *sgdma, int irq, int *dma_notify, ++ isp_vbq_callback_ptr func_ptr); ++ ++int isp_sgdma_queue(struct videobuf_dmabuf *vdma, struct videobuf_buffer *vb, ++ int irq, int *dma_notify, ++ isp_vbq_callback_ptr func_ptr); ++ ++int isp_vbq_prepare(struct videobuf_queue *vbq, struct videobuf_buffer *vb, ++ enum v4l2_field field); ++ ++void isp_vbq_release(struct videobuf_queue *vbq, struct videobuf_buffer *vb); ++/* ++ *Sets the callback for the ISP module done events.*/ ++int isp_set_callback(enum isp_callback_type type, isp_callback_t callback, ++ isp_vbq_callback_ptr arg1, void *arg2); ++ ++void omapisp_unset_callback(void); ++ ++/*Clears the callback for the ISP module done events. */ ++int isp_unset_callback(enum isp_callback_type type); ++ ++u32 isp_set_xclk(u32 xclk, u8 xclksel); ++ ++u32 isp_get_xclk(u8 xclksel); ++ ++int isp_request_interface(enum isp_interface_type if_t); ++ ++/* Frees the parallel or serial interface that is passed.*/ ++int isp_free_interface(enum isp_interface_type if_t); ++ ++struct isp_interface_config { ++ /*0 - Parallell 1- CSIA, 2-CSIB to CCDC */ ++ enum isp_interface_type ccdc_par_ser; ++ /*0- Disable, 1 - Enable, first byte->cam_d[7:0],*/ ++ /*2 - Enable, first byte -> cam_d[15:8]*/ ++ u8 par_bridge; ++ /* 0 - Non Inverted, 1- Inverted*/ ++ u8 para_clk_pol; ++ /* 0 - No Shift, 1 -CAMEXT[11:2]->CAM[8:0]*/ ++ /* 2 - [11:4]->[7:0]*/ ++ u8 dataline_shift; ++ /* 0 - HS Falling, 1-HS rising, 2 - VS falling, 3 - VS rising*/ ++ u8 hsvs_syncdetect; ++ /* VD0 Interrupt timing */ ++ u16 vdint0_timing; ++ /* VD1 Interrupt timing */ ++ u16 vdint1_timing; ++ /* Strobe related parameter*/ ++ int strobe; ++ /* PreStrobe related parameter*/ ++ int prestrobe; ++ /* Shutter related parameter*/ ++ int shutter; ++}; ++ ++struct isp_sysc { ++ char reset; ++ char idle_mode; ++}; ++ ++/* sysconfig settings */ ++void isp_power_settings(struct isp_sysc); ++ ++/* Configures the ISP Control interace related parameters.*/ ++int isp_configure_interface(struct isp_interface_config *config); ++ ++void isp_CCDC_VD01_disable(void); ++void isp_CCDC_VD01_enable(void); ++ ++/* Acquires the ISP resource. Initialises the clocks for the first aquire.*/ ++int isp_get(void); ++ ++/* Releases the ISP resource. Releases the clocks also for the last release.*/ ++int isp_put(void); ++ ++/* Set up ISP pipeline */ ++void isp_set_pipeline(int soc_type); ++ ++/* Config ISP pipeline */ ++void isp_config_pipeline(struct v4l2_pix_format *pix_input, ++ struct v4l2_pix_format *pix_output); ++ ++/* Query Control */ ++int isp_queryctrl(struct v4l2_queryctrl *a); ++ ++/* Get Control */ ++int isp_g_ctrl(struct v4l2_control *a); ++ ++/* Set Control */ ++int isp_s_ctrl(struct v4l2_control *a); ++/* Enum format capture for ISP */ ++int isp_enum_fmt_cap(struct v4l2_fmtdesc *f); ++ ++/* try Format capture for ISP */ ++int isp_try_fmt_cap(struct v4l2_pix_format *pix_input, ++ struct v4l2_pix_format *pix_output); ++ ++/* Get format for ISP sub-modules */ ++void isp_g_fmt_cap(struct v4l2_format *f); ++/* Set format for ISP sub-modules */ ++int isp_s_fmt_cap(struct v4l2_pix_format *pix_input, ++ struct v4l2_pix_format *pix_output); ++ ++/* Get Crop capabilities */ ++int isp_g_crop(struct v4l2_crop *a); ++ ++/* Set Crop capabilities */ ++int isp_s_crop(struct v4l2_crop *a, struct v4l2_pix_format *pix); ++ ++/* Config crop */ ++void isp_config_crop(struct v4l2_pix_format *pix); ++ ++/* Try Size for ISP sub-modules */ ++int isp_try_size(struct v4l2_pix_format *pix_input, ++ struct v4l2_pix_format *pix_output); ++ ++/* Try Format for ISP */ ++int isp_try_fmt(struct v4l2_pix_format *pix_input, ++ struct v4l2_pix_format *pix_output); ++ ++#ifdef ENABLE_BT_656_CAPTURE ++/* Configure ISP depending on standard */ ++int isp_configure_std(v4l2_std_id std); ++ ++/* Checks for proper pixel parameters */ ++int isp_check_format(struct v4l2_pix_format *pixfmt); ++#endif ++ ++/*Saves ISP context*/ ++void isp_save_context(struct isp_reg *); ++ ++/*Restores ISP context*/ ++void isp_restore_context(struct isp_reg *); ++ ++/*Saves ISP context*/ ++void isp_save_ctx(void); ++ ++/*Restores ISP context*/ ++void isp_restore_ctx(void); ++ ++ ++void isp_print_status(void); ++ ++ ++ ++#endif /* OMAP_ISP_TOP_H */ +Index: git/drivers/media/video/isp/isp_af.c +=================================================================== +--- /dev/null 1970-01-01 00:00:00.000000000 +0000 ++++ git/drivers/media/video/isp/isp_af.c 2009-02-12 10:29:18.000000000 -0600 +@@ -0,0 +1,829 @@ ++/* ++ * drivers/media/video/isp/isp_af.c ++ * ++ * AF module for TI's OMAP3430 Camera ISP ++ * ++ * Copyright (C) 2008 Texas Instruments. ++ * ++ * This package 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 PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR ++ * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED ++ * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. ++ */ ++ ++/* Linux specific include files */ ++#include <linux/cdev.h> ++#include <linux/device.h> ++#include <linux/delay.h> ++#include <linux/fs.h> ++#include <linux/mm.h> ++#include <linux/module.h> ++#include <linux/platform_device.h> ++#include <asm/cacheflush.h> ++#include <asm/uaccess.h> ++#include <asm/io.h> ++/*#include <asm/arch/io.h>*/ ++ ++/*#include <linux/mm.h>*/ ++#include <linux/mman.h> ++#include <linux/syscalls.h> ++/*#include <linux/module.h>*/ ++#include <linux/errno.h> ++#include <linux/types.h> ++#include <linux/dma-mapping.h> ++/*#include <asm/io.h>*/ ++/*#include <asm/cacheflush.h>*/ ++/*#include <asm/uaccess.h>*/ ++ ++#include "isp.h" ++#include "ispreg.h" ++#include "isph3a.h" ++#include "isp_af.h" ++#include "ispmmu.h" ++#include "../dw9710.h" ++ ++/** ++ * struct isp_af_buffer - AF frame stats buffer. ++ * @virt_addr: Virtual address to mmap the buffer. ++ * @phy_addr: Physical address of the buffer. ++ * @addr_align: Virtual Address 32 bytes aligned. ++ * @ispmmu_addr: Address of the buffer mapped by the ISPMMU. ++ * @mmap_addr: Mapped memory area of buffer. For userspace access. ++ * @locked: 1 - Buffer locked from write. 0 - Buffer can be overwritten. ++ * @frame_num: Frame number from which the statistics are taken. ++ * @lens_position: Lens position currently set in the DW9710 Coil motor driver. ++ * @next: Pointer to link next buffer. ++ */ ++struct isp_af_buffer { ++ unsigned long virt_addr; ++ unsigned long phy_addr; ++ unsigned long addr_align; ++ unsigned long ispmmu_addr; ++ unsigned long mmap_addr; ++ ++ u8 locked; ++ u16 frame_num; ++ struct isp_af_xtrastats xtrastats; ++ struct isp_af_buffer *next; ++}; ++ ++/** ++ * struct isp_af_status - AF status. ++ * @initialized: 1 - Buffers initialized. ++ * @update: 1 - Update registers. ++ * @stats_req: 1 - Future stats requested. ++ * @stats_done: 1 - Stats ready for user. ++ * @frame_req: Number of frame requested for statistics. ++ * @af_buff: Array of statistics buffers to access. ++ * @stats_buf_size: Statistics buffer size. ++ * @min_buf_size: Minimum statisitics buffer size. ++ * @frame_count: Frame Count. ++ * @stats_wait: Wait primitive for locking/unlocking the stats request. ++ * @buffer_lock: Spinlock for statistics buffers access. ++ */ ++static struct isp_af_status { ++ u8 initialized; ++ u8 update; ++ u8 stats_req; ++ u8 stats_done; ++ u16 frame_req; ++ ++ struct isp_af_buffer af_buff[H3A_MAX_BUFF]; ++ unsigned int stats_buf_size; ++ unsigned int min_buf_size; ++ ++ u32 frame_count; ++ wait_queue_head_t stats_wait; ++ spinlock_t buffer_lock; ++} afstat; ++ ++struct af_device *af_dev_configptr; ++static struct isp_af_buffer *active_buff; ++static int af_major = -1; ++static int camnotify; ++ ++ ++/** ++ * isp_af_setxtrastats - Receives extra statistics from prior frames. ++ * @xtrastats: Pointer to structure containing extra statistics fields like ++ * field count and timestamp of frame. ++ * ++ * Called from update_vbq in camera driver ++ **/ ++void isp_af_setxtrastats(struct isp_af_xtrastats *xtrastats, u8 updateflag) ++{ ++ int i, past_i; ++ ++ if (active_buff == NULL) ++ return; ++ ++ for (i = 0; i < H3A_MAX_BUFF; i++) { ++ if (afstat.af_buff[i].frame_num == active_buff->frame_num) ++ break; ++ } ++ ++ if (i == H3A_MAX_BUFF) ++ return; ++ ++ if (i == 0) { ++ if (afstat.af_buff[H3A_MAX_BUFF - 1].locked == 0) ++ past_i = H3A_MAX_BUFF - 1; ++ else ++ past_i = H3A_MAX_BUFF - 2; ++ } else if (i == 1) { ++ if (afstat.af_buff[0].locked == 0) ++ past_i = 0; ++ else ++ past_i = H3A_MAX_BUFF - 1; ++ } else { ++ if (afstat.af_buff[i - 1].locked == 0) ++ past_i = i - 1; ++ else ++ past_i = i - 2; ++ } ++ ++ if (updateflag & AF_UPDATEXS_TS) ++ afstat.af_buff[past_i].xtrastats.ts = xtrastats->ts; ++ ++ if (updateflag & AF_UPDATEXS_FIELDCOUNT) ++ afstat.af_buff[past_i].xtrastats.field_count = ++ xtrastats->field_count; ++} ++EXPORT_SYMBOL(isp_af_setxtrastats); ++ ++/* ++ * Helper function to update buffer cache pages ++ */ ++static void isp_af_update_req_buffer(struct isp_af_buffer *buffer) ++{ ++ int size = afstat.stats_buf_size; ++ ++ size = PAGE_ALIGN(size); ++ /* Update the kernel pages of the requested buffer */ ++ dmac_inv_range((void *)buffer->addr_align, (void *)buffer->addr_align + ++ size); ++} ++ ++/* Function to check paxel parameters */ ++int isp_af_check_paxel(void) ++{ ++ /* Check horizontal Count */ ++ if ((af_dev_configptr->config->paxel_config.hz_cnt ++ < AF_PAXEL_HORIZONTAL_COUNT_MIN) ++ || (af_dev_configptr->config->paxel_config.hz_cnt ++ > AF_PAXEL_HORIZONTAL_COUNT_MAX)) { ++ DPRINTK_ISPH3A("Error : Horizontal Count is incorrect"); ++ return -AF_ERR_HZ_COUNT; ++ } ++ ++ /*Check Vertical Count */ ++ if ((af_dev_configptr->config->paxel_config.vt_cnt ++ < AF_PAXEL_VERTICAL_COUNT_MIN) ++ || (af_dev_configptr->config->paxel_config.vt_cnt ++ > AF_PAXEL_VERTICAL_COUNT_MAX)) { ++ DPRINTK_ISPH3A("Error : Vertical Count is incorrect"); ++ return -AF_ERR_VT_COUNT; ++ } ++ ++ /*Check Height */ ++ if ((af_dev_configptr->config->paxel_config.height ++ < AF_PAXEL_HEIGHT_MIN) ++ || (af_dev_configptr->config->paxel_config.height ++ > AF_PAXEL_HEIGHT_MAX)) { ++ DPRINTK_ISPH3A("Error : Height is incorrect"); ++ return -AF_ERR_HEIGHT; ++ } ++ ++ /*Check width */ ++ if ((af_dev_configptr->config->paxel_config.width < AF_PAXEL_WIDTH_MIN) ++ || (af_dev_configptr->config->paxel_config.width ++ > AF_PAXEL_WIDTH_MAX)) { ++ DPRINTK_ISPH3A("Error : Width is incorrect"); ++ return -AF_ERR_WIDTH; ++ } ++ ++ /*Check Line Increment */ ++ if ((af_dev_configptr->config->paxel_config.line_incr ++ < AF_PAXEL_INCREMENT_MIN) ++ || (af_dev_configptr->config->paxel_config.line_incr ++ > AF_PAXEL_INCREMENT_MAX)) { ++ DPRINTK_ISPH3A("Error : Line Increment is incorrect"); ++ return -AF_ERR_INCR; ++ } ++ ++ /*Check Horizontal Start */ ++ if ((af_dev_configptr->config->paxel_config.hz_start % 2 != 0) ++ || (af_dev_configptr->config->paxel_config.hz_start ++ < (af_dev_configptr->config->iir_config.hz_start_pos + 2)) ++ || (af_dev_configptr->config->paxel_config.hz_start ++ > AF_PAXEL_HZSTART_MAX) ++ || (af_dev_configptr->config->paxel_config.hz_start ++ < AF_PAXEL_HZSTART_MIN)) { ++ DPRINTK_ISPH3A("Error : Horizontal Start is incorrect"); ++ return -AF_ERR_HZ_START; ++ } ++ ++ /*Check Vertical Start */ ++ if ((af_dev_configptr->config->paxel_config.vt_start ++ < AF_PAXEL_VTSTART_MIN) ++ || (af_dev_configptr->config->paxel_config.vt_start ++ > AF_PAXEL_VTSTART_MAX)) { ++ DPRINTK_ISPH3A("Error : Vertical Start is incorrect"); ++ return -AF_ERR_VT_START; ++ } ++ return 0; /*Success */ ++} ++ ++/** ++ * isp_af_check_iir - Function to check IIR Coefficient. ++ **/ ++int isp_af_check_iir(void) ++{ ++ int index; ++ ++ for (index = 0; index < AF_NUMBER_OF_COEF; index++) { ++ if ((af_dev_configptr->config->iir_config.coeff_set0[index]) ++ > AF_COEF_MAX) { ++ DPRINTK_ISPH3A( ++ "Error : Coefficient for set 0 is incorrect"); ++ return -AF_ERR_IIR_COEF; ++ } ++ ++ if ((af_dev_configptr->config->iir_config.coeff_set1[index]) ++ > AF_COEF_MAX) { ++ DPRINTK_ISPH3A( ++ "Error : Coefficient for set 1 is incorrect"); ++ return -AF_ERR_IIR_COEF; ++ } ++ } ++ ++ if ((af_dev_configptr->config->iir_config.hz_start_pos < AF_IIRSH_MIN) ++ || (af_dev_configptr->config->iir_config.hz_start_pos > ++ AF_IIRSH_MAX)) { ++ DPRINTK_ISPH3A("Error : IIRSH is incorrect"); ++ return -AF_ERR_IIRSH; ++ } ++ ++ return 0; ++} ++/** ++ * isp_af_unlock_buffers - Helper function to unlock all buffers. ++ **/ ++static void isp_af_unlock_buffers(void) ++{ ++ int i; ++ unsigned long irqflags; ++ ++ spin_lock_irqsave(&afstat.buffer_lock, irqflags); ++ for (i = 0; i < H3A_MAX_BUFF; i++) ++ afstat.af_buff[i].locked = 0; ++ ++ spin_unlock_irqrestore(&afstat.buffer_lock, irqflags); ++} ++ ++/* ++ * Helper function to link allocated buffers ++ */ ++static void isp_af_link_buffers(void) ++{ ++ int i; ++ ++ for (i = 0; i < H3A_MAX_BUFF; i++) { ++ if ((i + 1) < H3A_MAX_BUFF) ++ afstat.af_buff[i].next = &afstat.af_buff[i + 1]; ++ else ++ afstat.af_buff[i].next = &afstat.af_buff[0]; ++ } ++} ++ ++/* ++ * Helper function to munmap kernel buffers from user space. ++ */ ++static int isp_af_munmap(struct isp_af_buffer *buffer) ++{ ++ /* TO DO: munmap succesfully the kernel buffers, so they can be ++ remmaped again */ ++ buffer->mmap_addr = 0; ++ return 0; ++} ++ ++/* ++ * Helper function to mmap buffers to user space. ++ * buffer passed need to already have a valid physical address: buffer->phy_addr ++ * It returns user pointer as unsigned long in buffer->mmap_addr ++ */ ++static int isp_af_mmap_buffers(struct isp_af_buffer *buffer) ++{ ++ struct vm_area_struct vma; ++ struct mm_struct *mm = current->mm; ++ int size = afstat.stats_buf_size; ++ unsigned long addr = 0; ++ unsigned long pgoff = 0, flags = MAP_SHARED | MAP_ANONYMOUS; ++ unsigned long prot = PROT_READ | PROT_WRITE; ++ void *pos = (void *)buffer->addr_align; ++ ++ size = PAGE_ALIGN(size); ++ ++ addr = get_unmapped_area(NULL, addr, size, pgoff, flags); ++ vma.vm_mm = mm; ++ vma.vm_start = addr; ++ vma.vm_end = addr + size; ++ vma.vm_flags = calc_vm_prot_bits(prot) | calc_vm_flag_bits(flags); ++ vma.vm_pgoff = pgoff; ++ vma.vm_file = NULL; ++ vma.vm_page_prot = protection_map[vma.vm_flags]; ++ ++ while (size > 0) { ++ if (vm_insert_page(&vma, addr, vmalloc_to_page(pos))) ++ return -EAGAIN; ++ addr += PAGE_SIZE; ++ pos += PAGE_SIZE; ++ size -= PAGE_SIZE; ++ } ++ ++ buffer->mmap_addr = vma.vm_start; ++ return 0; ++} ++ ++/* Function to perform hardware set up */ ++int isp_af_configure(struct af_configuration *afconfig) ++{ ++ int result; ++ int buff_size, i; ++ unsigned int busyaf; ++ ++ if (NULL == afconfig) { ++ printk(KERN_ERR "Null argument in configuration. \n"); ++ return -EINVAL; ++ } ++ ++ af_dev_configptr->config = afconfig; ++ /* Get the value of PCR register */ ++ busyaf = omap_readl(ISPH3A_PCR); ++ ++ if ((busyaf & AF_BUSYAF) == AF_BUSYAF) { ++ DPRINTK_ISPH3A("AF_register_setup_ERROR : Engine Busy"); ++ DPRINTK_ISPH3A("\n Configuration cannot be done "); ++ return -AF_ERR_ENGINE_BUSY; ++ } ++ ++ /*Check IIR Coefficient and start Values */ ++ result = isp_af_check_iir(); ++ if (result < 0) ++ return result; ++ ++ /*Check Paxel Values */ ++ result = isp_af_check_paxel(); ++ if (result < 0) ++ return result; ++ ++ /*Check HMF Threshold Values */ ++ if (af_dev_configptr->config->hmf_config.threshold > AF_THRESHOLD_MAX) { ++ DPRINTK_ISPH3A("Error : HMF Threshold is incorrect"); ++ return -AF_ERR_THRESHOLD; ++ } ++ ++ /* Compute buffer size */ ++ buff_size = ++ (af_dev_configptr->config->paxel_config.hz_cnt + 1) * ++ (af_dev_configptr->config->paxel_config.vt_cnt + 1) * AF_PAXEL_SIZE; ++ ++ /*Deallocate the previous buffers */ ++ if (afstat.stats_buf_size && (buff_size > afstat.stats_buf_size)) { ++ isp_af_enable(0); ++ for (i = 0; i < H3A_MAX_BUFF; i++) { ++ isp_af_munmap(&afstat.af_buff[i]); ++ ispmmu_unmap(afstat.af_buff[i].ispmmu_addr); ++ dma_free_coherent(NULL, ++ afstat.min_buf_size + 64, ++ (void *)afstat.af_buff[i].virt_addr, ++ (dma_addr_t)afstat.af_buff[i].phy_addr); ++ afstat.af_buff[i].virt_addr = 0; ++ } ++ afstat.stats_buf_size = 0; ++ } ++ ++ if (!afstat.af_buff[0].virt_addr) { ++ afstat.stats_buf_size = buff_size; ++ afstat.min_buf_size = PAGE_ALIGN(afstat.stats_buf_size); ++ ++ for (i = 0; i < H3A_MAX_BUFF; i++) { ++ afstat.af_buff[i].virt_addr = ++ (unsigned long)dma_alloc_coherent(NULL, ++ afstat.min_buf_size, ++ (dma_addr_t *) ++ &afstat.af_buff[i].phy_addr, ++ GFP_KERNEL | GFP_DMA); ++ if (afstat.af_buff[i].virt_addr == 0) { ++ printk(KERN_ERR "Can't acquire memory for " ++ "buffer[%d]\n", i); ++ return -ENOMEM; ++ } ++ afstat.af_buff[i].addr_align = ++ afstat.af_buff[i].virt_addr; ++ while ((afstat.af_buff[i].addr_align & 0xFFFFFFC0) != ++ afstat.af_buff[i].addr_align) ++ afstat.af_buff[i].addr_align++; ++ afstat.af_buff[i].ispmmu_addr = ++ ispmmu_map(afstat.af_buff[i].phy_addr, ++ afstat.min_buf_size); ++ } ++ isp_af_unlock_buffers(); ++ isp_af_link_buffers(); ++ ++ /* First active buffer */ ++ if (active_buff == NULL) ++ active_buff = &afstat.af_buff[0]; ++ isp_af_set_address(active_buff->ispmmu_addr); ++ } ++ /* Always remap when calling Configure */ ++ for (i = 0; i < H3A_MAX_BUFF; i++) { ++ if (afstat.af_buff[i].mmap_addr) ++ isp_af_munmap(&afstat.af_buff[i]); ++ isp_af_mmap_buffers(&afstat.af_buff[i]); ++ } ++ ++ result = isp_af_register_setup(af_dev_configptr); ++ if (result < 0) ++ return result; ++ af_dev_configptr->size_paxel = buff_size; ++ afstat.initialized = 1; ++ /*Set configuration flag to indicate HW setup done */ ++ if (af_dev_configptr->config->af_config) ++ isp_af_enable(1); ++ else ++ isp_af_enable(0); ++ ++ /*Success */ ++ return 0; ++} ++EXPORT_SYMBOL(isp_af_configure); ++ ++int isp_af_register_setup(struct af_device *af_dev) ++{ ++ unsigned int pcr = 0, pax1 = 0, pax2 = 0, paxstart = 0; ++ unsigned int coef = 0; ++ unsigned int base_coef_set0 = 0; ++ unsigned int base_coef_set1 = 0; ++ int index; ++ ++ ++ /* Configure Hardware Registers */ ++ /* Set PCR Register */ ++ pcr = omap_readl(ISPH3A_PCR); /* Read PCR Register */ ++ ++ /*Set Accumulator Mode */ ++ if (af_dev->config->mode == ACCUMULATOR_PEAK) ++ pcr |= FVMODE; ++ else ++ pcr &= ~FVMODE; ++ ++ /*Set A-law */ ++ if (af_dev->config->alaw_enable == H3A_AF_ALAW_ENABLE) ++ pcr |= AF_ALAW_EN; ++ else ++ pcr &= ~AF_ALAW_EN; ++ ++ /*Set RGB Position */ ++ pcr &= ~RGBPOS; ++ pcr |= (af_dev->config->rgb_pos) << AF_RGBPOS_SHIFT; ++ ++ /*HMF Configurations */ ++ if (af_dev->config->hmf_config.enable == H3A_AF_HMF_ENABLE) { ++ pcr &= ~AF_MED_EN; ++ /* Enable HMF */ ++ pcr |= AF_MED_EN; ++ ++ /* Set Median Threshold */ ++ pcr &= ~MED_TH; ++ pcr |= ++ (af_dev->config->hmf_config.threshold) << AF_MED_TH_SHIFT; ++ } else ++ pcr &= ~AF_MED_EN; ++ ++ omap_writel(pcr, ISPH3A_PCR); ++ ++ pax1 &= ~PAXW; ++ pax1 |= (af_dev->config->paxel_config.width) << AF_PAXW_SHIFT; ++ ++ /* Set height in AFPAX1 */ ++ pax1 &= ~PAXH; ++ pax1 |= af_dev->config->paxel_config.height; ++ ++ omap_writel(pax1, ISPH3A_AFPAX1); ++ ++ /* Configure AFPAX2 Register */ ++ /* Set Line Increment in AFPAX2 Register */ ++ pax2 &= ~AFINCV; ++ pax2 |= (af_dev->config->paxel_config.line_incr) << AF_LINE_INCR_SHIFT; ++ /* Set Vertical Count */ ++ pax2 &= ~PAXVC; ++ pax2 |= (af_dev->config->paxel_config.vt_cnt) << AF_VT_COUNT_SHIFT; ++ /* Set Horizontal Count */ ++ pax2 &= ~PAXHC; ++ pax2 |= af_dev->config->paxel_config.hz_cnt; ++ omap_writel(pax2, ISPH3A_AFPAX2); ++ ++ /* Configure PAXSTART Register */ ++ /*Configure Horizontal Start */ ++ paxstart &= ~PAXSH; ++ paxstart |= ++ (af_dev->config->paxel_config.hz_start) << AF_HZ_START_SHIFT; ++ /* Configure Vertical Start */ ++ paxstart &= ~PAXSV; ++ paxstart |= af_dev->config->paxel_config.vt_start; ++ omap_writel(paxstart, ISPH3A_AFPAXSTART); ++ ++ /*SetIIRSH Register */ ++ omap_writel(af_dev->config->iir_config.hz_start_pos, ISPH3A_AFIIRSH); ++ ++ /*Set IIR Filter0 Coefficients */ ++ base_coef_set0 = ISPH3A_AFCOEF010; ++ for (index = 0; index <= 8; index += 2) { ++ coef &= ~COEF_MASK0; ++ coef |= af_dev->config->iir_config.coeff_set0[index]; ++ coef &= ~COEF_MASK1; ++ coef |= ++ (af_dev->config->iir_config. ++ coeff_set0[index + 1]) << AF_COEF_SHIFT; ++ omap_writel(coef, base_coef_set0); ++ ++ base_coef_set0 = base_coef_set0 + AFCOEF_OFFSET; ++ } ++ ++ /* set AFCOEF0010 Register */ ++ omap_writel(af_dev->config->iir_config.coeff_set0[10], ++ ISPH3A_AFCOEF010); ++ ++ /*Set IIR Filter1 Coefficients */ ++ ++ base_coef_set1 = ISPH3A_AFCOEF110; ++ for (index = 0; index <= 8; index += 2) { ++ coef &= ~COEF_MASK0; ++ coef |= af_dev->config->iir_config.coeff_set1[index]; ++ coef &= ~COEF_MASK1; ++ coef |= ++ (af_dev->config->iir_config. ++ coeff_set1[index + 1]) << AF_COEF_SHIFT; ++ omap_writel(coef, base_coef_set1); ++ ++ base_coef_set1 = base_coef_set1 + AFCOEF_OFFSET; ++ } ++ omap_writel(af_dev->config->iir_config.coeff_set1[10], ++ ISPH3A_AFCOEF1010); ++ ++ return 0; ++} ++ ++/* Function to set address */ ++void isp_af_set_address(unsigned long address) ++{ ++ omap_writel(address, ISPH3A_AFBUFST); ++} ++ ++static int isp_af_stats_available(struct isp_af_data *afdata) ++{ ++ int i; ++ unsigned long irqflags; ++ ++ spin_lock_irqsave(&afstat.buffer_lock, irqflags); ++ for (i = 0; i < H3A_MAX_BUFF; i++) { ++ if ((afdata->frame_number == afstat.af_buff[i].frame_num) ++ && (afstat.af_buff[i].frame_num != ++ active_buff->frame_num)) { ++ afstat.af_buff[i].locked = 1; ++ spin_unlock_irqrestore(&afstat.buffer_lock, irqflags); ++ isp_af_update_req_buffer(&afstat.af_buff[i]); ++ afstat.af_buff[i].frame_num = 0; ++ afdata->af_statistics_buf = (void *) ++ afstat.af_buff[i].mmap_addr; ++ afdata->xtrastats.ts = afstat.af_buff[i].xtrastats.ts; ++ afdata->xtrastats.field_count = ++ afstat.af_buff[i].xtrastats.field_count; ++ afdata->xtrastats.lens_position = ++ afstat.af_buff[i].xtrastats.lens_position; ++ return 0; ++ } ++ } ++ spin_unlock_irqrestore(&afstat.buffer_lock, irqflags); ++ /* Stats unavailable */ ++ ++ afdata->af_statistics_buf = NULL; ++ return -1; ++} ++ ++void isp_af_notify(int notify) ++{ ++ camnotify = notify; ++ if (camnotify && afstat.initialized) { ++ printk(KERN_DEBUG "Warning Camera Off \n"); ++ afstat.stats_req = 0; ++ afstat.stats_done = 1; ++ wake_up_interruptible(&afstat.stats_wait); ++ } ++} ++EXPORT_SYMBOL(isp_af_notify); ++/* ++ * This API allows the user to update White Balance gains, as well as ++ * exposure time and analog gain. It is also used to request frame ++ * statistics. ++ */ ++int isp_af_request_statistics(struct isp_af_data *afdata) ++{ ++ int ret = 0; ++ u16 frame_diff = 0; ++ u16 frame_cnt = afstat.frame_count; ++ wait_queue_t wqt; ++ ++ if (!af_dev_configptr->config->af_config) { ++ printk(KERN_ERR "AF engine not enabled\n"); ++ return -EINVAL; ++ } ++ afdata->af_statistics_buf = NULL; ++ ++ if (afdata->update != 0) { ++ if (afdata->update & REQUEST_STATISTICS) { ++ isp_af_unlock_buffers(); ++ /* Stats available? */ ++ DPRINTK_ISPH3A("Stats available?\n"); ++ ret = isp_af_stats_available(afdata); ++ if (!ret) ++ goto out; ++ ++ /* Stats in near future? */ ++ DPRINTK_ISPH3A("Stats in near future?\n"); ++ if (afdata->frame_number > frame_cnt) { ++ frame_diff = afdata->frame_number - frame_cnt; ++ } else if (afdata->frame_number < frame_cnt) { ++ if ((frame_cnt > ++ (MAX_FRAME_COUNT - MAX_FUTURE_FRAMES)) ++ && (afdata->frame_number ++ < MAX_FRAME_COUNT)) ++ frame_diff = afdata->frame_number ++ + MAX_FRAME_COUNT ++ - frame_cnt; ++ else { ++ /* Frame unavailable */ ++ frame_diff = MAX_FUTURE_FRAMES + 1; ++ afdata->af_statistics_buf = NULL; ++ } ++ } ++ ++ if (frame_diff > MAX_FUTURE_FRAMES) { ++ printk(KERN_ERR "Invalid frame requested\n"); ++ } else if (!camnotify) { ++ /* Block until frame in near future completes */ ++ afstat.frame_req = afdata->frame_number; ++ afstat.stats_req = 1; ++ afstat.stats_done = 0; ++ init_waitqueue_entry(&wqt, current); ++ ret = ++ wait_event_interruptible(afstat.stats_wait, ++ afstat.stats_done == 1); ++ if (ret < 0) ++ return ret; ++ DPRINTK_ISPH3A("ISP AF request status" ++ " interrupt raised\n"); ++ ++ /* Stats now available */ ++ ret = isp_af_stats_available(afdata); ++ if (ret) { ++ printk(KERN_ERR "After waiting for" ++ " stats, stats not available!!" ++ "\n"); ++ } ++ } ++ } ++ } ++ ++out: ++ afdata->curr_frame = afstat.frame_count; ++ ++ return 0; ++} ++EXPORT_SYMBOL(isp_af_request_statistics); ++ ++/* This function will handle the H3A interrupt. */ ++static void isp_af_isr(unsigned long status, isp_vbq_callback_ptr arg1, ++ void *arg2) ++{ ++ u16 frame_align; ++ ++ if ((H3A_AF_DONE & status) != H3A_AF_DONE) ++ return; ++ ++ /* Exchange buffers */ ++ active_buff = active_buff->next; ++ if (active_buff->locked == 1) ++ active_buff = active_buff->next; ++ isp_af_set_address(active_buff->ispmmu_addr); ++ ++ /* Update frame counter */ ++ afstat.frame_count++; ++ frame_align = afstat.frame_count; ++ if (afstat.frame_count > MAX_FRAME_COUNT) { ++ afstat.frame_count = 1; ++ frame_align++; ++ } ++ active_buff->frame_num = afstat.frame_count; ++ ++ dw9710_af_getfocus_cached(&active_buff->xtrastats.lens_position); ++ /* Future Stats requested? */ ++ if (afstat.stats_req) { ++ /* Is the frame we want already done? */ ++ if (frame_align >= (afstat.frame_req + 1)) { ++ afstat.stats_req = 0; ++ afstat.stats_done = 1; ++ wake_up_interruptible(&afstat.stats_wait); ++ } ++ } ++} ++ ++/* Function to Enable/Disable AF Engine */ ++int isp_af_enable(int enable) ++{ ++ unsigned int pcr; ++ ++ pcr = omap_readl(ISPH3A_PCR); ++ ++ /* Set AF_EN bit in PCR Register */ ++ if (enable) { ++ if (isp_set_callback(CBK_H3A_AF_DONE, isp_af_isr, ++ (void *)NULL, (void *)NULL)) { ++ printk(KERN_ERR "No callback for AF\n"); ++ return -EINVAL; ++ } ++ ++ pcr |= AF_EN; ++ } else { ++ isp_unset_callback(CBK_H3A_AF_DONE); ++ pcr &= ~AF_EN; ++ } ++ mdelay(100); ++ omap_writel(pcr, ISPH3A_PCR); ++ return 0; ++} ++ ++/* Function to register the AF character device driver. */ ++int __init isp_af_init(void) ++{ ++ /*allocate memory for device structure and initialize it with 0 */ ++ af_dev_configptr = kzalloc(sizeof(struct af_device), GFP_KERNEL); ++ if (!af_dev_configptr) ++ goto err_nomem1; ++ ++ active_buff = NULL; ++ ++ af_dev_configptr->config = (struct af_configuration *) ++ kzalloc(sizeof(struct af_configuration), GFP_KERNEL); ++ ++ if (af_dev_configptr->config == NULL) ++ goto err_nomem2; ++ ++ printk(KERN_DEBUG "isp_af_init\n"); ++ memset(&afstat, 0, sizeof(afstat)); ++ ++ init_waitqueue_head(&afstat.stats_wait); ++ spin_lock_init(&afstat.buffer_lock); ++ ++ return 0; ++ ++err_nomem2: ++ kfree(af_dev_configptr); ++err_nomem1: ++ printk(KERN_ERR "Error: kmalloc fail"); ++ return -ENOMEM; ++} ++ ++void __exit isp_af_exit(void) ++{ ++ int i; ++ ++ if (afstat.af_buff) { ++ /* Free buffers */ ++ for (i = 0; i < H3A_MAX_BUFF; i++) { ++ ispmmu_unmap(afstat.af_buff[i].ispmmu_addr); ++ dma_free_coherent(NULL, ++ afstat.min_buf_size + 64, ++ (void *)afstat.af_buff[i].virt_addr, ++ (dma_addr_t)afstat.af_buff[i].phy_addr); ++ } ++ } ++ kfree(af_dev_configptr->config); ++ kfree(af_dev_configptr); ++ ++ memset(&afstat, 0, sizeof(afstat)); ++ ++ af_major = -1; ++ isp_af_enable(0); ++} ++ ++module_init(isp_af_init) ++module_exit(isp_af_exit) ++ ++MODULE_AUTHOR("Texas Instruments"); ++MODULE_DESCRIPTION("AF ISP Module"); ++MODULE_LICENSE("GPL"); +Index: git/drivers/media/video/isp/isp_af.h +=================================================================== +--- /dev/null 1970-01-01 00:00:00.000000000 +0000 ++++ git/drivers/media/video/isp/isp_af.h 2009-02-12 16:32:13.000000000 -0600 +@@ -0,0 +1,258 @@ ++/* ++ * drivers/media/video/isp/isp_af.h ++ * ++ * Include file for AF module in TI's OMAP3430 Camera ISP ++ * ++ * Copyright (C) 2008 Texas Instruments, Inc. ++ * ++ * This package 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 PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR ++ * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED ++ * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. ++ */ ++ ++/* Device Constants */ ++#ifndef OMAP_ISP_AF_H ++#define OMAP_ISP_AF_H ++ ++#define AF_MAJOR_NUMBER 0 ++#define ISPAF_NAME "OMAPISP_AF" ++#define AF_NR_DEVS 1 ++#define AF_TIMEOUT (300 * HZ) / 1000 ++ ++ ++/* Range Constants */ ++#define AF_IIRSH_MIN 0 ++#define AF_IIRSH_MAX 4094 ++#define AF_PAXEL_HORIZONTAL_COUNT_MIN 0 ++#define AF_PAXEL_HORIZONTAL_COUNT_MAX 35 ++#define AF_PAXEL_VERTICAL_COUNT_MIN 0 ++#define AF_PAXEL_VERTICAL_COUNT_MAX 127 ++#define AF_PAXEL_INCREMENT_MIN 0 ++#define AF_PAXEL_INCREMENT_MAX 14 ++#define AF_PAXEL_HEIGHT_MIN 0 ++#define AF_PAXEL_HEIGHT_MAX 127 ++#define AF_PAXEL_WIDTH_MIN 0 ++#define AF_PAXEL_WIDTH_MAX 127 ++#define AF_PAXEL_HZSTART_MIN 2 ++#define AF_PAXEL_HZSTART_MAX 4094 ++ ++#define AF_PAXEL_VTSTART_MIN 0 ++#define AF_PAXEL_VTSTART_MAX 4095 ++#define AF_THRESHOLD_MAX 255 ++#define AF_COEF_MAX 4095 ++#define AF_PAXEL_SIZE 48 ++ ++/* Print Macros */ ++/*list of error code */ ++#define AF_ERR_HZ_COUNT 800 /* Invalid Horizontal Count */ ++#define AF_ERR_VT_COUNT 801 /* Invalid Vertical Count */ ++#define AF_ERR_HEIGHT 802 /* Invalid Height */ ++#define AF_ERR_WIDTH 803 /* Invalid width */ ++#define AF_ERR_INCR 804 /* Invalid Increment */ ++#define AF_ERR_HZ_START 805 /* Invalid horizontal Start */ ++#define AF_ERR_VT_START 806 /* Invalud vertical Start */ ++#define AF_ERR_IIRSH 807 /* Invalid IIRSH value */ ++#define AF_ERR_IIR_COEF 808 /* Invalid Coefficient */ ++#define AF_ERR_SETUP 809 /* Setup not done */ ++#define AF_ERR_THRESHOLD 810 /* Invalid Threshold */ ++#define AF_ERR_ENGINE_BUSY 811 /* Engine is busy */ ++#define AF_NUMBER_OF_COEF 11 ++/* list of ioctls */ ++#pragma pack(1) ++ ++#pragma pack() ++#define AFPID 0x0 /* Peripheral Revision ++ * and Class Information ++ */ ++ ++#define AFCOEF_OFFSET 0x00000004 /* COEFFICIENT BASE ++ * ADDRESS ++ */ ++ ++/* ++ * PCR fields ++ */ ++#define AF_BUSYAF (1 << 15) ++#define FVMODE (1 << 14) ++#define RGBPOS (0x7 << 11) ++#define MED_TH (0xFF << 3) ++#define AF_MED_EN (1 << 2) ++#define AF_ALAW_EN (1 << 1) ++#define AF_EN (1 << 0) ++ ++/* ++ * AFPAX1 fields ++ */ ++#define PAXW (0x7F << 16) ++#define PAXH 0x7F ++ ++/* ++ * AFPAX2 fields ++ */ ++#define AFINCV (0xF << 13) ++#define PAXVC (0x7F << 6) ++#define PAXHC 0x3F ++ ++/* ++ * AFPAXSTART fields ++ */ ++#define PAXSH (0xFFF<<16) ++#define PAXSV 0xFFF ++ ++/* ++ * COEFFICIENT MASK ++ */ ++ ++#define COEF_MASK0 0xFFF ++#define COEF_MASK1 (0xFFF<<16) ++ ++/* BIT SHIFTS */ ++#define AF_RGBPOS_SHIFT 11 ++#define AF_MED_TH_SHIFT 3 ++#define AF_PAXW_SHIFT 16 ++#define AF_LINE_INCR_SHIFT 13 ++#define AF_VT_COUNT_SHIFT 6 ++#define AF_HZ_START_SHIFT 16 ++#define AF_COEF_SHIFT 16 ++ ++/* Flags for update field */ ++#define REQUEST_STATISTICS (1 << 0) ++#define LENS_DESIRED_POSITION (1 << 1) ++#define LENS_CURRENT_POSITION (1 << 2) ++ ++#define AF_UPDATEXS_TS (1 << 0) ++#define AF_UPDATEXS_FIELDCOUNT (1 << 1) ++#define AF_UPDATEXS_LENSPOS (1 << 2) ++ ++/** ++ * struct isp_af_xtrastats - Extra statistics related to AF generated stats. ++ * @ts: Timestamp when the frame gets delivered to the user. ++ * @field_count: Field count of the frame delivered to the user. ++ * @lens_position: Lens position when the stats are being generated. ++ */ ++struct isp_af_xtrastats { ++ struct timeval ts; ++ unsigned long field_count; ++ u16 lens_position; ++}; ++ ++/** ++ * struct isp_af_data - AF statistics data to transfer between driver and user. ++ * @af_statistics_buf: Pointer to pass to user. ++ * @lens_current_position: Read value of lens absolute position. ++ * @desired_lens_direction: Lens desired location. ++ * @update: Bitwise flags to update parameters. ++ * @frame_number: Data for which frame is desired/given. ++ * @curr_frame: Current frame number being processed by AF module. ++ * @xtrastats: Extra statistics structure. ++ */ ++struct isp_af_data { ++ void *af_statistics_buf; ++ u16 lens_current_position; ++ u16 desired_lens_direction; ++ u16 update; ++ u16 frame_number; ++ u16 curr_frame; ++ struct isp_af_xtrastats xtrastats; ++}; ++ ++/* enum used for status of specific feature */ ++enum af_alaw_enable { ++ H3A_AF_ALAW_DISABLE = 0, ++ H3A_AF_ALAW_ENABLE = 1 ++}; ++ ++enum af_hmf_enable { ++ H3A_AF_HMF_DISABLE = 0, ++ H3A_AF_HMF_ENABLE = 1 ++}; ++ ++enum af_config_flag { ++ H3A_AF_CFG_DISABLE = 0, ++ H3A_AF_CFG_ENABLE = 1 ++}; ++ ++enum af_mode { ++ ACCUMULATOR_SUMMED = 0, ++ ACCUMULATOR_PEAK = 1 ++}; ++ ++/* Red, Green, and blue pixel location in the AF windows */ ++enum rgbpos { ++ GR_GB_BAYER = 0, /* GR and GB as Bayer pattern */ ++ RG_GB_BAYER = 1, /* RG and GB as Bayer pattern */ ++ GR_BG_BAYER = 2, /* GR and BG as Bayer pattern */ ++ RG_BG_BAYER = 3, /* RG and BG as Bayer pattern */ ++ GG_RB_CUSTOM = 4, /* GG and RB as custom pattern */ ++ RB_GG_CUSTOM = 5 /* RB and GG as custom pattern */ ++}; ++ ++/* Contains the information regarding the Horizontal Median Filter */ ++struct af_hmf { ++ enum af_hmf_enable enable; /* Status of Horizontal Median Filter */ ++ unsigned int threshold; /* Threshhold Value for Horizontal Median ++ * Filter ++ */ ++}; ++ ++/* Contains the information regarding the IIR Filters */ ++struct af_iir { ++ unsigned int hz_start_pos; /* IIR Start Register Value */ ++ int coeff_set0[AF_NUMBER_OF_COEF]; /* ++ * IIR Filter Coefficient for ++ * Set 0 ++ */ ++ int coeff_set1[AF_NUMBER_OF_COEF]; /* ++ * IIR Filter Coefficient for ++ * Set 1 ++ */ ++}; ++ ++/* Contains the information regarding the Paxels Structure in AF Engine */ ++struct af_paxel { ++ unsigned int width; /* Width of the Paxel */ ++ unsigned int height; /* Height of the Paxel */ ++ unsigned int hz_start; /* Horizontal Start Position */ ++ unsigned int vt_start; /* Vertical Start Position */ ++ unsigned int hz_cnt; /* Horizontal Count */ ++ unsigned int vt_cnt; /* vertical Count */ ++ unsigned int line_incr; /* Line Increment */ ++}; ++/* Contains the parameters required for hardware set up of AF Engine */ ++struct af_configuration { ++ enum af_alaw_enable alaw_enable; /*ALWAW status */ ++ struct af_hmf hmf_config; /*HMF configurations */ ++ enum rgbpos rgb_pos; /*RGB Positions */ ++ struct af_iir iir_config; /*IIR filter configurations */ ++ struct af_paxel paxel_config; /*Paxel parameters */ ++ enum af_mode mode; /*Accumulator mode */ ++ enum af_config_flag af_config; /*Flag indicates Engine is configured */ ++}; ++ ++/* Structure for device of AF Engine */ ++struct af_device { ++ struct af_configuration *config; /*Device configuration structure */ ++ int size_paxel; /*Paxel size in bytes */ ++}; ++ ++int isp_af_check_paxel(void); ++int isp_af_check_iir(void); ++int isp_af_register_setup(struct af_device *af_dev); ++int isp_af_enable(int); ++void isp_af_notify(int notify); ++ ++#include <linux/autoconf.h> ++#ifdef CONFIG_VIDEO_OMAP34XX_ISP_PREVIEWER ++int isp_af_request_statistics(struct isp_af_data *afdata); ++int isp_af_configure(struct af_configuration *afconfig); ++#else ++static inline int isp_af_request_statistics(struct isp_af_data *afdata){return 0;} ++static inline int isp_af_configure(struct af_configuration *afconfig){return 0;} ++#endif ++void isp_af_set_address(unsigned long); ++void isp_af_setxtrastats(struct isp_af_xtrastats *xtrastats, u8 updateflag); ++#endif /* OMAP_ISP_AF_H */ +Index: git/drivers/media/video/isp/ispccdc.c +=================================================================== +--- /dev/null 1970-01-01 00:00:00.000000000 +0000 ++++ git/drivers/media/video/isp/ispccdc.c 2009-02-12 11:39:19.000000000 -0600 +@@ -0,0 +1,1631 @@ ++/* ++ * drivers/media/video/isp/ispccdc.c ++ * ++ * Driver Library for CCDC module in TI's OMAP3430 Camera ISP ++ * ++ * Copyright (C) 2008 Texas Instruments, Inc. ++ * ++ * This package 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 PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR ++ * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED ++ * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. ++ */ ++ ++#include <linux/module.h> ++#include <linux/errno.h> ++#include <linux/sched.h> ++#include <linux/delay.h> ++#include <linux/types.h> ++#include <asm/mach-types.h> ++#include <asm/io.h> ++#include <asm/scatterlist.h> ++#include <asm/uaccess.h> ++ ++#include "isp.h" ++#include "ispreg.h" ++#include "ispccdc.h" ++#ifndef CONFIG_ARCH_OMAP3410 ++#include "isppreview.h" ++#endif ++#include "ispmmu.h" ++ ++#ifndef CONFIG_ARCH_OMAP3410 ++#define USE_ISP_LSC ++#else ++#undef USE_ISP_LSC ++#endif ++ ++static u32 *fpc_table_add; ++static unsigned long fpc_table_add_m; ++ ++/* ++ * Structure for the CCDC module to store its own information. ++ */ ++static struct isp_ccdc { ++ u8 ccdc_inuse; ++ u32 ccdcout_w; ++ u32 ccdcout_h; ++ u32 ccdcin_w; ++ u32 ccdcin_h; ++ u32 ccdcin_woffset; ++ u32 ccdcin_hoffset; ++ u32 crop_w; ++ u32 crop_h; ++ u8 ccdc_inpfmt; ++ u8 ccdc_outfmt; ++ u8 vpout_en; ++ u8 wen; ++ u8 exwen; ++ u8 refmt_en; ++ u8 ccdcslave; ++ u8 syncif_ipmod; ++ u8 obclamp_en; ++ u8 lsc_en; ++ struct semaphore semlock; ++} ispccdc_obj; ++ ++#ifdef USE_ISP_LSC ++ static struct ispccdc_lsc_config lsc_config; ++ static u8 *lsc_gain_table; ++ static unsigned long lsc_ispmmu_addr; ++ static int lsc_initialized; ++ static int size_mismatch; ++ static u8 ccdc_use_lsc; ++ static u8 ispccdc_lsc_tbl[] = { ++ #include "ispccd_lsc.dat" ++ }; ++#endif ++ ++/* Structure for saving/restoring CCDC module registers*/ ++static struct isp_reg ispccdc_reg_list[] = { ++ {ISPCCDC_SYN_MODE, 0x0000}, ++ {ISPCCDC_HD_VD_WID, 0x0000}, ++ {ISPCCDC_PIX_LINES, 0x0000}, ++ {ISPCCDC_HORZ_INFO, 0x0000}, ++ {ISPCCDC_VERT_START, 0x0000}, ++ {ISPCCDC_VERT_LINES, 0x0000}, ++ {ISPCCDC_CULLING, 0x0000}, ++ {ISPCCDC_HSIZE_OFF, 0x0000}, ++ {ISPCCDC_SDOFST, 0x0000}, ++ {ISPCCDC_SDR_ADDR, 0x0000}, ++ {ISPCCDC_CLAMP, 0x0000}, ++ {ISPCCDC_DCSUB, 0x0000}, ++ {ISPCCDC_COLPTN, 0x0000}, ++ {ISPCCDC_BLKCMP, 0x0000}, ++ {ISPCCDC_FPC, 0x0000}, ++ {ISPCCDC_FPC_ADDR, 0x0000}, ++ {ISPCCDC_VDINT, 0x0000}, ++ {ISPCCDC_ALAW, 0x0000}, ++ {ISPCCDC_REC656IF, 0x0000}, ++ {ISPCCDC_CFG, 0x0000}, ++ {ISPCCDC_FMTCFG, 0x0000}, ++ {ISPCCDC_FMT_HORZ, 0x0000}, ++ {ISPCCDC_FMT_VERT, 0x0000}, ++ {ISPCCDC_FMT_ADDR0, 0x0000}, ++ {ISPCCDC_FMT_ADDR1, 0x0000}, ++ {ISPCCDC_FMT_ADDR2, 0x0000}, ++ {ISPCCDC_FMT_ADDR3, 0x0000}, ++ {ISPCCDC_FMT_ADDR4, 0x0000}, ++ {ISPCCDC_FMT_ADDR5, 0x0000}, ++ {ISPCCDC_FMT_ADDR6, 0x0000}, ++ {ISPCCDC_FMT_ADDR7, 0x0000}, ++ {ISPCCDC_PRGEVEN0, 0x0000}, ++ {ISPCCDC_PRGEVEN1, 0x0000}, ++ {ISPCCDC_PRGODD0, 0x0000}, ++ {ISPCCDC_PRGODD1, 0x0000}, ++ {ISPCCDC_VP_OUT, 0x0000}, ++ {ISPCCDC_LSC_CONFIG, 0x0000}, ++ {ISPCCDC_LSC_INITIAL, 0x0000}, ++ {ISPCCDC_LSC_TABLE_BASE, 0x0000}, ++ {ISPCCDC_LSC_TABLE_OFFSET, 0x0000}, ++ {ISP_TOK_TERM, 0x0000} ++}; ++ ++/* ++ * Abstraction layer CCDC Module configuration. ++ */ ++int omap34xx_isp_ccdc_config(void *userspace_add) ++{ ++ struct ispccdc_bclamp bclamp_t; ++ struct ispccdc_blcomp blcomp_t; ++ struct ispccdc_fpc fpc_t; ++ struct ispccdc_culling cull_t; ++ struct ispccdc_update_config ccdc_struct; ++ u32 old_size; ++ ++ if (userspace_add == NULL) ++ return -EINVAL; ++ ++ if (copy_from_user(&ccdc_struct, ++ (struct ispccdc_update_config *)(userspace_add), ++ sizeof(struct ispccdc_update_config))) ++ goto copy_from_user_err; ++ ++ if ((ISP_ABS_CCDC_ALAW & ccdc_struct.flag) == ++ ISP_ABS_CCDC_ALAW) { ++ if ((ISP_ABS_CCDC_ALAW & ccdc_struct.update) == ++ ISP_ABS_CCDC_ALAW) { ++ ispccdc_config_alaw(ccdc_struct.alawip); ++ ispccdc_enable_alaw(1); ++ } else ++ ispccdc_enable_alaw(1); ++ } else { ++ if ((ISP_ABS_CCDC_ALAW & ccdc_struct.update) == ++ ISP_ABS_CCDC_ALAW) ++ ispccdc_enable_alaw(0); ++ } ++ ++ if ((ISP_ABS_CCDC_LPF & ccdc_struct.flag) == ISP_ABS_CCDC_LPF) ++ ispccdc_enable_lpf(1); ++ else ++ ispccdc_enable_lpf(0); ++ ++ if ((ISP_ABS_CCDC_BLCLAMP & ccdc_struct.flag) == ++ ISP_ABS_CCDC_BLCLAMP) { ++ if ((ISP_ABS_CCDC_BLCLAMP & ccdc_struct.update) == ++ ISP_ABS_CCDC_BLCLAMP) { ++ if (copy_from_user(&bclamp_t, ++ (struct ispccdc_bclamp *) ++ (ccdc_struct.bclamp), ++ sizeof(struct ispccdc_bclamp))) ++ goto copy_from_user_err; ++ ++ ispccdc_config_black_clamp(bclamp_t); ++ ispccdc_enable_black_clamp(1); ++ } else ++ ispccdc_enable_black_clamp(1); ++ } else { ++ if ((ISP_ABS_CCDC_BLCLAMP & ccdc_struct.update) == ++ ISP_ABS_CCDC_BLCLAMP) ++ ispccdc_enable_black_clamp(0); ++ } ++ ++ if ((ISP_ABS_CCDC_BCOMP & ccdc_struct.update) == ISP_ABS_CCDC_BCOMP) { ++ if (copy_from_user(&blcomp_t, ++ (struct ispccdc_blcomp *)(ccdc_struct.blcomp), ++ sizeof(blcomp_t))) ++ goto copy_from_user_err; ++ ++ ispccdc_config_black_comp(blcomp_t); ++ } ++ ++ if ((ISP_ABS_CCDC_FPC & ccdc_struct.flag) == ISP_ABS_CCDC_FPC) { ++ if ((ISP_ABS_CCDC_FPC & ccdc_struct.update) == ++ ISP_ABS_CCDC_FPC) { ++ if (copy_from_user(&fpc_t, ++ (struct ispccdc_fpc *)(ccdc_struct.fpc), ++ sizeof(fpc_t))) ++ goto copy_from_user_err; ++ fpc_table_add = (u32 *) ++ kmalloc((64 + ((fpc_t.fpnum) * 4)), ++ GFP_KERNEL|GFP_DMA); ++ if (fpc_table_add == NULL) { ++ printk(KERN_ERR "Cannot allocate memory for FPC table"); ++ return -ENOMEM; ++ } ++ ++ while (((int)fpc_table_add & 0xFFFFFFC0) != (int)fpc_table_add) ++ fpc_table_add++; ++ ++ fpc_table_add_m = ispmmu_map(virt_to_phys(fpc_table_add), ++ (fpc_t.fpnum)*4); ++ ++ if (copy_from_user(fpc_table_add, (void *)fpc_t.fpcaddr, ++ fpc_t.fpnum * 4)) ++ goto copy_from_user_err; ++ ++ fpc_t.fpcaddr = fpc_table_add_m; ++ ispccdc_config_fpc(fpc_t); ++ ispccdc_enable_fpc(1); ++ } else ++ ispccdc_enable_fpc(1); ++ } else { ++ if ((ISP_ABS_CCDC_FPC & ccdc_struct.update) == ++ ISP_ABS_CCDC_FPC) ++ ispccdc_enable_fpc(0); ++ } ++ ++ if ((ISP_ABS_CCDC_CULL & ccdc_struct.update) == ISP_ABS_CCDC_CULL) { ++ if (copy_from_user(&cull_t, ++ (struct ispccdc_culling *)(ccdc_struct.cull), ++ sizeof(cull_t))) ++ goto copy_from_user_err; ++ ispccdc_config_culling(cull_t); ++ } ++#ifdef USE_ISP_LSC ++ if ((ISP_ABS_CCDC_CONFIG_LSC & ccdc_struct.flag) == ++ ISP_ABS_CCDC_CONFIG_LSC) { ++ if ((ISP_ABS_CCDC_CONFIG_LSC & ccdc_struct.update) == ++ ISP_ABS_CCDC_CONFIG_LSC) { ++ old_size = lsc_config.size; ++ if (copy_from_user(&lsc_config, ++ (struct ispccdc_lsc_config *) ++ (ccdc_struct.lsc_cfg), ++ sizeof(struct ispccdc_lsc_config))) ++ goto copy_from_user_err; ++ ++ lsc_initialized = 0; ++ ++ if (lsc_config.size <= old_size) ++ size_mismatch = 0; ++ else ++ size_mismatch = 1; ++ ++ ispccdc_config_lsc(&lsc_config); ++ } ++ } ++ ++ if ((ISP_ABS_CCDC_CONFIG_LSC & ccdc_struct.flag) == ++ ISP_ABS_CCDC_CONFIG_LSC) ++ ccdc_use_lsc = 1; ++ else { ++ ispccdc_enable_lsc(0); ++ ccdc_use_lsc = 0; ++ } ++#endif ++ if ((ISP_ABS_CCDC_COLPTN & ccdc_struct.update) == ++ ISP_ABS_CCDC_COLPTN) ++ ispccdc_config_imgattr(ccdc_struct.colptn); ++ ++ return 0; ++ ++copy_from_user_err: ++ printk(KERN_ERR "CCDC Config:Copy From User Error"); ++ return -EINVAL ; ++} ++EXPORT_SYMBOL(omap34xx_isp_ccdc_config); ++ ++/* ++ * Reserve the CCDC module. ++ * Only one user at a time. ++ */ ++int ispccdc_request(void) ++{ ++ down(&(ispccdc_obj.semlock)); ++ if (!(ispccdc_obj.ccdc_inuse)) { ++ ispccdc_obj.ccdc_inuse = 1; ++ up(&(ispccdc_obj.semlock)); ++ /* Turn on CCDC module Clocks. */ ++ omap_writel((omap_readl(ISP_CTRL)) | ISPCTRL_CCDC_RAM_EN | ++ ISPCTRL_CCDC_CLK_EN | ++ ISPCTRL_SBL_WR1_RAM_EN, ++ ISP_CTRL); ++ /* VDLC = 1 is a must if CCDC to be used */ ++ omap_writel((omap_readl(ISPCCDC_CFG)) | ISPCCDC_CFG_VDLC ++ , ISPCCDC_CFG); ++ return 0; ++ } else{ ++ up(&(ispccdc_obj.semlock)); ++ DPRINTK_ISPCCDC("ISP_ERR : CCDC Module Busy"); ++ return -EBUSY; ++ } ++} ++EXPORT_SYMBOL(ispccdc_request); ++ ++/* ++ * Marks CCDC module free. ++ */ ++int ispccdc_free(void) ++{ ++ down(&(ispccdc_obj.semlock)); ++ if (ispccdc_obj.ccdc_inuse) { ++ ispccdc_obj.ccdc_inuse = 0; ++ up(&(ispccdc_obj.semlock)); ++ /* Turn off CCDC module Clocks. */ ++ omap_writel((omap_readl(ISP_CTRL)) & ~(ISPCTRL_CCDC_CLK_EN ++ | ISPCTRL_CCDC_RAM_EN ++ | ISPCTRL_SBL_WR1_RAM_EN), ISP_CTRL); ++ return 0; ++ } else { ++ up(&(ispccdc_obj.semlock)); ++ DPRINTK_ISPCCDC("ISP_ERR : CCDC Module already freed"); ++ return -EINVAL; ++ } ++} ++EXPORT_SYMBOL(ispccdc_free); ++ ++#ifdef USE_ISP_LSC ++/* ++ * Load lens shading table ++ */ ++int ispccdc_load_lsc(u32 table_size) ++{ ++ if (table_size == 0) ++ return -EINVAL; ++ ++ if (lsc_initialized) ++ return 0; ++ ++ /* Disable LSC module*/ ++ ispccdc_enable_lsc(0); ++ lsc_gain_table = kmalloc(table_size, GFP_KERNEL | GFP_DMA); ++ ++ if (lsc_gain_table == NULL) { ++ printk(KERN_ERR "Cannot allocate memory for gain tables\n"); ++ return -ENOMEM; ++ } ++ ++ memcpy(lsc_gain_table, ispccdc_lsc_tbl, table_size); ++ lsc_ispmmu_addr = ispmmu_map(virt_to_phys(lsc_gain_table), table_size); ++ ++ omap_writel(lsc_ispmmu_addr , ISPCCDC_LSC_TABLE_BASE); ++ lsc_initialized = 1; ++ ++ return 0; ++} ++EXPORT_SYMBOL(ispccdc_load_lsc); ++ ++/* ++ * Configures the lens shading compensation module ++ * lsc_cfg : LSC configuration structure ++ */ ++void ispccdc_config_lsc(struct ispccdc_lsc_config *lsc_cfg) ++{ ++ int reg; ++ ++ /* Disable LSC module*/ ++ ispccdc_enable_lsc(0); ++ ++ omap_writel(lsc_cfg->offset, ISPCCDC_LSC_TABLE_OFFSET); ++ ++ reg = 0x0000; ++ reg |= (lsc_cfg->gain_mode_n << ISPCCDC_LSC_GAIN_MODE_N_SHIFT); ++ reg |= (lsc_cfg->gain_mode_m << ISPCCDC_LSC_GAIN_MODE_M_SHIFT); ++ reg |= (lsc_cfg->gain_format << ISPCCDC_LSC_GAIN_FORMAT_SHIFT); ++ omap_writel(reg , ISPCCDC_LSC_CONFIG); ++ ++ reg = 0x0000; ++ reg &= ~ISPCCDC_LSC_INITIAL_X_MASK; ++ reg |= (lsc_cfg->initial_x << ISPCCDC_LSC_INITIAL_X_SHIFT); ++ reg &= ~ISPCCDC_LSC_INITIAL_Y_MASK; ++ reg |= (lsc_cfg->initial_y << ISPCCDC_LSC_INITIAL_Y_SHIFT); ++ omap_writel(reg , ISPCCDC_LSC_INITIAL); ++} ++EXPORT_SYMBOL(ispccdc_config_lsc); ++ ++/* ++ * Enables lens shading compensation module ++ * enable :0 - Disable LSC : 1- Enables LSC ++ */ ++void ispccdc_enable_lsc(u8 enable) ++{ ++ if (enable & ccdc_use_lsc) { ++ omap_writel(omap_readl(ISP_CTRL) | ISPCTRL_SBL_SHARED_RPORTB | ++ ISPCTRL_SBL_RD_RAM_EN, ISP_CTRL); ++ omap_writel(omap_readl(ISPCCDC_LSC_CONFIG) | 0x01, ++ ISPCCDC_LSC_CONFIG); ++ ispccdc_obj.lsc_en = 1; ++ } else { ++ omap_writel(omap_readl(ISPCCDC_LSC_CONFIG) & 0xFFFE, ++ ISPCCDC_LSC_CONFIG); ++ ispccdc_obj.lsc_en = 0; ++ } ++} ++EXPORT_SYMBOL(ispccdc_enable_lsc); ++ ++/* ++* Abstraction layer LSC Updates ++*/ ++int omap34xx_isp_lsc_update(void *userspace_add) ++{ ++ struct isptables_update isptables_struct; ++ ++ if (userspace_add == NULL) ++ return -EINVAL; ++ ++ if (copy_from_user(&isptables_struct, (void *)userspace_add, ++ sizeof(struct isptables_update))) ++ goto copy_from_user_err; ++ ++ if ((ISP_ABS_TBL_LSC & isptables_struct.flag) == ISP_ABS_TBL_LSC) { ++ if ((ISP_ABS_TBL_LSC & isptables_struct.update) == ++ ISP_ABS_TBL_LSC) { ++ ispccdc_enable_lsc(0); ++ if (size_mismatch) { ++ ispmmu_unmap(lsc_ispmmu_addr); ++ kfree(lsc_gain_table); ++ lsc_gain_table = kmalloc(lsc_config.size, ++ GFP_KERNEL | GFP_DMA); ++ if (!lsc_gain_table) { ++ printk(KERN_ERR "Cannot allocate " ++ "memory for gain tables \n"); ++ return -ENOMEM; ++ } ++ ++ lsc_ispmmu_addr = ispmmu_map( ++ virt_to_phys(lsc_gain_table), ++ lsc_config.size); ++ omap_writel(lsc_ispmmu_addr, ++ ISPCCDC_LSC_TABLE_BASE); ++ lsc_initialized = 1; ++ size_mismatch = 0; ++ } ++ ++ if (copy_from_user(lsc_gain_table, isptables_struct.lsc, ++ lsc_config.size)) ++ goto copy_from_user_err; ++ } ++ ++ ccdc_use_lsc = 1; ++ } else { ++ if ((ISP_ABS_TBL_LSC & isptables_struct.update) == ++ ISP_ABS_TBL_LSC) ++ ispccdc_enable_lsc(0); ++ ccdc_use_lsc = 0; ++ } ++ ++ return 0; ++ ++copy_from_user_err: ++ printk(KERN_ERR "LSC Update:Copy From User Error"); ++ return -EINVAL; ++} ++#else ++void ispccdc_enable_lsc(u8 enable) {} ++#endif ++EXPORT_SYMBOL(omap34xx_isp_lsc_update); ++ ++void ispccdc_config_crop(u32 left, u32 top, u32 height, u32 width) ++{ ++/* The following restrictions are applied for the crop settings. If incoming ++ * values do not follow these restrictions then we map the settings to the ++ * closest acceptable crop value. ++ * 1) Left offset is always odd. This can be avoided if we enable byte swap ++ * option for incoming data into CCDC. ++ * 2) Height offset is always even. ++ * 3) Crop width is always a multiple of 16 pixels ++ * 4) Crop height is always even. ++ */ ++ ++ ispccdc_obj.ccdcin_woffset = left + ((left+1)%2); ++ ispccdc_obj.ccdcin_hoffset = top + (top % 2); ++ ++ ispccdc_obj.crop_w = width - (width % 16); ++ ispccdc_obj.crop_h = height + (height % 2); ++ ++ DPRINTK_ISPCCDC("\n\tOffsets L %d T %d W %d H %d\n", ++ ispccdc_obj.ccdcin_woffset, ++ ispccdc_obj.ccdcin_hoffset, ++ ispccdc_obj.crop_w, ++ ispccdc_obj.crop_h); ++ ++} ++/* Sets up the default CCDC configuration according to the arguments. ++ * input : Indicates the module that gives the image to CCDC ++ * output : Indicates the module to which the CCDC outputs to. ++ */ ++int ispccdc_config_datapath(enum ccdc_input input, ++ enum ccdc_output output) ++{ ++ u32 syn_mode = 0; ++ struct ispccdc_vp vpcfg; ++ struct ispccdc_syncif syncif; ++ struct ispccdc_bclamp blkcfg; ++ /* Color pattern is ++ Gr R Gr R Gr R ... ++ B Gb . B Gb B Gb..... ++ Gr R Gr R Gr R ... ++ B Gb . B Gb B Gb..... ++ */ ++ u32 colptn = ISPCCDC_COLPTN_Gr_Cy << ISPCCDC_COLPTN_CP0PLC0_SHIFT ++ | ISPCCDC_COLPTN_R_Ye << ISPCCDC_COLPTN_CP0PLC1_SHIFT ++ | ISPCCDC_COLPTN_Gr_Cy << ISPCCDC_COLPTN_CP0PLC2_SHIFT ++ | ISPCCDC_COLPTN_R_Ye << ISPCCDC_COLPTN_CP0PLC3_SHIFT ++ | ISPCCDC_COLPTN_B_Mg << ISPCCDC_COLPTN_CP1PLC0_SHIFT ++ | ISPCCDC_COLPTN_Gb_G << ISPCCDC_COLPTN_CP1PLC1_SHIFT ++ | ISPCCDC_COLPTN_B_Mg << ISPCCDC_COLPTN_CP1PLC2_SHIFT ++ | ISPCCDC_COLPTN_Gb_G << ISPCCDC_COLPTN_CP1PLC3_SHIFT ++ | ISPCCDC_COLPTN_Gr_Cy << ISPCCDC_COLPTN_CP2PLC0_SHIFT ++ | ISPCCDC_COLPTN_R_Ye << ISPCCDC_COLPTN_CP2PLC1_SHIFT ++ | ISPCCDC_COLPTN_Gr_Cy << ISPCCDC_COLPTN_CP2PLC2_SHIFT ++ | ISPCCDC_COLPTN_R_Ye << ISPCCDC_COLPTN_CP2PLC3_SHIFT ++ | ISPCCDC_COLPTN_B_Mg << ISPCCDC_COLPTN_CP3PLC0_SHIFT ++ | ISPCCDC_COLPTN_Gb_G << ISPCCDC_COLPTN_CP3PLC1_SHIFT ++ | ISPCCDC_COLPTN_B_Mg << ISPCCDC_COLPTN_CP3PLC2_SHIFT ++ | ISPCCDC_COLPTN_Gb_G << ISPCCDC_COLPTN_CP3PLC3_SHIFT; ++ ++ /* CCDC does not convert the image format */ ++ if (((input == CCDC_RAW) || (input == CCDC_OTHERS)) ++ && (output == CCDC_YUV_RSZ)) { ++ DPRINTK_ISPCCDC("ISP_ERR : Wrong CCDC i/p,o/p Combination"); ++ return -EINVAL; ++ } ++ ++ syn_mode = omap_readl(ISPCCDC_SYN_MODE); ++ ++ switch (output) { ++ case CCDC_YUV_RSZ: ++ syn_mode |= ISPCCDC_SYN_MODE_SDR2RSZ; ++ syn_mode &= ~ISPCCDC_SYN_MODE_WEN; ++ break; ++ ++ case CCDC_YUV_MEM_RSZ: ++ syn_mode |= ISPCCDC_SYN_MODE_SDR2RSZ; ++ ispccdc_obj.wen = 1; ++ syn_mode |= ISPCCDC_SYN_MODE_WEN; ++ break; ++ ++ case CCDC_OTHERS_VP: ++ syn_mode &= ~ISPCCDC_SYN_MODE_VP2SDR; ++ syn_mode &= ~ISPCCDC_SYN_MODE_SDR2RSZ; ++ syn_mode &= ~ISPCCDC_SYN_MODE_WEN; ++ /* Video Port Configuration */ ++ vpcfg.bitshift_sel = BIT9_0; ++ vpcfg.freq_sel = PIXCLKBY2; ++ ispccdc_config_vp(vpcfg); ++ ispccdc_enable_vp(1); ++ break; ++ ++ case CCDC_OTHERS_MEM: ++ syn_mode &= ~ISPCCDC_SYN_MODE_VP2SDR; ++ syn_mode &= ~ISPCCDC_SYN_MODE_SDR2RSZ; ++ syn_mode |= ISPCCDC_SYN_MODE_WEN; ++ /* Generally cam_wen is used with cam_hs, vs signals */ ++#ifndef ENABLE_BT_656_CAPTURE ++ syn_mode |= ISPCCDC_SYN_MODE_EXWEN; ++ omap_writel((omap_readl(ISPCCDC_CFG)) ++ | ISPCCDC_CFG_WENLOG, ISPCCDC_CFG); ++#else ++ syn_mode &= ~ISPCCDC_SYN_MODE_EXWEN; ++#endif ++ break; ++ ++ case CCDC_OTHERS_VP_MEM: ++ syn_mode |= ISPCCDC_SYN_MODE_VP2SDR; ++ syn_mode |= ISPCCDC_SYN_MODE_WEN; ++ /* Generally cam_wen is used with cam_hs, vs signals */ ++ syn_mode |= ISPCCDC_SYN_MODE_EXWEN; ++ omap_writel((omap_readl(ISPCCDC_CFG)) ++ | ISPCCDC_CFG_WENLOG, ISPCCDC_CFG); ++ /* Video Port Configuration */ ++ vpcfg.bitshift_sel = BIT9_0; ++ vpcfg.freq_sel = PIXCLKBY2; ++ ispccdc_config_vp(vpcfg); ++ ispccdc_enable_vp(1); ++ break; ++ default: ++ DPRINTK_ISPCCDC("ISP_ERR : Wrong CCDC Input"); ++ return -EINVAL; ++ }; ++ ++#ifdef USE_ISP_LSC ++ if (input == CCDC_RAW) { ++ lsc_config.initial_x = 0; ++ lsc_config.initial_y = 0; ++ lsc_config.gain_mode_n = 0x06; ++ lsc_config.gain_mode_m = 0x06; ++ lsc_config.gain_format = 0x04; ++ lsc_config.offset = 0x60; ++ ispccdc_config_lsc(&lsc_config); ++ ispccdc_load_lsc(lsc_config.size); ++ /* mdelay(100); ++ ispccdc_enable_lsc(1); */ ++ } ++#endif ++ ++ omap_writel(syn_mode, ISPCCDC_SYN_MODE); ++ ++ switch (input) { ++ case CCDC_RAW: ++ /* Slave mode */ ++ syncif.ccdc_mastermode = 0; ++ /* Normal */ ++ syncif.datapol = 0; ++ syncif.datsz = DAT10; ++ /* Progressive Mode */ ++ syncif.fldmode = 0; ++ /* Input */ ++ syncif.fldout = 0; ++ /* Positive */ ++ syncif.fldpol = 0; ++ /* Odd Field */ ++ syncif.fldstat = 0; ++ /*Positive */ ++ syncif.hdpol = 0; ++ syncif.ipmod = RAW; ++ /* Positive */ ++ syncif.vdpol = 0; ++ ispccdc_config_sync_if(syncif); ++ ispccdc_config_imgattr(colptn); ++ blkcfg.dcsubval = 42; ++ ispccdc_config_black_clamp(blkcfg); ++ break; ++ case CCDC_YUV_SYNC: ++ /* Slave mode */ ++ syncif.ccdc_mastermode = 0; ++ /* Normal */ ++ syncif.datapol = 0; ++ syncif.datsz = DAT8; ++ /* Progressive Mode */ ++ syncif.fldmode = 0; ++ /* Input */ ++ syncif.fldout = 0; ++ /* Positive */ ++ syncif.fldpol = 0; ++ /* Odd Field */ ++ syncif.fldstat = 0; ++ /*Positive */ ++ syncif.hdpol = 0; ++ syncif.ipmod = YUV16; ++ /*Positive */ ++ syncif.vdpol = 0; ++#ifdef ENABLE_BT_656_CAPTURE ++ syncif.bt_r656_en = 0; ++#endif ++ ispccdc_config_imgattr(0); ++ ispccdc_config_sync_if(syncif); ++ blkcfg.dcsubval = 0; ++ ispccdc_config_black_clamp(blkcfg); ++ break; ++ case CCDC_YUV_BT: ++#ifdef ENABLE_BT_656_CAPTURE ++ /* Slave mode */ ++ syncif.ccdc_mastermode = 0; ++ /* Normal */ ++ syncif.datapol = 0; ++ syncif.datsz = DAT8; ++ /* Progressive Mode */ ++ syncif.fldmode = 1; ++ /* Input */ ++ syncif.fldout = 0; ++ /* Positive */ ++ syncif.fldpol = 0; ++ /* Odd Field */ ++ syncif.fldstat = 0; ++ /*Positive */ ++ syncif.hdpol = 0; ++ syncif.ipmod = YUV8; ++ /*Positive */ ++ syncif.vdpol = 1; ++ syncif.bt_r656_en = 1; ++ ispccdc_config_imgattr(0); ++ ispccdc_config_sync_if(syncif); ++ blkcfg.dcsubval = 0; ++ ispccdc_config_black_clamp(blkcfg); ++#endif ++ break; ++ case CCDC_OTHERS: ++ break; ++ default: ++ DPRINTK_ISPCCDC("ISP_ERR : Wrong CCDC Input"); ++ return -EINVAL; ++ } ++ ++ ispccdc_obj.ccdc_inpfmt = input; ++ ispccdc_obj.ccdc_outfmt = output; ++ ispccdc_print_status(); ++ isp_print_status(); ++ return 0; ++} ++EXPORT_SYMBOL(ispccdc_config_datapath); ++ ++/* ++ * Configures the sync interface parameters between the sensor and the CCDC. ++ * syncif : Structure containing the sync parameters like ++ * field state, ++ * CCDC in master/slave mode, raw/yuv data, polarity of data, ++ * field, hs, vs signals. ++ */ ++void ispccdc_config_sync_if(struct ispccdc_syncif syncif) ++{ ++ u32 syn_mode = omap_readl(ISPCCDC_SYN_MODE); ++ ++ syn_mode |= ISPCCDC_SYN_MODE_VDHDEN; ++ ++ if (syncif.fldstat) ++ syn_mode |= ISPCCDC_SYN_MODE_FLDSTAT; ++ else ++ syn_mode &= ~ISPCCDC_SYN_MODE_FLDSTAT; ++ ++ syn_mode &= ISPCCDC_SYN_MODE_INPMOD_MASK; ++ ispccdc_obj.syncif_ipmod = syncif.ipmod; ++ ++ switch (syncif.ipmod) { ++ case RAW: ++ break; ++ case YUV16: ++ syn_mode |= ISPCCDC_SYN_MODE_INPMOD_YCBCR16; ++ break; ++ case YUV8: ++ syn_mode |= ISPCCDC_SYN_MODE_INPMOD_YCBCR8; ++#ifdef ENABLE_BT_656_CAPTURE ++ syn_mode |= ISPCCDC_SYN_MODE_PACK8; ++#endif ++ break; ++ }; ++ ++ syn_mode &= ISPCCDC_SYN_MODE_DATSIZ_MASK; ++ switch (syncif.datsz) { ++ case DAT8: ++ syn_mode |= ISPCCDC_SYN_MODE_DATSIZ_8; ++ break; ++ case DAT10: ++ syn_mode |= ISPCCDC_SYN_MODE_DATSIZ_10; ++ break; ++ case DAT11: ++ syn_mode |= ISPCCDC_SYN_MODE_DATSIZ_11; ++ break; ++ case DAT12: ++ syn_mode |= ISPCCDC_SYN_MODE_DATSIZ_12; ++ break; ++ }; ++ ++ if (syncif.fldmode) ++ /*Interlaced mode*/ ++ syn_mode |= ISPCCDC_SYN_MODE_FLDMODE; ++ else ++ /*Progressive mode */ ++ syn_mode &= ~ISPCCDC_SYN_MODE_FLDMODE; ++ ++ if (syncif.datapol) ++ /*One's complement */ ++ syn_mode |= ISPCCDC_SYN_MODE_DATAPOL; ++ else ++ /*Normal */ ++ syn_mode &= ~ISPCCDC_SYN_MODE_DATAPOL; ++ ++ if (syncif.fldpol) ++ /*Negative */ ++ syn_mode |= ISPCCDC_SYN_MODE_FLDPOL; ++ else ++ /*Positive */ ++ syn_mode &= ~ISPCCDC_SYN_MODE_FLDPOL; ++ ++ if (syncif.hdpol) ++ /*Negative */ ++ syn_mode |= ISPCCDC_SYN_MODE_HDPOL; ++ else ++ /*Positive */ ++ syn_mode &= ~ISPCCDC_SYN_MODE_HDPOL; ++ ++ if (syncif.vdpol) ++ /*Negative */ ++ syn_mode |= ISPCCDC_SYN_MODE_VDPOL; ++ else ++ /*Positive */ ++ syn_mode &= ~ISPCCDC_SYN_MODE_VDPOL; ++ ++ if (syncif.ccdc_mastermode) { ++ /*fld, hd, vd are output signals in master mode */ ++ syn_mode |= ISPCCDC_SYN_MODE_FLDOUT ++ | ISPCCDC_SYN_MODE_VDHDOUT; ++ omap_writel(syncif.hs_width << ISPCCDC_HD_VD_WID_HDW_SHIFT ++ | syncif.vs_width << ISPCCDC_HD_VD_WID_VDW_SHIFT, ++ ISPCCDC_HD_VD_WID); ++ ++ /*Pixel per line, half line per frame are used ++ * along with HS/VS as output ++ */ ++ omap_writel(syncif.ppln << ISPCCDC_PIX_LINES_PPLN_SHIFT ++ | syncif.hlprf << ISPCCDC_PIX_LINES_HLPRF_SHIFT, ++ ISPCCDC_PIX_LINES); ++ } else ++ /*fld, hd,vd input signals in slave mode */ ++ syn_mode &= ~(ISPCCDC_SYN_MODE_FLDOUT ++ | ISPCCDC_SYN_MODE_VDHDOUT); ++ ++ omap_writel(syn_mode, ISPCCDC_SYN_MODE); ++ ++ if (!(syncif.bt_r656_en)) ++ omap_writel((omap_readl(ISPCCDC_REC656IF)) ++ & (~ISPCCDC_REC656IF_R656ON), ISPCCDC_REC656IF); ++#ifdef ENABLE_BT_656_CAPTURE ++ else ++ omap_writel((omap_readl(ISPCCDC_REC656IF)) ++ | (ISPCCDC_REC656IF_R656ON | ISPCCDC_REC656IF_ECCFVH), ISPCCDC_REC656IF); ++#endif ++} ++EXPORT_SYMBOL(ispccdc_config_sync_if); ++ ++/* ++ * Configures the optical/digital black clamp parameters in CCDC. ++ * bclamp : Structure containing the optical black average gain, ++ * optical black sample length, sample lines, and the start pixel ++ * position of the samples w.r.t the HS pulse . ++ */ ++int ispccdc_config_black_clamp(struct ispccdc_bclamp bclamp) ++{ ++ u32 bclamp_val = 0; ++ if (ispccdc_obj.obclamp_en) { ++ bclamp_val |= bclamp.obgain << ISPCCDC_CLAMP_OBGAIN_SHIFT; ++ bclamp_val |= bclamp.oblen << ISPCCDC_CLAMP_OBSLEN_SHIFT; ++ bclamp_val |= bclamp.oblines << ISPCCDC_CLAMP_OBSLN_SHIFT; ++ bclamp_val |= bclamp.obstpixel << ISPCCDC_CLAMP_OBST_SHIFT; ++ omap_writel(bclamp_val, ISPCCDC_CLAMP); ++ } else { ++ /* ++ * HW Errata 1.39. Camera ISP: DC substract not supported for ++ * YUV 8bit and ITU656 ++ */ ++#if 0 ++ if (is_sil_rev_less_than(OMAP3430_REV_ES2_0)) ++ if ((ispccdc_obj.syncif_ipmod == YUV16) || ++ (ispccdc_obj.syncif_ipmod == YUV8) || ++ ((omap_readl(ISPCCDC_REC656IF) ++ & ISPCCDC_REC656IF_R656ON) ++ == ISPCCDC_REC656IF_R656ON)) ++ bclamp.dcsubval = 0; ++ omap_writel(bclamp.dcsubval, ISPCCDC_DCSUB); ++#endif ++ } ++ return 0; ++} ++EXPORT_SYMBOL(ispccdc_config_black_clamp); ++ ++/* ++ * Enables the optical or Digital black clamp. ++ * enable : : 1- Enables Optical Black clamp ++ * 0 - Enables Digital Black clamp. ++ */ ++void ispccdc_enable_black_clamp(u8 enable) ++{ ++ if (enable) { ++ omap_writel((omap_readl(ISPCCDC_CLAMP)) | ISPCCDC_CLAMP_CLAMPEN, ++ ISPCCDC_CLAMP); ++ ispccdc_obj.obclamp_en = 1; ++ } else { ++ omap_writel((omap_readl(ISPCCDC_CLAMP)) ++ & (~ISPCCDC_CLAMP_CLAMPEN), ISPCCDC_CLAMP); ++ ispccdc_obj.obclamp_en = 0; ++ } ++} ++EXPORT_SYMBOL(ispccdc_enable_black_clamp); ++ ++/* ++ * Configures the Faulty Pixel Correction parameters. ++ * fpc : Structure containing the number of faulty pixels corrected ++ * in the frame, address of the FPC table. ++ */ ++int ispccdc_config_fpc(struct ispccdc_fpc fpc) ++{ ++ u32 fpc_val = 0; ++ ++ fpc_val = omap_readl(ISPCCDC_FPC); ++ ++ if ((fpc.fpcaddr & 0xFFFFFFC0) == fpc.fpcaddr) { ++ /*Make sure that FPC is disabled*/ ++ omap_writel(fpc_val&(~ISPCCDC_FPC_FPCEN), ISPCCDC_FPC); ++ omap_writel(fpc.fpcaddr, ISPCCDC_FPC_ADDR); ++ } else { ++ DPRINTK_ISPCCDC("FPC Address should be on 64byte boundary\n"); ++ return -EINVAL; ++ } ++ /*Retain the FPC Enable bit along with the configuration*/ ++ omap_writel(fpc_val|(fpc.fpnum<<ISPCCDC_FPC_FPNUM_SHIFT) ++ , ISPCCDC_FPC); ++ return 0; ++} ++EXPORT_SYMBOL(ispccdc_config_fpc); ++ ++/* ++ * Enables the Faulty Pixel Correction. ++ * enable : : 1- Enables FPC ++ */ ++void ispccdc_enable_fpc(u8 enable) ++{ ++ if (enable) ++ omap_writel((omap_readl(ISPCCDC_FPC))|ISPCCDC_FPC_FPCEN ++ , ISPCCDC_FPC); ++ else ++ omap_writel((omap_readl(ISPCCDC_FPC)) ++ & (~ISPCCDC_FPC_FPCEN), ISPCCDC_FPC); ++} ++EXPORT_SYMBOL(ispccdc_enable_fpc); ++ ++/* ++ * Configures the Black Level Compensation parameters. ++ * blcomp : Structure containing the black level compensation value ++ * for RGrGbB pixels. in 2's complement. ++ */ ++void ispccdc_config_black_comp(struct ispccdc_blcomp blcomp) ++{ ++ u32 blcomp_val = 0; ++ blcomp_val |= blcomp.b_mg << ISPCCDC_BLKCMP_B_MG_SHIFT; ++ blcomp_val |= blcomp.gb_g << ISPCCDC_BLKCMP_GB_G_SHIFT; ++ blcomp_val |= blcomp.gr_cy << ISPCCDC_BLKCMP_GR_CY_SHIFT; ++ blcomp_val |= blcomp.r_ye << ISPCCDC_BLKCMP_R_YE_SHIFT; ++ ++ omap_writel(blcomp_val, ISPCCDC_BLKCMP); ++} ++EXPORT_SYMBOL(ispccdc_config_black_comp); ++ ++/* ++ * Configures the Video Port Configuration parameters. ++ * vpcfg : Structure containing the Video Port input frequency, ++ * and the 10 bit format. ++ */ ++void ispccdc_config_vp(struct ispccdc_vp vpcfg) ++{ ++ u32 fmtcfg_vp = omap_readl(ISPCCDC_FMTCFG); ++ ++ /*Clear the existing values */ ++ fmtcfg_vp &= ISPCCDC_FMTCFG_VPIN_MASK & ++ ISPCCDC_FMTCF_VPIF_FRQ_MASK; ++ ++ switch (vpcfg.bitshift_sel) { ++ case BIT9_0: ++ fmtcfg_vp |= ISPCCDC_FMTCFG_VPIN_9_0; ++ break; ++ case BIT10_1: ++ fmtcfg_vp |= ISPCCDC_FMTCFG_VPIN_10_1; ++ break; ++ case BIT11_2: ++ fmtcfg_vp |= ISPCCDC_FMTCFG_VPIN_11_2; ++ break; ++ case BIT12_3: ++ fmtcfg_vp |= ISPCCDC_FMTCFG_VPIN_12_3; ++ break; ++ }; ++ switch (vpcfg.freq_sel) { ++ case PIXCLKBY2: ++ fmtcfg_vp |= ISPCCDC_FMTCF_VPIF_FRQ_BY2; ++ break; ++ case PIXCLKBY3_5: ++ fmtcfg_vp |= ISPCCDC_FMTCF_VPIF_FRQ_BY3; ++ break; ++ case PIXCLKBY4_5: ++ fmtcfg_vp |= ISPCCDC_FMTCF_VPIF_FRQ_BY4; ++ break; ++ case PIXCLKBY5_5: ++ fmtcfg_vp |= ISPCCDC_FMTCF_VPIF_FRQ_BY5; ++ break; ++ case PIXCLKBY6_5: ++ fmtcfg_vp |= ISPCCDC_FMTCF_VPIF_FRQ_BY6; ++ break; ++ }; ++ omap_writel(fmtcfg_vp, ISPCCDC_FMTCFG); ++} ++EXPORT_SYMBOL(ispccdc_config_vp); ++ ++/* ++ * Enables the Video Port. ++ * enable : : 1- Enables VP ++ */ ++void ispccdc_enable_vp(u8 enable) ++{ ++ if (enable) ++ omap_writel((omap_readl(ISPCCDC_FMTCFG)) ++ | ISPCCDC_FMTCFG_VPEN, ISPCCDC_FMTCFG); ++ else ++ omap_writel((omap_readl(ISPCCDC_FMTCFG)) ++ & (~ISPCCDC_FMTCFG_VPEN), ISPCCDC_FMTCFG); ++} ++EXPORT_SYMBOL(ispccdc_enable_vp); ++ ++/* ++ * Configures the Reformatter register values if line alternating is disabled. ++ * else just enabling the line alternating is enough. ++ * refmt : : Structure containing the memory address to format and ++ * the bit fields for the reformatter registers. ++ */ ++void ispccdc_config_reformatter(struct ispccdc_refmt refmt) ++{ ++ u32 fmtcfg_val = 0; ++ ++ fmtcfg_val = omap_readl(ISPCCDC_FMTCFG); ++ ++ if (refmt.lnalt) ++ fmtcfg_val |= ISPCCDC_FMTCFG_LNALT; ++ else{ ++ fmtcfg_val &= ~ISPCCDC_FMTCFG_LNALT; ++ /*Clear fields of lnum plen_even/odd*/ ++ fmtcfg_val &= 0xFFFFF003; ++ fmtcfg_val |= refmt.lnum << ISPCCDC_FMTCFG_LNUM_SHIFT; ++ fmtcfg_val |= refmt.plen_even << ++ ISPCCDC_FMTCFG_PLEN_EVEN_SHIFT; ++ fmtcfg_val |= refmt.plen_odd << ISPCCDC_FMTCFG_PLEN_ODD_SHIFT; ++ ++ /*The arguments have the proper caluclated addresses ++ * and bit fields for the reformatter configuration*/ ++ omap_writel(refmt.prgeven0, ISPCCDC_PRGEVEN0); ++ omap_writel(refmt.prgeven1, ISPCCDC_PRGEVEN1); ++ omap_writel(refmt.prgodd0, ISPCCDC_PRGODD0); ++ omap_writel(refmt.prgodd1, ISPCCDC_PRGODD1); ++ omap_writel(refmt.fmtaddr0, ISPCCDC_FMT_ADDR0); ++ omap_writel(refmt.fmtaddr1, ISPCCDC_FMT_ADDR1); ++ omap_writel(refmt.fmtaddr2, ISPCCDC_FMT_ADDR2); ++ omap_writel(refmt.fmtaddr3, ISPCCDC_FMT_ADDR3); ++ omap_writel(refmt.fmtaddr4, ISPCCDC_FMT_ADDR4); ++ omap_writel(refmt.fmtaddr5, ISPCCDC_FMT_ADDR5); ++ omap_writel(refmt.fmtaddr6, ISPCCDC_FMT_ADDR6); ++ omap_writel(refmt.fmtaddr7, ISPCCDC_FMT_ADDR7); ++ } ++ omap_writel(fmtcfg_val, ISPCCDC_FMTCFG); ++} ++EXPORT_SYMBOL(ispccdc_config_reformatter); ++ ++/* ++ * Enables the Reformatter ++ * enable : : 1- Enables Data Reformatter ++ */ ++void ispccdc_enable_reformatter(u8 enable) ++{ ++ if (enable) { ++ omap_writel((omap_readl(ISPCCDC_FMTCFG)) ++ | ISPCCDC_FMTCFG_FMTEN, ISPCCDC_FMTCFG); ++ ispccdc_obj.refmt_en = 1; ++ } else { ++ omap_writel((omap_readl(ISPCCDC_FMTCFG)) ++ & ~ISPCCDC_FMTCFG_FMTEN, ISPCCDC_FMTCFG); ++ ispccdc_obj.refmt_en = 0; ++ } ++} ++EXPORT_SYMBOL(ispccdc_enable_reformatter); ++ ++/* ++ * Configures the Culling parameters. ++ * cull : : Structure containing the vertical culling pattern, ++ * and horizontal culling pattern for odd and even lines. ++ */ ++void ispccdc_config_culling(struct ispccdc_culling cull) ++{ ++ u32 culling_val = 0; ++ ++ culling_val |= cull.v_pattern<<ISPCCDC_CULLING_CULV_SHIFT; ++ culling_val |= cull.h_even << ISPCCDC_CULLING_CULHEVN_SHIFT; ++ culling_val |= cull.h_odd << ISPCCDC_CULLING_CULHODD_SHIFT; ++ ++ omap_writel(culling_val, ISPCCDC_CULLING); ++} ++EXPORT_SYMBOL(ispccdc_config_culling); ++ ++/* ++ * Enables the Low pass Filter ++ * enable : : 1- Enables LPF ++ */ ++void ispccdc_enable_lpf(u8 enable) ++{ ++ if (enable) ++ omap_writel((omap_readl(ISPCCDC_SYN_MODE)) ++ | ISPCCDC_SYN_MODE_LPF, ISPCCDC_SYN_MODE); ++ else ++ omap_writel((omap_readl(ISPCCDC_SYN_MODE)) ++ & (~ISPCCDC_SYN_MODE_LPF), ISPCCDC_SYN_MODE); ++} ++EXPORT_SYMBOL(ispccdc_enable_lpf); ++ ++/* ++ * Configures the input width for A-law. ++ * ipwidth : Input width for ALaw ++ */ ++void ispccdc_config_alaw(enum alaw_ipwidth ipwidth) ++{ ++ omap_writel(ipwidth << ISPCCDC_ALAW_GWDI_SHIFT, ISPCCDC_ALAW); ++} ++EXPORT_SYMBOL(ispccdc_config_alaw); ++ ++/* ++ * Enables the A-law compression ++ * enable : : 1- Enables A-Law ++ */ ++void ispccdc_enable_alaw(u8 enable) ++{ ++ if (enable) ++ omap_writel((omap_readl(ISPCCDC_ALAW)) ++ | ISPCCDC_ALAW_CCDTBL, ISPCCDC_ALAW); ++ else ++ omap_writel((omap_readl(ISPCCDC_ALAW)) ++ & ~ISPCCDC_ALAW_CCDTBL, ISPCCDC_ALAW); ++} ++EXPORT_SYMBOL(ispccdc_enable_alaw); ++ ++/* ++ * Configures the sensor image specific attribute. ++ * colptn : Color pattern of the sensor. ++ */ ++void ispccdc_config_imgattr(u32 colptn) ++{ ++ omap_writel(colptn, ISPCCDC_COLPTN); ++} ++EXPORT_SYMBOL(ispccdc_config_imgattr); ++ ++/* ++ * Programs the shadow registers associated with CCDC. ++ */ ++void ispccdc_config_shadow_registers(void) ++{ ++ if (ccdc_use_lsc && !ispccdc_obj.lsc_en && ++ (ispccdc_obj.ccdc_inpfmt == CCDC_RAW)) ++ ispccdc_enable_lsc(1); ++ return; ++} ++EXPORT_SYMBOL(ispccdc_config_shadow_registers); ++ ++/* ++ * Calculates the number of pixels cropped if the reformater is disabled, ++ * Fills up the output widht height variables in the isp_ccdc structure . ++ * input_w : input width for the CCDC in number of pixels per line ++ * input_h : input height for the CCDC in number of lines ++ * output_w : output width from the CCDC in number of pixels per line ++ * output_h : output height for the CCDC in number of lines ++*/ ++int ispccdc_try_size(u32 input_w, u32 input_h, u32 *output_w, ++ u32 *output_h) ++{ ++/* ++ * CCDC cannot handle less than 2 pixels for input. ++ */ ++ if (input_w < 2) { ++ DPRINTK_ISPCCDC("ISP_ERR: CCDC cannot handle input width less" ++ " than 2 pixels\n"); ++ return -EINVAL; ++ } ++ ++/* ++ * If crop settings are issued then output size from CCDC ++ * will be equal to the crop window specified. ++ */ ++ ++ if (ispccdc_obj.crop_w) ++ *output_w = ispccdc_obj.crop_w; ++ else ++ *output_w = input_w; ++ ++ if (ispccdc_obj.crop_h) ++ *output_h = ispccdc_obj.crop_h; ++ else ++ *output_h = input_h; ++ ++ if ((!ispccdc_obj.refmt_en) && (ispccdc_obj.ccdc_outfmt != ++ CCDC_OTHERS_MEM)) ++ *output_h -= 1; ++ ++ if ((ispccdc_obj.ccdc_outfmt == CCDC_OTHERS_MEM) || ++ (ispccdc_obj.ccdc_outfmt == CCDC_OTHERS_VP_MEM)) { ++ if (*output_w % 16) { ++ *output_w -= (*output_w % 16); ++ *output_w += 16; ++ } ++ } ++ ++ ispccdc_obj.ccdcout_w = *output_w; ++ ispccdc_obj.ccdcout_h = *output_h; ++ ispccdc_obj.ccdcin_w = input_w; ++ ispccdc_obj.ccdcin_h = input_h; ++ ++ DPRINTK_ISPCCDC("try size: ccdcin_w=%u,ccdcin_h=%u,ccdcout_w=%u," ++ " ccdcout_h=%u\n", ++ ispccdc_obj.ccdcin_w, ++ ispccdc_obj.ccdcin_h, ++ ispccdc_obj.ccdcout_w, ++ ispccdc_obj.ccdcout_h); ++ ++ return 0; ++} ++EXPORT_SYMBOL(ispccdc_try_size); ++ ++/* ++ * Configures the appropriate values stored in the isp_ccdc structure to ++ * HORZ/VERT_INFO registers and the VP_OUT depending on whether the image ++ * is stored in memory or given to the another module in the ISP pipeline. ++ * input_w : input width for the CCDC in number of pixels per line ++ * input_h : input height for the CCDC in number of lines ++ * output_w : output width from the CCDC in number of pixels per line ++ * output_h : output height for the CCDC in number of lines ++ */ ++int ispccdc_config_size(u32 input_w, u32 input_h, u32 output_w, u32 output_h) ++{ ++ DPRINTK_ISPCCDC("config size: input_w=%u,input_h=%u,output_w=%u," ++ "output_h=%u\n", input_w, input_h, output_w, output_h); ++ ++ if ((output_w != ispccdc_obj.ccdcout_w) ++ || (output_h != ispccdc_obj.ccdcout_h)) { ++ DPRINTK_ISPCCDC("ISP_ERR : ispccdc_try_size should " ++ "be called before config size\n"); ++ return -EINVAL; ++ } ++ ++ if (ispccdc_obj.ccdc_outfmt == CCDC_OTHERS_VP) { ++ /* Start with 1 pixel apart */ ++ omap_writel((ispccdc_obj.ccdcin_woffset ++ << ISPCCDC_FMT_HORZ_FMTSPH_SHIFT) ++ | (ispccdc_obj.ccdcin_w ++ << ISPCCDC_FMT_HORZ_FMTLNH_SHIFT), ++ ISPCCDC_FMT_HORZ); ++ ++ omap_writel((ispccdc_obj.ccdcin_hoffset ++ << ISPCCDC_FMT_VERT_FMTSLV_SHIFT) ++ | ((ispccdc_obj.ccdcin_h) ++ << ISPCCDC_FMT_VERT_FMTLNV_SHIFT), ++ ISPCCDC_FMT_VERT); ++ ++ omap_writel((ispccdc_obj.ccdcout_w ++ << ISPCCDC_VP_OUT_HORZ_NUM_SHIFT) ++ | (ispccdc_obj.ccdcout_h ++ << ISPCCDC_VP_OUT_VERT_NUM_SHIFT), ++ ISPCCDC_VP_OUT); ++ omap_writel((((ispccdc_obj.ccdcout_h - 25) ++ & ISPCCDC_VDINT_0_MASK) ++ << ISPCCDC_VDINT_0_SHIFT) ++ | (((50) & ISPCCDC_VDINT_1_MASK) ++ << ISPCCDC_VDINT_1_SHIFT), ++ ISPCCDC_VDINT); ++ ++ } else if (ispccdc_obj.ccdc_outfmt == CCDC_OTHERS_MEM) { ++#ifndef CONFIG_ARCH_OMAP3410 ++#ifndef ENABLE_BT_656_CAPTURE ++ omap_writel(1 << ISPCCDC_HORZ_INFO_SPH_SHIFT ++ | ((ispccdc_obj.ccdcout_w - 1) ++ << ISPCCDC_HORZ_INFO_NPH_SHIFT), ++ ISPCCDC_HORZ_INFO); ++#else ++ omap_writel(0 << ISPCCDC_HORZ_INFO_SPH_SHIFT ++ | (((ispccdc_obj.ccdcout_w << 1) - 1) ++ << ISPCCDC_HORZ_INFO_NPH_SHIFT), ++ ISPCCDC_HORZ_INFO); ++#endif ++#else ++ omap_writel(0 << ISPCCDC_HORZ_INFO_SPH_SHIFT ++ | ((ispccdc_obj.ccdcout_w - 1) ++ << ISPCCDC_HORZ_INFO_NPH_SHIFT), ++ ISPCCDC_HORZ_INFO); ++#endif ++ ++#ifndef ENABLE_BT_656_CAPTURE ++ omap_writel(0 << ISPCCDC_VERT_START_SLV0_SHIFT, ++ ISPCCDC_VERT_START); ++ omap_writel((ispccdc_obj.ccdcout_h - 1) ++ << ISPCCDC_VERT_LINES_NLV_SHIFT, ++ ISPCCDC_VERT_LINES); ++#else ++ omap_writel(2 << ISPCCDC_VERT_START_SLV0_SHIFT | 2 << ISPCCDC_VERT_START_SLV1_SHIFT, ++ ISPCCDC_VERT_START); ++ omap_writel(((ispccdc_obj.ccdcout_h >> 1) - 1) ++ << ISPCCDC_VERT_LINES_NLV_SHIFT, ++ ISPCCDC_VERT_LINES); ++#endif ++ ++ /*Configure the HSIZE_OFF with output buffer width */ ++ ispccdc_config_outlineoffset(ispccdc_obj.ccdcout_w*2, 0, 0); ++ ++#ifndef ENABLE_BT_656_CAPTURE ++ omap_writel((((ispccdc_obj.ccdcout_h - 1) ++ & ISPCCDC_VDINT_0_MASK) ++ << ISPCCDC_VDINT_0_SHIFT) ++ | (((50) & ISPCCDC_VDINT_1_MASK) ++ << ISPCCDC_VDINT_1_SHIFT), ++ ISPCCDC_VDINT); ++#else ++ ispccdc_config_outlineoffset(ispccdc_obj.ccdcout_w*2, ++ EVENEVEN, 1); ++ ispccdc_config_outlineoffset(ispccdc_obj.ccdcout_w*2, ++ ODDEVEN, 1); ++ ispccdc_config_outlineoffset(ispccdc_obj.ccdcout_w*2, ++ EVENODD, 1); ++ ispccdc_config_outlineoffset(ispccdc_obj.ccdcout_w*2, ++ ODDODD, 1); ++ ++ omap_writel(((((ispccdc_obj.ccdcout_h >> 1) - 1) ++ & ISPCCDC_VDINT_0_MASK) ++ << ISPCCDC_VDINT_0_SHIFT) ++ | (((50) & ISPCCDC_VDINT_1_MASK) ++ << ISPCCDC_VDINT_1_SHIFT), ++ ISPCCDC_VDINT); ++#endif ++ } else if (ispccdc_obj.ccdc_outfmt == CCDC_OTHERS_VP_MEM) { ++ /* Start with 1 pixel apart */ ++ omap_writel((1 << ISPCCDC_FMT_HORZ_FMTSPH_SHIFT) ++ | (ispccdc_obj.ccdcin_w ++ << ISPCCDC_FMT_HORZ_FMTLNH_SHIFT), ++ ISPCCDC_FMT_HORZ); ++ ++ omap_writel((0 << ISPCCDC_FMT_VERT_FMTSLV_SHIFT) ++ | ((ispccdc_obj.ccdcin_h) ++ << ISPCCDC_FMT_VERT_FMTLNV_SHIFT), ++ ISPCCDC_FMT_VERT); ++ ++ omap_writel((ispccdc_obj.ccdcout_w ++ << ISPCCDC_VP_OUT_HORZ_NUM_SHIFT) ++ | (ispccdc_obj.ccdcout_h ++ << ISPCCDC_VP_OUT_VERT_NUM_SHIFT), ++ ISPCCDC_VP_OUT); ++ omap_writel(0 << ISPCCDC_HORZ_INFO_SPH_SHIFT ++ | ((ispccdc_obj.ccdcout_w - 1) ++ << ISPCCDC_HORZ_INFO_NPH_SHIFT), ++ ISPCCDC_HORZ_INFO); ++ omap_writel(0 << ISPCCDC_VERT_START_SLV0_SHIFT, ++ ISPCCDC_VERT_START); ++ omap_writel((ispccdc_obj.ccdcout_h - 1) ++ << ISPCCDC_VERT_LINES_NLV_SHIFT, ++ ISPCCDC_VERT_LINES); ++ /*Configure the HSIZE_OFF with output buffer width*/ ++ ispccdc_config_outlineoffset(ispccdc_obj.ccdcout_w*2, 0, 0); ++ omap_writel((((ispccdc_obj.ccdcout_h - 25) ++ & ISPCCDC_VDINT_0_MASK) ++ << ISPCCDC_VDINT_0_SHIFT) ++ | (((50) & ISPCCDC_VDINT_1_MASK) ++ << ISPCCDC_VDINT_1_SHIFT), ++ ISPCCDC_VDINT); ++ } ++#ifdef USE_ISP_LSC ++ if (ispccdc_obj.ccdc_inpfmt == CCDC_RAW) { ++ ispccdc_config_lsc(&lsc_config); ++ ispccdc_load_lsc(lsc_config.size); ++ } ++#endif ++ return 0; ++} ++EXPORT_SYMBOL(ispccdc_config_size); ++ ++/* ++ * Configures the output line offset when stored in memory. ++ * Configures the num of even and odd line fields in case of rearranging ++ * the lines ++ * offset: twice the Output width and aligned on 32byte boundary. ++ * oddeven: odd/even line pattern to be chosen to store the output ++ * numlines: Configure the value 0-3 for +1-4lines, 4-7 for -1-4lines ++ */ ++int ispccdc_config_outlineoffset(u32 offset, u8 oddeven, u8 numlines) ++{ ++ ++ ++ /* ++ * Make sure offset is multiple of 32bytes. ie last 5bits should be ++ * zero ++ */ ++ if ((offset & ISP_32B_BOUNDARY_OFFSET) == offset) ++ omap_writel((offset&0xFFFF), ISPCCDC_HSIZE_OFF); ++ else { ++ DPRINTK_ISPCCDC("ISP_ERR : Offset should be in 32 byte \ ++ boundary"); ++ return -EINVAL; ++ } ++ ++ /*0 - By default Donot inverse the field identification */ ++ omap_writel((omap_readl(ISPCCDC_SDOFST) & (~ISPCCDC_SDOFST_FINV)), ++ ISPCCDC_SDOFST); ++ ++ /*0 - By default one line offset*/ ++ omap_writel(omap_readl(ISPCCDC_SDOFST) & ISPCCDC_SDOFST_FOFST_1L, ++ ISPCCDC_SDOFST); ++ ++ switch (oddeven) { ++ case EVENEVEN: /*even lines even fields*/ ++ omap_writel((omap_readl(ISPCCDC_SDOFST))| ++ ((numlines & 0x7) << ISPCCDC_SDOFST_LOFST0_SHIFT) ++ , ISPCCDC_SDOFST); ++ break; ++ case ODDEVEN: /*odd lines even fields*/ ++ omap_writel((omap_readl(ISPCCDC_SDOFST))| ++ ((numlines & 0x7) << ISPCCDC_SDOFST_LOFST1_SHIFT) ++ , ISPCCDC_SDOFST); ++ break; ++ case EVENODD: /*even lines odd fields*/ ++ omap_writel((omap_readl(ISPCCDC_SDOFST)) | ++ ((numlines & 0x7) << ISPCCDC_SDOFST_LOFST2_SHIFT) ++ , ISPCCDC_SDOFST); ++ break; ++ case ODDODD: /*odd lines odd fields*/ ++ omap_writel((omap_readl(ISPCCDC_SDOFST)) | ++ ((numlines & 0x7) << ISPCCDC_SDOFST_LOFST3_SHIFT) ++ , ISPCCDC_SDOFST); ++ break; ++ default: ++ break; ++ } ++ return 0; ++} ++EXPORT_SYMBOL(ispccdc_config_outlineoffset); ++ ++/* ++ * Configures the memory address where the output should be stored. ++ * addr : 32bit memory address aligned on 32 bit boundary. ++ */ ++int ispccdc_set_outaddr(u32 addr) ++{ ++ if ((addr & ISP_32B_BOUNDARY_BUF) == addr) { ++ omap_writel(addr, ISPCCDC_SDR_ADDR); ++ return 0; ++ } else { ++ DPRINTK_ISPCCDC("ISP_ERR : Address should be in 32 byte \ ++ boundary"); ++ return -EINVAL; ++ } ++ ++} ++EXPORT_SYMBOL(ispccdc_set_outaddr); ++ ++/* ++ * ++ * Enables the CCDC module. ++ * Client should configure all the sub modules in CCDC before this. ++ * enable : 1- Enables the preview module. ++ */ ++void ispccdc_enable(u8 enable) ++{ ++ if (enable) ++ omap_writel(omap_readl(ISPCCDC_PCR) | (ISPCCDC_PCR_EN), ++ ISPCCDC_PCR); ++ else ++ omap_writel(omap_readl(ISPCCDC_PCR) & ~(ISPCCDC_PCR_EN), ++ ISPCCDC_PCR); ++} ++EXPORT_SYMBOL(ispccdc_enable); ++ ++#ifdef ENABLE_BT_656_CAPTURE ++/* ++ * Configures the location of Y color component when YCbCr 8-bit data is input ++ */ ++void ispccdc_config_y8pos(enum y8pos_mode mode) ++{ ++ if (mode == Y8POS_EVEN) ++ omap_writel(omap_readl(ISPCCDC_CFG) & ~(ISPCCDC_CFG_Y8POS), ++ ISPCCDC_CFG); ++ else ++ omap_writel(omap_readl(ISPCCDC_CFG) | (ISPCCDC_CFG_Y8POS), ++ ISPCCDC_CFG); ++} ++EXPORT_SYMBOL(ispccdc_config_y8pos); ++ ++/* ++ * Configures byte swap data stored in memory. 1 - swap bytes, 0 - normal ++ */ ++void ispccdc_config_byteswap(int swap) ++{ ++ if (swap) ++ omap_writel(omap_readl(ISPCCDC_CFG) | (ISPCCDC_CFG_BSWD), ++ ISPCCDC_CFG); ++ else ++ omap_writel(omap_readl(ISPCCDC_CFG) & ~(ISPCCDC_CFG_BSWD), ++ ISPCCDC_CFG); ++} ++EXPORT_SYMBOL(ispccdc_config_byteswap); ++#endif ++ ++int ispccdc_busy(void) ++{ ++ return (omap_readl(ISPCCDC_PCR) & ISPCCDC_PCR_BUSY); ++} ++EXPORT_SYMBOL(ispccdc_busy); ++ ++/* ++ * Saves the values of the CCDC module registers. ++ */ ++void ispccdc_save_context(void) ++{ ++ DPRINTK_ISPCCDC(" Saving context \n"); ++ isp_save_context(ispccdc_reg_list); ++ ++} ++EXPORT_SYMBOL(ispccdc_save_context); ++ ++/* ++ * Restores the values of the CCDC module registers. ++ */ ++void ispccdc_restore_context(void) ++{ ++ DPRINTK_ISPCCDC(" Restoring context\n"); ++ isp_restore_context(ispccdc_reg_list); ++} ++EXPORT_SYMBOL(ispccdc_restore_context); ++ ++/* ++ * Prints the values of the CCDC Module registers ++ * Also prints other debug information stored in the CCDC module ++ */ ++void ispccdc_print_status(void) ++{ ++#ifdef OMAP_ISPCCDC_DEBUG ++ DPRINTK_ISPCCDC("Module in use =%d\n", ispccdc_obj.ccdc_inuse); ++ DPRINTK_ISPCCDC("Accepted CCDC Input (width = %d,Height = %d)\n", ++ ispccdc_obj.ccdcin_w, ++ ispccdc_obj.ccdcin_h); ++ DPRINTK_ISPCCDC("Accepted CCDC Output (width = %d,Height = %d)\n", ++ ispccdc_obj.ccdcout_w, ++ ispccdc_obj.ccdcout_h); ++ ++ DPRINTK_ISPCCDC("###CCDC PCR=0x%x\n", omap_readl(ISPCCDC_PCR)); ++ DPRINTK_ISPCCDC("ISP_CTRL =0x%x\n", omap_readl(ISP_CTRL)); ++ switch (ispccdc_obj.ccdc_inpfmt) { ++ case CCDC_RAW: ++ DPRINTK_ISPCCDC("ccdc input format is CCDC_RAW\n"); ++ break; ++ case CCDC_YUV_SYNC: ++ DPRINTK_ISPCCDC("ccdc input format is CCDC_YUV_SYNC\n"); ++ break; ++ case CCDC_YUV_BT: ++ DPRINTK_ISPCCDC("ccdc input format is CCDC_YUV_BT\n"); ++ break; ++ ++ } ++ switch (ispccdc_obj.ccdc_outfmt) { ++ case CCDC_OTHERS_VP: ++ DPRINTK_ISPCCDC("ccdc output format is CCDC_OTHERS_VP\n"); ++ break; ++ case CCDC_OTHERS_MEM: ++ DPRINTK_ISPCCDC("ccdc output format is CCDC_OTHERS_MEM\n"); ++ break; ++ case CCDC_YUV_RSZ: ++ DPRINTK_ISPCCDC("ccdc output format is CCDC_YUV_RSZ\n"); ++ break; ++ } ++ DPRINTK_ISPCCDC("###ISP_CTRL in ccdc =0x%x\n", omap_readl(ISP_CTRL)); ++ DPRINTK_ISPCCDC("###ISP_IRQ0ENABLE in ccdc =0x%x\n", ++ omap_readl(ISP_IRQ0ENABLE)); ++ DPRINTK_ISPCCDC("###ISP_IRQ0STATUS in ccdc =0x%x\n", ++ omap_readl(ISP_IRQ0STATUS)); ++ DPRINTK_ISPCCDC("###CCDC SYN_MODE=0x%x\n", ++ omap_readl(ISPCCDC_SYN_MODE)); ++ DPRINTK_ISPCCDC("###CCDC HORZ_INFO=0x%x\n", ++ omap_readl(ISPCCDC_HORZ_INFO)); ++ DPRINTK_ISPCCDC("###CCDC VERT_START=0x%x\n", ++ omap_readl(ISPCCDC_VERT_START)); ++ DPRINTK_ISPCCDC("###CCDC VERT_LINES=0x%x\n", ++ omap_readl(ISPCCDC_VERT_LINES)); ++ DPRINTK_ISPCCDC("###CCDC CULLING=0x%x\n", omap_readl(ISPCCDC_CULLING)); ++ DPRINTK_ISPCCDC("###CCDC HSIZE_OFF=0x%x\n", ++ omap_readl(ISPCCDC_HSIZE_OFF)); ++ DPRINTK_ISPCCDC("###CCDC SDOFST=0x%x\n", omap_readl(ISPCCDC_SDOFST)); ++ DPRINTK_ISPCCDC("###CCDC SDR_ADDR=0x%x\n", ++ omap_readl(ISPCCDC_SDR_ADDR)); ++ DPRINTK_ISPCCDC("###CCDC CLAMP=0x%x\n", omap_readl(ISPCCDC_CLAMP)); ++ DPRINTK_ISPCCDC("###CCDC COLPTN=0x%x\n", omap_readl(ISPCCDC_COLPTN)); ++ DPRINTK_ISPCCDC("###CCDC CFG=0x%x\n", omap_readl(ISPCCDC_CFG)); ++ DPRINTK_ISPCCDC("###CCDC VP_OUT=0x%x\n", omap_readl(ISPCCDC_VP_OUT)); ++ DPRINTK_ISPCCDC("###CCDC_SDR_ADDR= 0x%x\n", ++ omap_readl(ISPCCDC_SDR_ADDR)); ++ DPRINTK_ISPCCDC("###CCDC FMTCFG=0x%x\n", omap_readl(ISPCCDC_FMTCFG)); ++ DPRINTK_ISPCCDC("###CCDC FMT_HORZ=0x%x\n", ++ omap_readl(ISPCCDC_FMT_HORZ)); ++ DPRINTK_ISPCCDC("###CCDC FMT_VERT=0x%x\n", ++ omap_readl(ISPCCDC_FMT_VERT)); ++ DPRINTK_ISPCCDC("###CCDC LSC_CONFIG=0x%x\n", ++ omap_readl(ISPCCDC_LSC_CONFIG)); ++ DPRINTK_ISPCCDC("###CCDC LSC_INIT=0x%x\n", ++ omap_readl(ISPCCDC_LSC_INITIAL)); ++ DPRINTK_ISPCCDC("###CCDC LSC_TABLE BASE=0x%x\n", ++ omap_readl(ISPCCDC_LSC_TABLE_BASE)); ++ DPRINTK_ISPCCDC("###CCDC LSC TABLE OFFSET=0x%x\n", ++ omap_readl(ISPCCDC_LSC_TABLE_OFFSET)); ++#endif ++} ++EXPORT_SYMBOL(ispccdc_print_status); ++ ++/* ++ * Module Initialisation. ++ */ ++static int __init isp_ccdc_init(void) ++{ ++ ispccdc_obj.ccdc_inuse = 0; ++ ispccdc_config_crop(0, 0, 0, 0); ++ init_MUTEX(&(ispccdc_obj.semlock)); ++ ++#ifdef USE_ISP_LSC ++ lsc_config.initial_x = 0; ++ lsc_config.initial_y = 0; ++ lsc_config.gain_mode_n = 0x06; ++ lsc_config.gain_mode_m = 0x06; ++ lsc_config.gain_format = 0x04; ++ lsc_config.offset = 0x60; ++ lsc_config.size = sizeof(ispccdc_lsc_tbl); ++ ccdc_use_lsc = 1; ++#endif ++ ++ return 0; ++} ++ ++static void isp_ccdc_cleanup(void) ++{ ++#ifdef USE_ISP_LSC ++ if (lsc_initialized) { ++ ispmmu_unmap(lsc_ispmmu_addr); ++ kfree(lsc_gain_table); ++ lsc_initialized = 0; ++ } ++#endif ++ if (fpc_table_add_m != 0) { ++ ispmmu_unmap(fpc_table_add_m); ++ kfree(fpc_table_add); ++ } ++} ++ ++module_init(isp_ccdc_init); ++module_exit(isp_ccdc_cleanup); ++ ++ ++MODULE_AUTHOR("Texas Instruments"); ++MODULE_DESCRIPTION("ISP CCDC Library"); ++MODULE_LICENSE("GPL"); +Index: git/drivers/media/video/isp/ispccdc.h +=================================================================== +--- /dev/null 1970-01-01 00:00:00.000000000 +0000 ++++ git/drivers/media/video/isp/ispccdc.h 2009-02-12 10:29:26.000000000 -0600 +@@ -0,0 +1,342 @@ ++/* ++ * drivers/media/video/isp/ispccdc.h ++ * ++ * Driver include file for CCDC module in TI's OMAP3430 Camera ISP ++ * ++ * Copyright (C) 2008 Texas Instruments, Inc. ++ * ++ * This package 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 PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR ++ * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED ++ * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. ++ */ ++ ++#ifndef OMAP_ISP_CCDC_H ++#define OMAP_ISP_CCDC_H ++ ++/*Abstraction layer CCDC configurations*/ ++#define ISP_ABS_CCDC_ALAW (1 << 0) ++#define ISP_ABS_CCDC_LPF (1 << 1) ++#define ISP_ABS_CCDC_BLCLAMP (1 << 2) ++#define ISP_ABS_CCDC_BCOMP (1 << 3) ++#define ISP_ABS_CCDC_FPC (1 << 4) ++#define ISP_ABS_CCDC_CULL (1 << 5) ++#define ISP_ABS_CCDC_COLPTN (1 << 6) ++#define ISP_ABS_CCDC_CONFIG_LSC (1 << 7) ++ ++#define ISP_ABS_TBL_LSC (1 << 0) ++ ++#ifndef CONFIG_ARCH_OMAP3410 ++ #include "isppreview.h" ++#endif ++ ++int ispccdc_request(void); ++ ++int ispccdc_free(void); ++ ++/*Enumeration constants for CCDC input output format */ ++enum ccdc_input { ++ CCDC_RAW, ++ CCDC_YUV_SYNC, ++ CCDC_YUV_BT, ++ CCDC_OTHERS ++}; ++enum ccdc_output { ++ CCDC_YUV_RSZ, ++ CCDC_YUV_MEM_RSZ, ++ CCDC_OTHERS_VP, ++ CCDC_OTHERS_MEM, ++ CCDC_OTHERS_VP_MEM ++}; ++ ++/* ++ * Sets up the default CCDC configuration according to the arguments. ++ */ ++int ispccdc_config_datapath(enum ccdc_input input, enum ccdc_output output); ++ ++/* ++ * Configures the crop settings in the CCDC module. ++ */ ++void ispccdc_config_crop(u32 left, u32 top, u32 height, u32 width); ++ ++/* Enumeration constants for the sync interface parameters */ ++enum inpmode { ++ RAW, ++ YUV16, ++ YUV8 ++}; ++enum datasize { ++ DAT8, ++ DAT10, ++ DAT11, ++ DAT12 ++}; ++ ++#ifdef ENABLE_BT_656_CAPTURE ++/* ++ * Configure location of Y component in 8-bit YUV data input ++ */ ++enum y8pos_mode { ++ Y8POS_EVEN = 0, ++ Y8POS_ODD = 1 ++}; ++#endif ++ ++/* Structure for the Sync Interface between the sensor and CCDC*/ ++struct ispccdc_syncif { ++ /* 1 - Master, 0- Slave */ ++ u8 ccdc_mastermode; ++ /* 0 - Odd Field, 1- Even Field */ ++ u8 fldstat; ++ enum inpmode ipmod; ++ enum datasize datsz; ++ /* 0 -Progressive Mode, 1 -Interlaced Mode */ ++ u8 fldmode; ++ /* 0 -Positive, 1 - Negative */ ++ u8 datapol; ++ /* 0 -Positive, 1 - Negative */ ++ u8 fldpol; ++ /* 0 -Positive, 1 - Negative */ ++ u8 hdpol; ++ /* 0 -Positive, 1 - Negative */ ++ u8 vdpol; ++ /* 0 -Input, 1 - Output */ ++ u8 fldout; ++ /* Width of the Horizontal Sync pulse - used for HS/VS Output*/ ++ u8 hs_width; ++ /* Width of the Vertical Sync pulse - used for HS/VS Output*/ ++ u8 vs_width; ++ /*Number of pixels per line - used for HS/VS Output*/ ++ u8 ppln; ++ /*Number of half lines per frame - used for HS/VS Output*/ ++ u8 hlprf; ++ /*1 - Enable ITU-R BT656 mode, 0 - Sync mode*/ ++ u8 bt_r656_en; ++}; ++ ++/* Structure for LSC configuration*/ ++struct ispccdc_lsc_config { ++ u8 offset; ++ u8 gain_mode_n; ++ u8 gain_mode_m; ++ u8 gain_format; ++ u16 fmtsph; ++ u16 fmtlnh; ++ u16 fmtslv; ++ u16 fmtlnv; ++ u8 initial_x; ++ u8 initial_y; ++ u32 size; ++}; ++ ++/* ++ * Configures the sync interface parameters between the sensor and the CCDC. ++ */ ++void ispccdc_config_sync_if(struct ispccdc_syncif syncif); ++ ++/* Structure for the optical black Clamp and Digital black Clamp subtract*/ ++struct ispccdc_bclamp{ ++ /*Optical black average gain*/ ++ u8 obgain; ++ /*Start Pixel w.r.t. HS pulse in Optical black sample*/ ++ u8 obstpixel; ++ /*Optical Black Sample lines*/ ++ u8 oblines; ++ /*Optical Black Sample Length*/ ++ u8 oblen; ++ /*Digital Black Clamp subtract value */ ++ u16 dcsubval; ++ }; ++ ++/* ++ * Configures the optical/digital black clamp parameters in CCDC. ++ */ ++int ispccdc_config_black_clamp(struct ispccdc_bclamp bclamp); ++ ++/* ++ * Enables the optical or Digital black clamp. ++ */ ++void ispccdc_enable_black_clamp(u8 enable); ++ ++/* Structure for FPC */ ++struct ispccdc_fpc{ ++ /* Number of faulty pixels to be corrected in the frame*/ ++ u16 fpnum; ++ /* Memory address of the FPC Table */ ++ u32 fpcaddr; ++ }; ++ ++/* ++ * Configures the Faulty Pixel Correction parameters. ++ */ ++int ispccdc_config_fpc(struct ispccdc_fpc fpc); ++ ++/* ++ * Enables the Faulty Pixel Correction. ++ * enable : : 1- Enables FPC ++ */ ++void ispccdc_enable_fpc(u8 enable); ++ ++/* Structure for Black Level Compensation parameters*/ ++struct ispccdc_blcomp{ ++ u8 b_mg; ++ u8 gb_g; ++ u8 gr_cy; ++ u8 r_ye; ++ }; ++ ++/* ++ * Configures the Black Level Compensation parameters. ++ */ ++void ispccdc_config_black_comp(struct ispccdc_blcomp blcomp); ++ ++/* Enumeration constants for Video Port */ ++enum vpin { ++ BIT12_3 = 3, ++ BIT11_2 = 4, ++ BIT10_1 = 5, ++ BIT9_0 = 6 ++}; ++enum vpif_freq { ++ PIXCLKBY2, ++ PIXCLKBY3_5, ++ PIXCLKBY4_5, ++ PIXCLKBY5_5, ++ PIXCLKBY6_5 ++}; ++ ++/*Structure for Video Port parameters */ ++struct ispccdc_vp { ++ enum vpin bitshift_sel; ++ enum vpif_freq freq_sel; ++}; ++ ++/* ++ * Configures the Video Port Configuration parameters. ++ */ ++void ispccdc_config_vp(struct ispccdc_vp vp); ++ ++/* ++ * Enables the Video Port. ++ */ ++void ispccdc_enable_vp(u8 enable); ++ ++/* Structure for Reformatter parameters */ ++struct ispccdc_refmt{ ++ u8 lnalt; ++ u8 lnum; ++ u8 plen_even; ++ u8 plen_odd; ++ u32 prgeven0; ++ u32 prgeven1; ++ u32 prgodd0; ++ u32 prgodd1; ++ u32 fmtaddr0; ++ u32 fmtaddr1; ++ u32 fmtaddr2; ++ u32 fmtaddr3; ++ u32 fmtaddr4; ++ u32 fmtaddr5; ++ u32 fmtaddr6; ++ u32 fmtaddr7; ++}; ++ ++/* ++ * Configures the Reformatter register values if line alternating is disabled. ++ * else just enabling the line alternating is enough. ++ */ ++void ispccdc_config_reformatter(struct ispccdc_refmt refmt); ++ ++/* ++ * Enables the Reformatter ++ */ ++void ispccdc_enable_reformatter(u8 enable); ++ ++/* Structure for Culling parameters */ ++struct ispccdc_culling{ ++ /* Vertical culling pattern */ ++ u8 v_pattern; ++ /* Horizontal Culling pattern for odd lines */ ++ u16 h_odd; ++ /* Horizontal Culling pattern for even lines */ ++ u16 h_even; ++}; ++ ++/* ++ * Configures the Culling parameters. ++ */ ++void ispccdc_config_culling(struct ispccdc_culling culling); ++ ++/* ++ * Enables the Low pass Filter ++ */ ++void ispccdc_enable_lpf(u8 enable); ++ ++/* Enumeration constants for Alaw input width */ ++enum alaw_ipwidth{ ++ ALAW_BIT12_3 = 0x3, ++ ALAW_BIT11_2 = 0x4, ++ ALAW_BIT10_1 = 0x5, ++ ALAW_BIT9_0 = 0x6 ++}; ++ ++/* Structure for CCDC configuration*/ ++struct ispccdc_update_config { ++ u16 update; ++ u16 flag; ++ enum alaw_ipwidth alawip; ++ struct ispccdc_bclamp *bclamp; ++ struct ispccdc_blcomp *blcomp; ++ struct ispccdc_fpc *fpc; ++ struct ispccdc_lsc_config *lsc_cfg; ++ struct ispccdc_culling *cull; ++ u32 colptn; ++}; ++ ++ ++void ispccdc_config_alaw(enum alaw_ipwidth ipwidth); ++ ++void ispccdc_enable_alaw(u8 enable); ++ ++int ispccdc_load_lsc(u32 table_size); ++ ++void ispccdc_config_lsc(struct ispccdc_lsc_config *lsc_cfg); ++ ++void ispccdc_enable_lsc(u8 enable); ++ ++void ispccdc_config_imgattr(u32 colptn); ++ ++void ispccdc_config_shadow_registers(void); ++ ++int ispccdc_try_size(u32 input_w, u32 input_h, u32 *output_w, u32 *output_h); ++ ++int ispccdc_config_size(u32 input_w, u32 input_h, u32 output_w, u32 output_h); ++ ++int ispccdc_config_outlineoffset(u32 offset, u8 oddeven, u8 numlines); ++ ++int ispccdc_set_outaddr(u32 addr); ++ ++void ispccdc_enable(u8 enable); ++ ++#ifdef ENABLE_BT_656_CAPTURE ++void ispccdc_config_y8pos(enum y8pos_mode mode); ++ ++void ispccdc_config_byteswap(int swap); ++#endif ++ ++int ispccdc_busy(void); ++ ++void ispccdc_save_context(void); ++ ++void ispccdc_restore_context(void); ++ ++void ispccdc_print_status(void); ++ ++int omap34xx_isp_ccdc_config(void *userspace_add); ++ ++int omap34xx_isp_lsc_update(void *userspace_add); ++ ++#endif /* OMAP_ISP_CCDC_H */ +Index: git/drivers/media/video/isp/isph3a.c +=================================================================== +--- /dev/null 1970-01-01 00:00:00.000000000 +0000 ++++ git/drivers/media/video/isp/isph3a.c 2009-02-12 10:29:18.000000000 -0600 +@@ -0,0 +1,901 @@ ++/* ++ * drivers/media/video/omap/isp/isph3a.c ++ * ++ * H3A module for TI's OMAP3430 Camera ISP ++ * ++ * Copyright (C) 2008 Texas Instruments, Inc. ++ * ++ * This package 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 PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR ++ * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED ++ * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. ++ */ ++ ++#include <linux/mm.h> ++#include <linux/mman.h> ++#include <linux/syscalls.h> ++#include <linux/module.h> ++#include <linux/errno.h> ++#include <linux/types.h> ++#include <linux/dma-mapping.h> ++#include <asm/io.h> ++#include <asm/cacheflush.h> ++#include <asm/uaccess.h> ++ ++#include "isp.h" ++#include "ispreg.h" ++#include "isph3a.h" ++#include "ispmmu.h" ++#include "isppreview.h" ++ ++ ++struct isph3a_aewb_buffer { ++ unsigned long virt_addr; ++ unsigned long phy_addr; ++ unsigned long addr_align; ++ unsigned long ispmmu_addr; ++ unsigned long mmap_addr; /* For userspace */ ++ ++ u8 locked; ++ u16 frame_num; ++ struct isph3a_aewb_buffer *next; ++}; ++ ++static struct isph3a_aewb_status { ++ u8 initialized; ++ u8 update; ++ u8 stats_req; ++ u8 stats_done; ++ u16 frame_req; ++ ++ struct isph3a_aewb_buffer h3a_buff[H3A_MAX_BUFF]; ++ unsigned int stats_buf_size; ++ unsigned int min_buf_size; ++ ++ u16 win_count; ++ u32 frame_count; ++ wait_queue_head_t stats_wait; ++ spinlock_t buffer_lock; ++} aewbstat; ++ ++static struct isph3a_aewb_regs { ++ u32 reg_pcr; ++ u32 reg_win1; ++ u32 reg_start; ++ u32 reg_blk; ++ u32 reg_subwin; ++} aewb_regs; ++ ++static struct isph3a_aewb_config aewb_config_local = { ++ .saturation_limit = 0x3FF, ++ .win_height = 0, /* Range: 2 - 256 even values only */ ++ .win_width = 0, /* Range: 6 - 256 even values only */ ++ .ver_win_count = 0, /* Range: 1 - 128 */ ++ .hor_win_count = 0, /* Range: 1 - 36 */ ++ .ver_win_start = 0, /* Range: 0 - 4095 */ ++ .hor_win_start = 0, /* Range: 0 - 4095 */ ++ .blk_ver_win_start = 0, /* Range: 0 - 4095 */ ++ .blk_win_height = 0, /* Range: 2 - 256 even values only */ ++ .subsample_ver_inc = 0, /* Range: 2 - 32 even values only */ ++ .subsample_hor_inc = 0, /* Range: 2 - 32 even values only */ ++ .alaw_enable = 0, /* AEW ALAW EN flag */ ++ .aewb_enable = 0, /* AE AWB stats generation EN flag */ ++}; /* With reset values */ ++ ++ ++/* Structure for saving/restoring h3a module registers*/ ++static struct isp_reg isph3a_reg_list[] = { ++ {ISPH3A_AEWWIN1, 0x0000}, ++ {ISPH3A_AEWINSTART, 0x0000}, ++ {ISPH3A_AEWINBLK, 0x0000}, ++ {ISPH3A_AEWSUBWIN, 0x0000}, ++ {ISPH3A_AEWBUFST, 0x0000}, ++ {ISPH3A_AFPAX1, 0x0000}, ++ {ISPH3A_AFPAX2, 0x0000}, ++ {ISPH3A_AFPAXSTART, 0x0000}, ++ {ISPH3A_AFIIRSH, 0x0000}, ++ {ISPH3A_AFBUFST, 0x0000}, ++ {ISPH3A_AFCOEF010, 0x0000}, ++ {ISPH3A_AFCOEF032, 0x0000}, ++ {ISPH3A_AFCOEF054, 0x0000}, ++ {ISPH3A_AFCOEF076, 0x0000}, ++ {ISPH3A_AFCOEF098, 0x0000}, ++ {ISPH3A_AFCOEF0010, 0x0000}, ++ {ISPH3A_AFCOEF110, 0x0000}, ++ {ISPH3A_AFCOEF132, 0x0000}, ++ {ISPH3A_AFCOEF154, 0x0000}, ++ {ISPH3A_AFCOEF176, 0x0000}, ++ {ISPH3A_AFCOEF198, 0x0000}, ++ {ISPH3A_AFCOEF1010, 0x0000}, ++ {ISP_TOK_TERM, 0x0000} ++}; ++ ++static struct ispprev_wbal h3awb_update; /* Keep changes in AEWB gains */ ++static struct isph3a_aewb_buffer *active_buff; ++static struct isph3a_aewb_xtrastats h3a_xtrastats[H3A_MAX_BUFF]; ++static int camnotify; ++static int wb_update; ++static void isph3a_print_status(void); ++ ++void isph3a_aewb_setxtrastats(struct isph3a_aewb_xtrastats *xtrastats) ++{ ++ int i; ++ if (active_buff == NULL) ++ return; ++ ++ for (i = 0; i < H3A_MAX_BUFF; i++) { ++ if (aewbstat.h3a_buff[i].frame_num == active_buff->frame_num) { ++ if (i == 0) { ++ if (aewbstat.h3a_buff[H3A_MAX_BUFF - 1]. ++ locked == 0) ++ h3a_xtrastats[H3A_MAX_BUFF - 1] = ++ *xtrastats; ++ else ++ h3a_xtrastats[H3A_MAX_BUFF - 2] = ++ *xtrastats; ++ } else if (i == 1) { ++ if (aewbstat.h3a_buff[0].locked == 0) ++ h3a_xtrastats[0] = *xtrastats; ++ else ++ h3a_xtrastats[H3A_MAX_BUFF - 1] = ++ *xtrastats; ++ } else { ++ if (aewbstat.h3a_buff[i - 1].locked == 0) ++ h3a_xtrastats[i - 1] = *xtrastats; ++ else ++ h3a_xtrastats[i - 2] = *xtrastats; ++ } ++ return; ++ } ++ } ++} ++EXPORT_SYMBOL(isph3a_aewb_setxtrastats); ++ ++/* ++ * Enables AEW engine in the H3A module. ++ * Client should configure all the AE & AWB registers in H3A before this. ++ * enable : 1- Enables the AE & AWB engine. ++ */ ++static void ++isph3a_aewb_enable(u8 enable) ++{ ++ /* Before enabling AEWB we need to clear H3A bit in IRQ0 status reg */ ++ omap_writel(IRQ0STATUS_H3A_AWB_DONE_IRQ, ISP_IRQ0STATUS); ++ ++ if (enable) { ++ aewb_regs.reg_pcr |= ISPH3A_PCR_AEW_EN; ++ omap_writel(omap_readl(ISPH3A_PCR) | (ISPH3A_PCR_AEW_EN), ++ ISPH3A_PCR); ++ DPRINTK_ISPH3A(" H3A enabled \n"); ++ } else { ++ aewb_regs.reg_pcr &= ~ISPH3A_PCR_AEW_EN; ++ omap_writel(omap_readl(ISPH3A_PCR) & ~(ISPH3A_PCR_AEW_EN), ++ ISPH3A_PCR); ++ DPRINTK_ISPH3A(" H3A disabled \n"); ++ } ++ aewb_config_local.aewb_enable = enable; ++} ++ ++/* ++ * Updates WB parameters. Needs to be called when no ISP Preview processing is ++ * taking place. ++ */ ++void ++isph3a_update_wb(void) ++{ ++ if (wb_update) { ++ isppreview_config_whitebalance(h3awb_update); ++ wb_update = 0; ++ } ++ return; ++} ++EXPORT_SYMBOL(isph3a_update_wb); ++ ++/* ++ * Helper function to update h3a registers ++ */ ++static void ++isph3a_aewb_update_regs(void) ++{ ++ omap_writel(aewb_regs.reg_pcr, ISPH3A_PCR); ++ omap_writel(aewb_regs.reg_win1, ISPH3A_AEWWIN1); ++ omap_writel(aewb_regs.reg_start, ISPH3A_AEWINSTART); ++ omap_writel(aewb_regs.reg_blk, ISPH3A_AEWINBLK); ++ omap_writel(aewb_regs.reg_subwin, ISPH3A_AEWSUBWIN); ++ ++ aewbstat.update = 0; ++ aewbstat.frame_count = 0; ++} ++ ++/* ++ * Helper function to update buffer cache pages ++ */ ++static void ++isph3a_aewb_update_req_buffer(struct isph3a_aewb_buffer *buffer) ++{ ++ int size = aewbstat.stats_buf_size; ++ ++ size = PAGE_ALIGN(size); ++ /* Update the kernel pages of the requested buffer */ ++ dmac_inv_range((void *)buffer->addr_align, ++ (void *)buffer->addr_align + size); ++} ++ ++/* ++ * Helper function to check for stats available of specified frame ++ * Returns 0 if stats available for frame requested; -1 otherwise. ++ */ ++static int ++isph3a_aewb_stats_available(struct isph3a_aewb_data *aewbdata) ++{ ++ int i; ++ unsigned long irqflags; ++ ++ spin_lock_irqsave(&aewbstat.buffer_lock, irqflags); ++ for (i = 0; i < H3A_MAX_BUFF; i++) { ++ if ((aewbdata->frame_number == aewbstat.h3a_buff[i].frame_num) ++ && (aewbstat.h3a_buff[i].frame_num != ++ active_buff->frame_num)) { ++ aewbstat.h3a_buff[i].locked = 1; ++ spin_unlock_irqrestore(&aewbstat.buffer_lock, irqflags); ++ isph3a_aewb_update_req_buffer(&aewbstat.h3a_buff[i]); ++ aewbstat.h3a_buff[i].frame_num = 0; ++ aewbdata->h3a_aewb_statistics_buf = (void *) ++ aewbstat.h3a_buff[i].mmap_addr; ++ aewbdata->ts = h3a_xtrastats[i].ts; ++ aewbdata->field_count = h3a_xtrastats[i].field_count; ++ return 0; ++ } ++ } ++ spin_unlock_irqrestore(&aewbstat.buffer_lock, irqflags); ++ /* Stats unavailable */ ++ ++ aewbdata->h3a_aewb_statistics_buf = NULL; ++ return -1; ++} ++ ++/* ++ * Helper function to link allocated buffers ++ */ ++static void ++isph3a_aewb_link_buffers(void) ++{ ++ int i; ++ ++ for (i = 0; i < H3A_MAX_BUFF; i++) { ++ if ((i + 1) < H3A_MAX_BUFF) { ++ aewbstat.h3a_buff[i].next = &aewbstat.h3a_buff[i + 1]; ++ h3a_xtrastats[i].next = &h3a_xtrastats[i + 1]; ++ } else { ++ aewbstat.h3a_buff[i].next = &aewbstat.h3a_buff[0]; ++ h3a_xtrastats[i].next = &h3a_xtrastats[0]; ++ } ++ } ++} ++ ++/* ++ * Helper function to unlock all buffers ++ */ ++static void ++isph3a_aewb_unlock_buffers(void) ++{ ++ int i; ++ unsigned long irqflags; ++ ++ spin_lock_irqsave(&aewbstat.buffer_lock, irqflags); ++ for (i = 0; i < H3A_MAX_BUFF; i++) ++ aewbstat.h3a_buff[i].locked = 0; ++ ++ spin_unlock_irqrestore(&aewbstat.buffer_lock, irqflags); ++} ++ ++/* ++ * Callback from ISP driver for H3A AEW interrupt ++ * status : IRQ0STATUS in case of MMU error, 0 for h3a interrupt ++ * arg1 : Not used as of now. ++ * arg2 : Not used as of now. ++ */ ++static void ++isph3a_aewb_isr(unsigned long status, isp_vbq_callback_ptr arg1, void *arg2) ++{ ++ u16 frame_align; ++ ++ if ((H3A_AWB_DONE & status) != H3A_AWB_DONE) ++ return; ++ ++ /* Exchange buffers */ ++ active_buff = active_buff->next; ++ if (active_buff->locked == 1) ++ active_buff = active_buff->next; ++ omap_writel(active_buff->ispmmu_addr, ISPH3A_AEWBUFST); ++ ++ /* Update frame counter */ ++ aewbstat.frame_count++; ++ frame_align = aewbstat.frame_count; ++ if (aewbstat.frame_count > MAX_FRAME_COUNT) { ++ aewbstat.frame_count = 1; ++ frame_align++; ++ } ++ active_buff->frame_num = aewbstat.frame_count; ++ ++ /* Future Stats requested? */ ++ if (aewbstat.stats_req) { ++ /* Is the frame we want already done? */ ++ DPRINTK_ISPH3A("waiting for frame %d\n", aewbstat.frame_req); ++ if (frame_align >= (aewbstat.frame_req + 1)) { ++ aewbstat.stats_req = 0; ++ aewbstat.stats_done = 1; ++ wake_up_interruptible(&aewbstat.stats_wait); ++ } ++ } ++ ++ if (aewbstat.update) ++ isph3a_aewb_update_regs(); ++ ++ DPRINTK_ISPH3A("."); ++} ++ ++/* ++ * Helper function to check and store user given params. ++ * As most of them are busy-lock registers, need to wait ++ * until AEW_BUSY = 0 --> to program them during ISR. ++ */ ++static int ++isph3a_aewb_set_params(struct isph3a_aewb_config *user_cfg) ++{ ++ /* Saturation limit */ ++ if (unlikely(user_cfg->saturation_limit > MAX_SATURATION_LIM)) { ++ printk(KERN_ERR "Invalid Saturation_limit: %d\n", ++ user_cfg->saturation_limit); ++ return -EINVAL; ++ } else if (aewb_config_local.saturation_limit != ++ user_cfg->saturation_limit) { ++ WRITE_SAT_LIM(aewb_regs.reg_pcr, user_cfg->saturation_limit); ++ aewb_config_local.saturation_limit = ++ user_cfg->saturation_limit; ++ aewbstat.update = 1; ++ } ++ /* A-Law */ ++ if (aewb_config_local.alaw_enable != user_cfg->alaw_enable) { ++ WRITE_ALAW(aewb_regs.reg_pcr, user_cfg->alaw_enable); ++ aewb_config_local.alaw_enable = user_cfg->alaw_enable; ++ aewbstat.update = 1; ++ } ++ /* Window height */ ++ if (unlikely((user_cfg->win_height < MIN_WIN_H) ++ || (user_cfg->win_height > MAX_WIN_H) ++ || (user_cfg->win_height & 0x01))) { ++ printk(KERN_ERR "Invalid window height: %d\n", ++ user_cfg->win_height); ++ return -EINVAL; ++ } else if (aewb_config_local.win_height != user_cfg->win_height) { ++ WRITE_WIN_H(aewb_regs.reg_win1, user_cfg->win_height); ++ aewb_config_local.win_height = user_cfg->win_height; ++ aewbstat.update = 1; ++ } ++ /* Window width */ ++ if (unlikely((user_cfg->win_width < MIN_WIN_W) ++ || (user_cfg->win_width > MAX_WIN_W) ++ || (user_cfg->win_width & 0x01))) { ++ printk(KERN_ERR "Invalid window width: %d\n", ++ user_cfg->win_width); ++ return -EINVAL; ++ } else if (aewb_config_local.win_width != user_cfg->win_width) { ++ WRITE_WIN_W(aewb_regs.reg_win1, user_cfg->win_width); ++ aewb_config_local.win_width = user_cfg->win_width; ++ aewbstat.update = 1; ++ } ++ /* Vertical window count */ ++ if (unlikely((user_cfg->ver_win_count < 1) ++ || (user_cfg->ver_win_count > MAX_WINVC))) { ++ printk(KERN_ERR "Invalid vertical window count: %d\n", ++ user_cfg->ver_win_count); ++ return -EINVAL; ++ } else if (aewb_config_local.ver_win_count ++ != user_cfg->ver_win_count){ ++ WRITE_VER_C(aewb_regs.reg_win1, ++ user_cfg->ver_win_count); ++ aewb_config_local.ver_win_count = ++ user_cfg->ver_win_count; ++ aewbstat.update = 1; ++ } ++ /* Horizontal window count */ ++ if (unlikely((user_cfg->hor_win_count < 1) ++ || (user_cfg->hor_win_count > MAX_WINHC))) { ++ printk(KERN_ERR "Invalid horizontal window count: %d\n", ++ user_cfg->hor_win_count); ++ return -EINVAL; ++ } else if (aewb_config_local.hor_win_count ++ != user_cfg->hor_win_count){ ++ WRITE_HOR_C(aewb_regs.reg_win1, ++ user_cfg->hor_win_count); ++ aewb_config_local.hor_win_count = ++ user_cfg->hor_win_count; ++ aewbstat.update = 1; ++ } ++ /* Windows vertical start position */ ++ if (unlikely(user_cfg->ver_win_start > MAX_WINSTART)) { ++ printk(KERN_ERR "Invalid vertical window start: %d\n", ++ user_cfg->ver_win_start); ++ return -EINVAL; ++ } else if (aewb_config_local.ver_win_start ++ != user_cfg->ver_win_start){ ++ WRITE_VER_WIN_ST(aewb_regs.reg_start, ++ user_cfg->ver_win_start); ++ aewb_config_local.ver_win_start = ++ user_cfg->ver_win_start; ++ aewbstat.update = 1; ++ } ++ /* Windows horizontal start position */ ++ if (unlikely(user_cfg->hor_win_start > MAX_WINSTART)) { ++ printk(KERN_ERR "Invalid horizontal window start: %d\n", ++ user_cfg->hor_win_start); ++ return -EINVAL; ++ } else if (aewb_config_local.hor_win_start ++ != user_cfg->hor_win_start){ ++ WRITE_HOR_WIN_ST(aewb_regs.reg_start, ++ user_cfg->hor_win_start); ++ aewb_config_local.hor_win_start = ++ user_cfg->hor_win_start; ++ aewbstat.update = 1; ++ } ++ /* Black Line vertical start position */ ++ if (unlikely(user_cfg->blk_ver_win_start > MAX_WINSTART)) { ++ printk(KERN_ERR "Invalid black vertical window start: %d\n", ++ user_cfg->blk_ver_win_start); ++ return -EINVAL; ++ } else if (aewb_config_local.blk_ver_win_start ++ != user_cfg->blk_ver_win_start){ ++ WRITE_BLK_VER_WIN_ST(aewb_regs.reg_blk, ++ user_cfg->blk_ver_win_start); ++ aewb_config_local.blk_ver_win_start = ++ user_cfg->blk_ver_win_start; ++ aewbstat.update = 1; ++ } ++ /* Black line height */ ++ if (unlikely((user_cfg->blk_win_height < MIN_WIN_H) ++ || (user_cfg->blk_win_height > MAX_WIN_H) ++ || (user_cfg->blk_win_height & 0x01))) { ++ printk(KERN_ERR "Invalid black window height: %d\n", ++ user_cfg->blk_win_height); ++ return -EINVAL; ++ } else if (aewb_config_local.blk_win_height ++ != user_cfg->blk_win_height) { ++ WRITE_BLK_WIN_H(aewb_regs.reg_blk, ++ user_cfg->blk_win_height); ++ aewb_config_local.blk_win_height ++ = user_cfg->blk_win_height; ++ aewbstat.update = 1; ++ } ++ /* Vertical sampling point increments */ ++ if (unlikely((user_cfg->subsample_ver_inc < MIN_SUB_INC) ++ || (user_cfg->subsample_ver_inc > MAX_SUB_INC) ++ || (user_cfg->subsample_ver_inc & 0x01))) { ++ printk(KERN_ERR "Invalid vertical subsample increment: %d\n", ++ user_cfg->subsample_ver_inc); ++ return -EINVAL; ++ } else if (aewb_config_local.subsample_ver_inc ++ != user_cfg->subsample_ver_inc) { ++ WRITE_SUB_VER_INC(aewb_regs.reg_subwin, ++ user_cfg->subsample_ver_inc); ++ aewb_config_local.subsample_ver_inc ++ = user_cfg->subsample_ver_inc; ++ aewbstat.update = 1; ++ } ++ /* Horizontal sampling point increments */ ++ if (unlikely((user_cfg->subsample_hor_inc < MIN_SUB_INC) ++ || (user_cfg->subsample_hor_inc > MAX_SUB_INC) ++ || (user_cfg->subsample_hor_inc & 0x01))) { ++ printk(KERN_ERR "Invalid horizontal subsample increment: %d\n", ++ user_cfg->subsample_hor_inc); ++ return -EINVAL; ++ } else if (aewb_config_local.subsample_hor_inc ++ != user_cfg->subsample_hor_inc) { ++ WRITE_SUB_HOR_INC(aewb_regs.reg_subwin, ++ user_cfg->subsample_hor_inc); ++ aewb_config_local.subsample_hor_inc ++ = user_cfg->subsample_hor_inc; ++ aewbstat.update = 1; ++ } ++ ++ if ((!aewbstat.initialized) || (0 == aewb_config_local.aewb_enable)) { ++ isph3a_aewb_update_regs(); ++ aewbstat.initialized = 1; ++ } ++ return 0; ++} ++ ++/* ++ * Helper function to munmap kernel buffers from user space. ++ */ ++static int ++isph3a_aewb_munmap(struct isph3a_aewb_buffer *buffer) ++{ ++ /* TO DO: munmap succesfully the kernel buffers, so they can be ++ remmaped again */ ++ buffer->mmap_addr = 0; ++ return 0; ++} ++ ++/* ++ * Helper function to mmap buffers to user space. ++ * buffer passed need to already have a valid physical address: buffer->phy_addr ++ * It returns user pointer as unsigned long in buffer->mmap_addr ++ */ ++static int ++isph3a_aewb_mmap_buffers(struct isph3a_aewb_buffer *buffer) ++{ ++ struct vm_area_struct vma; ++ struct mm_struct *mm = current->mm; ++ int size = aewbstat.stats_buf_size; ++ unsigned long addr = 0; ++ unsigned long pgoff = 0, flags = MAP_SHARED | MAP_ANONYMOUS; ++ unsigned long prot = PROT_READ | PROT_WRITE; ++ void *pos = (void *) buffer->addr_align; ++ ++ size = PAGE_ALIGN(size); ++ ++ addr = get_unmapped_area(NULL, addr, size, pgoff, flags); ++ vma.vm_mm = mm; ++ vma.vm_start = addr; ++ vma.vm_end = addr + size; ++ vma.vm_flags = calc_vm_prot_bits(prot) | calc_vm_flag_bits(flags); ++ vma.vm_pgoff = pgoff; ++ vma.vm_file = NULL; ++#ifndef ENABLE_BT_656_CAPTURE ++ vma.vm_page_prot = protection_map[vma.vm_flags]; ++#else ++ vma.vm_page_prot = vm_get_page_prot(vma.vm_flags); ++#endif ++ ++ while (size > 0) { ++ if (vm_insert_page(&vma, addr, vmalloc_to_page(pos))) ++ return -EAGAIN; ++ addr += PAGE_SIZE; ++ pos += PAGE_SIZE; ++ size -= PAGE_SIZE; ++ } ++ ++ buffer->mmap_addr = vma.vm_start; ++ return 0; ++} ++ ++/* ++ * API to configure AEW registers and enable/disable H3A engine ++ */ ++int ++isph3a_aewb_configure(struct isph3a_aewb_config *aewbcfg) ++{ ++ int ret = 0; ++ int i; ++ int win_count = 0; ++ ++ if (NULL == aewbcfg) { ++ printk(KERN_ERR "Null argument in configuration. \n"); ++ return -EINVAL; ++ } ++ ++ if (!aewbstat.initialized) { ++ DPRINTK_ISPH3A("Setting callback for H3A\n"); ++ ret = isp_set_callback(CBK_H3A_AWB_DONE, isph3a_aewb_isr, ++ (void *)NULL, (void *)NULL); ++ if (ret) { ++ printk(KERN_ERR "No callback for H3A\n"); ++ return ret; ++ } ++ } ++ ++ ret = isph3a_aewb_set_params(aewbcfg); ++ if (ret) { ++ printk(KERN_ERR "Invalid parameters! \n"); ++ return ret; ++ } ++ ++ win_count = (aewbcfg->ver_win_count * aewbcfg->hor_win_count); ++ win_count += aewbcfg->hor_win_count; /* Blk windows row*/ ++ ret = (win_count / 8); ++ win_count += (win_count % 8)? 1: 0; ++ win_count += ret; ++ ++ aewbstat.win_count = win_count; ++ ++ if (aewbstat.stats_buf_size && ((win_count * AEWB_PACKET_SIZE) ++ > aewbstat.stats_buf_size)) { ++ DPRINTK_ISPH3A("There was a previous buffer... \n"); ++ isph3a_aewb_enable(0); ++ for (i = 0; i < H3A_MAX_BUFF; i++) { ++ isph3a_aewb_munmap(&aewbstat.h3a_buff[i]); ++ ispmmu_unmap(aewbstat.h3a_buff[i].ispmmu_addr); ++ dma_free_coherent(NULL, ++ aewbstat.min_buf_size + 64, ++ (void *)aewbstat.h3a_buff[i].virt_addr, ++ (dma_addr_t)aewbstat.h3a_buff[i].phy_addr); ++ aewbstat.h3a_buff[i].virt_addr = 0; ++ } ++ aewbstat.stats_buf_size = 0; ++ } ++ ++ if (!aewbstat.h3a_buff[0].virt_addr) { ++ aewbstat.stats_buf_size = win_count * AEWB_PACKET_SIZE; ++ aewbstat.min_buf_size = PAGE_ALIGN(aewbstat.stats_buf_size); ++ ++ for (i = 0; i < H3A_MAX_BUFF; i++) { ++ aewbstat.h3a_buff[i].virt_addr = ++ (unsigned long)dma_alloc_coherent(NULL, ++ aewbstat.min_buf_size, ++ (dma_addr_t *) ++ &aewbstat.h3a_buff[i]. ++ phy_addr, GFP_KERNEL | ++ GFP_DMA); ++ if (aewbstat.h3a_buff[i].virt_addr == 0) { ++ printk(KERN_ERR "Can't acquire memory for " ++ "buffer[%d]\n", i); ++ return -ENOMEM; ++ } ++ aewbstat.h3a_buff[i].addr_align = ++ aewbstat.h3a_buff[i].virt_addr; ++ while ((aewbstat.h3a_buff[i].addr_align & ++ 0xFFFFFFC0) != ++ aewbstat.h3a_buff[i]. ++ addr_align) ++ aewbstat.h3a_buff[i].addr_align++; ++ aewbstat.h3a_buff[i].ispmmu_addr = ++ ispmmu_map(aewbstat. ++ h3a_buff[i].phy_addr, ++ aewbstat.min_buf_size); ++ } ++ isph3a_aewb_unlock_buffers(); ++ isph3a_aewb_link_buffers(); ++ ++ /* First active buffer */ ++ if (active_buff == NULL) ++ active_buff = &aewbstat.h3a_buff[0]; ++ omap_writel(active_buff->ispmmu_addr, ISPH3A_AEWBUFST); ++ } ++ /* Always remap when calling Configure */ ++ for (i = 0; i < H3A_MAX_BUFF; i++) { ++ if (aewbstat.h3a_buff[i].mmap_addr) { ++ isph3a_aewb_munmap(&aewbstat.h3a_buff[i]); ++ DPRINTK_ISPH3A("We have munmaped buffer 0x%lX\n", ++ aewbstat.h3a_buff[i].virt_addr); ++ } ++ isph3a_aewb_mmap_buffers(&aewbstat.h3a_buff[i]); ++ DPRINTK_ISPH3A("buff[%d] addr is:\n virt 0x%lX\n" ++ " aligned 0x%lX\n" ++ " phys 0x%lX\n" ++ " ispmmu 0x%08lX\n" ++ " mmapped 0x%lX\n", i, ++ aewbstat.h3a_buff[i].virt_addr, ++ aewbstat.h3a_buff[i].addr_align, ++ aewbstat.h3a_buff[i].phy_addr, ++ aewbstat.h3a_buff[i].ispmmu_addr, ++ aewbstat.h3a_buff[i].mmap_addr); ++ } ++ /* Enable/disable engine */ ++ isph3a_aewb_enable(aewbcfg->aewb_enable); ++ isph3a_print_status(); ++ ++ return 0; ++} ++EXPORT_SYMBOL(isph3a_aewb_configure); ++ ++ ++/* ++ * This API allows the user to update White Balance gains, as well as ++ * exposure time and analog gain. It is also used to request frame ++ * statistics. ++ */ ++int ++isph3a_aewb_request_statistics(struct isph3a_aewb_data *aewbdata) ++{ ++ int ret = 0; ++ u16 frame_diff = 0; ++ u16 frame_cnt = aewbstat.frame_count; ++ wait_queue_t wqt; ++ ++ /* ++ * This will be replaced by the gain settings using ++ * Master->Slave approach in camera driver ++ */ ++ ++ /* ++ u32 exp_time = aewbdata->shutter; ++ u16 gain = aewbdata->gain; ++ */ ++ ++ if (!aewb_config_local.aewb_enable) { ++ printk(KERN_ERR "H3A engine not enabled\n"); ++ return -EINVAL; ++ } ++ aewbdata->h3a_aewb_statistics_buf = NULL; ++ ++ DPRINTK_ISPH3A("User data received: \n"); ++ DPRINTK_ISPH3A("Digital gain = 0x%04x\n", aewbdata->dgain); ++ DPRINTK_ISPH3A("WB gain b *= 0x%04x\n", aewbdata->wb_gain_b); ++ DPRINTK_ISPH3A("WB gain r *= 0x%04x\n", aewbdata->wb_gain_r); ++ DPRINTK_ISPH3A("WB gain gb = 0x%04x\n", aewbdata->wb_gain_gb); ++ DPRINTK_ISPH3A("WB gain gr = 0x%04x\n", aewbdata->wb_gain_gr); ++ DPRINTK_ISPH3A("ISP AEWB request status wait for interrupt\n"); ++ ++ if (aewbdata->update != 0) { ++ if (aewbdata->update & SET_DIGITAL_GAIN) ++ h3awb_update.dgain = (u16)aewbdata->dgain; ++ if (aewbdata->update & SET_COLOR_GAINS) { ++ h3awb_update.coef3 = (u8)aewbdata->wb_gain_b; ++ h3awb_update.coef2 = (u8)aewbdata->wb_gain_gr; ++ h3awb_update.coef1 = (u8)aewbdata->wb_gain_gb; ++ h3awb_update.coef0 = (u8)aewbdata->wb_gain_r; ++ } ++ if (aewbdata->update & (SET_COLOR_GAINS | SET_DIGITAL_GAIN)) ++ wb_update = 1; ++ ++ if (aewbdata->update & REQUEST_STATISTICS) { ++ isph3a_aewb_unlock_buffers(); ++ ++ /* Stats available? */ ++ DPRINTK_ISPH3A("Stats available?\n"); ++ ret = isph3a_aewb_stats_available(aewbdata); ++ if (!ret) ++ goto out; ++ ++ DPRINTK_ISPH3A("Stats in near future?\n"); ++ /* Stats in near future? */ ++ if (aewbdata->frame_number > frame_cnt) { ++ frame_diff = aewbdata->frame_number - frame_cnt; ++ } else if (aewbdata->frame_number < frame_cnt) { ++ if ((frame_cnt > (MAX_FRAME_COUNT - ++ MAX_FUTURE_FRAMES)) ++ && (aewbdata-> ++ frame_number ++ < MAX_FRAME_COUNT)) ++ frame_diff = aewbdata->frame_number ++ + MAX_FRAME_COUNT ++ - frame_cnt; ++ else { ++ /* Frame unavailable */ ++ frame_diff = MAX_FUTURE_FRAMES + 1; ++ aewbdata->h3a_aewb_statistics_buf = ++ NULL; ++ } ++ } ++ ++ if (frame_diff > MAX_FUTURE_FRAMES) { ++ printk(KERN_ERR "Invalid frame requested\n"); ++ ++ } else if (!camnotify) { ++ /* Block until frame in near future completes */ ++ aewbstat.frame_req = aewbdata->frame_number; ++ aewbstat.stats_req = 1; ++ aewbstat.stats_done = 0; ++ init_waitqueue_entry(&wqt, current); ++ ret = wait_event_interruptible ++ (aewbstat.stats_wait, ++ aewbstat.stats_done == 1); ++ if (ret < 0) ++ return ret; ++ ++ DPRINTK_ISPH3A("ISP AEWB request status" ++ " interrupt raised\n"); ++ /* Stats now available */ ++ ret = isph3a_aewb_stats_available(aewbdata); ++ if (ret) { ++ DPRINTK_ISPH3A ++ ("After waiting for stats," ++ " stats not available!!\n"); ++ } ++ } ++ } ++ } ++out: ++ aewbdata->curr_frame = aewbstat.frame_count; ++ ++ return 0; ++} ++EXPORT_SYMBOL(isph3a_aewb_request_statistics); ++ ++/* ++ * Module Initialisation. ++ */ ++static int __init ++isph3a_aewb_init(void) ++{ ++ memset(&aewbstat, 0, sizeof(aewbstat)); ++ memset(&aewb_regs, 0, sizeof(aewb_regs)); ++ ++ init_waitqueue_head(&aewbstat.stats_wait); ++ spin_lock_init(&aewbstat.buffer_lock); ++ return 0; ++} ++ ++/* ++ * Module exit. ++ */ ++static void ++isph3a_aewb_cleanup(void) ++{ ++ int i; ++ isph3a_aewb_enable(0); ++ isp_unset_callback(CBK_H3A_AWB_DONE); ++ ++ if (aewbstat.h3a_buff) { ++ /* Free buffers */ ++ for (i = 0; i < H3A_MAX_BUFF; i++) { ++ ispmmu_unmap(aewbstat.h3a_buff[i].ispmmu_addr); ++ dma_free_coherent(NULL, ++ aewbstat.min_buf_size + 64, ++ (void *)aewbstat.h3a_buff[i].virt_addr, ++ (dma_addr_t)aewbstat.h3a_buff[i].phy_addr); ++ } ++ } ++ memset(&aewbstat, 0, sizeof(aewbstat)); ++ memset(&aewb_regs, 0, sizeof(aewb_regs)); ++} ++ ++/* ++ * Debug print ++ */ ++static void ++isph3a_print_status(void) ++{ ++ DPRINTK_ISPH3A("ISPH3A_PCR = 0x%08x\n", ++ omap_readl(ISPH3A_PCR)); ++ DPRINTK_ISPH3A("ISPH3A_AEWWIN1 = 0x%08x\n", ++ omap_readl(ISPH3A_AEWWIN1)); ++ DPRINTK_ISPH3A("ISPH3A_AEWINSTART = 0x%08x\n", ++ omap_readl(ISPH3A_AEWINSTART)); ++ DPRINTK_ISPH3A("ISPH3A_AEWINBLK = 0x%08x\n", ++ omap_readl(ISPH3A_AEWINBLK)); ++ DPRINTK_ISPH3A("ISPH3A_AEWSUBWIN = 0x%08x\n", ++ omap_readl(ISPH3A_AEWSUBWIN)); ++ DPRINTK_ISPH3A("ISPH3A_AEWBUFST = 0x%08x\n", ++ omap_readl(ISPH3A_AEWBUFST)); ++ DPRINTK_ISPH3A("stats windows = %d\n", ++ aewbstat.win_count); ++ DPRINTK_ISPH3A("stats buff size = %d\n", ++ aewbstat.stats_buf_size); ++} ++void ++isph3a_notify(int notify) ++{ ++ camnotify = notify; ++ if (camnotify && aewbstat.initialized) { ++ printk(KERN_DEBUG "Warning Camera Off \n"); ++ aewbstat.stats_req = 0; ++ aewbstat.stats_done = 1; ++ wake_up_interruptible(&aewbstat.stats_wait); ++ } ++} ++EXPORT_SYMBOL(isph3a_notify); ++/* ++ * Saves the values of the h3a module registers. ++ */ ++void ++isph3a_save_context(void) ++{ ++ DPRINTK_ISPH3A(" Saving context\n"); ++ isp_save_context(isph3a_reg_list); ++} ++EXPORT_SYMBOL(isph3a_save_context); ++ ++/* ++ * Restores the values of the h3a module registers. ++ */ ++void ++isph3a_restore_context(void) ++{ ++ DPRINTK_ISPH3A(" Restoring context\n"); ++ isp_restore_context(isph3a_reg_list); ++} ++EXPORT_SYMBOL(isph3a_restore_context); ++ ++module_init(isph3a_aewb_init); ++module_exit(isph3a_aewb_cleanup); ++ ++ ++MODULE_AUTHOR("Texas Instruments"); ++MODULE_DESCRIPTION("H3A ISP Module"); ++MODULE_LICENSE("GPL"); ++ +Index: git/drivers/media/video/isp/isph3a.h +=================================================================== +--- /dev/null 1970-01-01 00:00:00.000000000 +0000 ++++ git/drivers/media/video/isp/isph3a.h 2009-02-12 15:25:41.000000000 -0600 +@@ -0,0 +1,197 @@ ++/* ++ * drivers/media/video/omap/isp/isph3a.h ++ * ++ * Include file for H3A module in TI's OMAP3430 Camera ISP ++ * ++ * Copyright (C) 2008 Texas Instruments, Inc. ++ * ++ * This package 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 PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR ++ * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED ++ * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. ++ */ ++ ++#ifndef OMAP_ISP_H3A_H ++#define OMAP_ISP_H3A_H ++ ++#define AEWB_PACKET_SIZE 16 ++#define H3A_MAX_BUFF 5 ++ ++/* Flags for changed registers */ ++#define PCR_CHNG (1 << 0) ++#define AEWWIN1_CHNG (1 << 1) ++#define AEWINSTART_CHNG (1 << 2) ++#define AEWINBLK_CHNG (1 << 3) ++#define AEWSUBWIN_CHNG (1 << 4) ++#define PRV_WBDGAIN_CHNG (1 << 5) ++#define PRV_WBGAIN_CHNG (1 << 6) ++ ++/* Flags for update field */ ++#define REQUEST_STATISTICS (1 << 0) ++#define SET_COLOR_GAINS (1 << 1) ++#define SET_DIGITAL_GAIN (1 << 2) ++#define SET_EXPOSURE (1 << 3) ++#define SET_ANALOG_GAIN (1 << 4) ++ ++#define MAX_SATURATION_LIM 1023 ++#define MIN_WIN_H 2 ++#define MAX_WIN_H 256 ++#define MIN_WIN_W 6 ++#define MAX_WIN_W 256 ++#define MAX_WINVC 128 ++#define MAX_WINHC 36 ++#define MAX_WINSTART 4095 ++#define MIN_SUB_INC 2 ++#define MAX_SUB_INC 32 ++ ++#define MAX_FRAME_COUNT 0x0FFF ++#define MAX_FUTURE_FRAMES 10 ++ ++/* ISPH3A REGISTERS bits */ ++#define ISPH3A_PCR_AF_EN (1 << 0) ++#define ISPH3A_PCR_AF_ALAW_EN (1 << 1) ++#define ISPH3A_PCR_AF_MED_EN (1 << 2) ++#define ISPH3A_PCR_AF_BUSY (1 << 15) ++#define ISPH3A_PCR_AEW_EN (1 << 16) ++#define ISPH3A_PCR_AEW_ALAW_EN (1 << 17) ++#define ISPH3A_PCR_AEW_BUSY (1 << 18) ++ ++#define WRITE_SAT_LIM(reg, sat_limit) \ ++ (reg = (reg & (~(ISPH3A_PCR_AEW_AVE2LMT_MASK))) \ ++ | (sat_limit << ISPH3A_PCR_AEW_AVE2LMT_SHIFT)) ++ ++#define WRITE_ALAW(reg, alaw_en) \ ++ (reg = (reg & (~(ISPH3A_PCR_AEW_ALAW_EN))) \ ++ | ((alaw_en & ISPH3A_PCR_AF_ALAW_EN) \ ++ << ISPH3A_PCR_AEW_ALAW_EN_SHIFT)) ++ ++#define WRITE_WIN_H(reg, height) \ ++ (reg = (reg & (~(ISPH3A_AEWWIN1_WINH_MASK))) \ ++ | (((height >> 1) - 1) << ISPH3A_AEWWIN1_WINH_SHIFT)) ++ ++#define WRITE_WIN_W(reg, width) \ ++ (reg = (reg & (~(ISPH3A_AEWWIN1_WINW_MASK))) \ ++ | (((width >> 1) - 1) << ISPH3A_AEWWIN1_WINW_SHIFT)) ++ ++#define WRITE_VER_C(reg, ver_count) \ ++ (reg = (reg & ~(ISPH3A_AEWWIN1_WINVC_MASK)) \ ++ | ((ver_count - 1) << ISPH3A_AEWWIN1_WINVC_SHIFT)) ++ ++#define WRITE_HOR_C(reg, hor_count) \ ++ (reg = (reg & ~(ISPH3A_AEWWIN1_WINHC_MASK)) \ ++ | ((hor_count - 1) << ISPH3A_AEWWIN1_WINHC_SHIFT)) ++ ++#define WRITE_VER_WIN_ST(reg, ver_win_st) \ ++ (reg = (reg & ~(ISPH3A_AEWINSTART_WINSV_MASK)) \ ++ | (ver_win_st << ISPH3A_AEWINSTART_WINSV_SHIFT)) ++ ++#define WRITE_HOR_WIN_ST(reg, hor_win_st) \ ++ (reg = (reg & ~(ISPH3A_AEWINSTART_WINSH_MASK)) \ ++ | (hor_win_st << ISPH3A_AEWINSTART_WINSH_SHIFT)) ++ ++#define WRITE_BLK_VER_WIN_ST(reg, blk_win_st) \ ++ (reg = (reg & ~(ISPH3A_AEWINBLK_WINSV_MASK)) \ ++ | (blk_win_st << ISPH3A_AEWINBLK_WINSV_SHIFT)) ++ ++#define WRITE_BLK_WIN_H(reg, height) \ ++ (reg = (reg & ~(ISPH3A_AEWINBLK_WINH_MASK)) \ ++ | (((height >> 1) - 1) << ISPH3A_AEWINBLK_WINH_SHIFT)) ++ ++#define WRITE_SUB_VER_INC(reg, sub_ver_inc) \ ++ (reg = (reg & ~(ISPH3A_AEWSUBWIN_AEWINCV_MASK)) \ ++ | (((sub_ver_inc >> 1) - 1) << ISPH3A_AEWSUBWIN_AEWINCV_SHIFT)) ++ ++#define WRITE_SUB_HOR_INC(reg, sub_hor_inc) \ ++ (reg = (reg & ~(ISPH3A_AEWSUBWIN_AEWINCH_MASK)) \ ++ | (((sub_hor_inc >> 1) - 1) << ISPH3A_AEWSUBWIN_AEWINCH_SHIFT)) ++ ++ ++struct isph3a_aewb_config { ++ u16 saturation_limit; ++ u16 win_height; /* Range: 2 - 256 */ ++ u16 win_width; /* Range: 2 - 256 */ ++ u16 ver_win_count; /* vertical window count: 1 - 128 */ ++ u16 hor_win_count; /* horizontal window count: 1 - 36 */ ++ u16 ver_win_start; /* ver window start position: 0 - 4095 */ ++ u16 hor_win_start; /* hor window start position: 0 - 4095 */ ++ u16 blk_ver_win_start; /* black line ver window start pos: 0 -4095 */ ++ u16 blk_win_height; /* black line height: 2 - 256 */ ++ u16 subsample_ver_inc; /* ver distance between subsamples: 2 - 32 */ ++ u16 subsample_hor_inc; /* hor distance between subsamples: 2 - 32 */ ++ u8 alaw_enable; /* enable AEW ALAW flag */ ++ u8 aewb_enable; /* AE AWB enable flag */ ++}; ++ ++struct isph3a_aewb_data { ++ void *h3a_aewb_statistics_buf; /* Pointer to pass to user */ ++ u32 shutter; /* Shutter speed */ ++ u16 gain; /* Sensor analog Gain */ ++ u32 shutter_cap; /* Shutter speed for capture */ ++ u16 gain_cap; /* Sensor Gain for capture */ ++ ++ u16 dgain; /* White balance digital gain */ ++ u16 wb_gain_b; /* White balance color gain blue */ ++ u16 wb_gain_r; /* White balance color gain red */ ++ u16 wb_gain_gb; /* White balance color gain green blue */ ++ u16 wb_gain_gr; /* White balance color gain green red */ ++ ++ u16 frame_number; /* Frame number of requested stats */ ++ u16 curr_frame; /* Current frame number being processed */ ++ u8 update; /* Bitwise flags to update parameters */ ++ ++ struct timeval ts; /* Timestamp of returned framestats */ ++ unsigned long field_count; /* ++ * Sequence number of returned ++ * framestats ++ */ ++}; ++ ++struct isph3a_aewb_xtrastats { ++ struct timeval ts; ++ unsigned long field_count; ++ ++ struct isph3a_aewb_xtrastats *next; ++}; ++ ++void isph3a_aewb_setxtrastats(struct isph3a_aewb_xtrastats *xtrastats); ++ ++#include <linux/autoconf.h> ++#ifdef CONFIG_VIDEO_OMAP34XX_ISP_PREVIEWER ++/* ++ * Sets the parameters in H3A registers ++ */ ++int isph3a_aewb_configure(struct isph3a_aewb_config *aewbcfg); ++ ++/* ++ * Requests AE and AWB statistics ++ */ ++int isph3a_aewb_request_statistics(struct isph3a_aewb_data *aewbdata); ++ ++/* ++ * Saves h3a context ++ */ ++void isph3a_save_context(void); ++ ++/* ++ * Restores h3a context ++ */ ++void isph3a_restore_context(void); ++ ++#else ++#define isph3a_aewb_configure(x) -EFAULT ++#define isph3a_aewb_request_statistics(x) -EFAULT ++#define isph3a_save_context() ++#define isph3a_restore_context() ++ ++#endif ++ ++/* ++ * Update WB values after a H3A statistics request ++ */ ++void isph3a_update_wb(void); ++ ++void isph3a_notify(int notify); ++#endif /* OMAP_ISP_H3A_H */ +Index: git/drivers/media/video/isp/isphist.h +=================================================================== +--- /dev/null 1970-01-01 00:00:00.000000000 +0000 ++++ git/drivers/media/video/isp/isphist.h 2009-02-12 15:23:05.000000000 -0600 +@@ -0,0 +1,145 @@ ++/* ++ * drivers/media/video/isp/isphist.h ++ * ++ * Include file for HISTOGRAM module in TI's OMAP3430 Camera ISP ++ * ++ * Copyright (C) 2008 Texas Instruments, Inc. ++ * ++ * This package 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 PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR ++ * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED ++ * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. ++ */ ++ ++#ifndef OMAP_ISP_HIST_H ++#define OMAP_ISP_HIST_H ++ ++/* Flags for number of bins */ ++#define BINS_32 0x0 ++#define BINS_64 0x1 ++#define BINS_128 0x2 ++#define BINS_256 0x3 ++ ++#define MAX_REGIONS 0x4 ++#define MAX_WB_GAIN 255 ++#define MIN_WB_GAIN 0x0 ++#define MAX_BIT_WIDTH 14 ++#define MIN_BIT_WIDTH 8 ++ ++#define ISPHIST_PCR_EN (1 << 0) ++#define HIST_MEM_SIZE 1024 ++#define ISPHIST_CNT_CLR_EN (1 << 7) ++ ++#define WRITE_SOURCE(reg, source) \ ++ (reg = (reg & ~(ISPHIST_CNT_SOURCE_MASK)) \ ++ | (source << ISPHIST_CNT_SOURCE_SHIFT)) ++ ++#define WRITE_HV_INFO(reg, hv_info) \ ++ (reg = ((reg & ~(ISPHIST_HV_INFO_MASK)) \ ++ | (hv_info & ISPHIST_HV_INFO_MASK))) ++ ++#define WRITE_RADD(reg, radd) \ ++ (reg = (reg & ~(ISPHIST_RADD_MASK)) \ ++ | (radd << ISPHIST_RADD_SHIFT)) ++ ++#define WRITE_RADD_OFF(reg, radd_off) \ ++ (reg = (reg & ~(ISPHIST_RADD_OFF_MASK)) \ ++ | (radd_off << ISPHIST_RADD_OFF_SHIFT)) ++ ++#define WRITE_BIT_SHIFT(reg, bit_shift) \ ++ (reg = (reg & ~(ISPHIST_CNT_SHIFT_MASK)) \ ++ | (bit_shift << ISPHIST_CNT_SHIFT_SHIFT)) ++ ++#define WRITE_DATA_SIZE(reg, data_size) \ ++ (reg = (reg & ~(ISPHIST_CNT_DATASIZE_MASK)) \ ++ | (data_size << ISPHIST_CNT_DATASIZE_SHIFT)) ++ ++#define WRITE_NUM_BINS(reg, num_bins) \ ++ (reg = (reg & ~(ISPHIST_CNT_BINS_MASK)) \ ++ | (num_bins << ISPHIST_CNT_BINS_SHIFT)) ++ ++#define WRITE_WB_R(reg, reg_wb_gain) \ ++ reg = ((reg & ~(ISPHIST_WB_GAIN_WG00_MASK)) \ ++ | (reg_wb_gain << ISPHIST_WB_GAIN_WG00_SHIFT)) ++ ++#define WRITE_WB_RG(reg, reg_wb_gain) \ ++ (reg = (reg & ~(ISPHIST_WB_GAIN_WG01_MASK)) \ ++ | (reg_wb_gain << ISPHIST_WB_GAIN_WG01_SHIFT)) ++ ++#define WRITE_WB_B(reg, reg_wb_gain) \ ++ (reg = (reg & ~(ISPHIST_WB_GAIN_WG02_MASK)) \ ++ | (reg_wb_gain << ISPHIST_WB_GAIN_WG02_SHIFT)) ++ ++#define WRITE_WB_BG(reg, reg_wb_gain) \ ++ (reg = (reg & ~(ISPHIST_WB_GAIN_WG03_MASK)) \ ++ | (reg_wb_gain << ISPHIST_WB_GAIN_WG03_SHIFT)) ++ ++#define WRITE_REG_HORIZ(reg, reg_n_hor) \ ++ (reg = ((reg & ~ISPHIST_REGHORIZ_MASK) \ ++ | (reg_n_hor & ISPHIST_REGHORIZ_MASK))) ++ ++#define WRITE_REG_VERT(reg, reg_n_vert) \ ++ (reg = ((reg & ~ISPHIST_REGVERT_MASK) \ ++ | (reg_n_vert & ISPHIST_REGVERT_MASK))) ++ ++struct isp_hist_config { ++ u8 hist_source; /* CCDC or Memory */ ++ u8 input_bit_width; /* Needed o know the size per pixel */ ++ u8 hist_frames; /* Num of frames to be processed and accumulated */ ++ u8 hist_h_v_info; /* frame-input width and height if source is memory */ ++ u16 hist_radd; /* frame-input address in memory */ ++ u16 hist_radd_off; /* line-offset for frame-input */ ++ u16 hist_bins; /* number of bins: 32, 64, 128, or 256 */ ++ u16 wb_gain_R; /* White Balance Field-to-Pattern Assignments */ ++ u16 wb_gain_RG; /* White Balance Field-to-Pattern Assignments */ ++ u16 wb_gain_B; /* White Balance Field-to-Pattern Assignments */ ++ u16 wb_gain_BG; /* White Balance Field-to-Pattern Assignments */ ++ u8 num_regions; /* number of regions to be configured */ ++ u16 reg0_hor; /* Region 0 size and position */ ++ u16 reg0_ver; /* Region 0 size and position */ ++ u16 reg1_hor; /* Region 1 size and position */ ++ u16 reg1_ver; /* Region 1 size and position */ ++ u16 reg2_hor; /* Region 2 size and position */ ++ u16 reg2_ver; /* Region 2 size and position */ ++ u16 reg3_hor; /* Region 3 size and position */ ++ u16 reg3_ver; /* Region 3 size and position */ ++}; ++ ++struct isp_hist_data { ++ ++ u32 *hist_statistics_buf; /* Pointer to pass to user */ ++ ++}; ++ ++#include <linux/autoconf.h> ++#ifdef CONFIG_VIDEO_OMAP34XX_ISP_PREVIEWER ++/* ++ * Validate parameters to be stored in HIST registers ++ */ ++int isp_hist_configure(struct isp_hist_config *histcfg); ++ ++/* ++ * Requests Histrogram statistics ++ */ ++int isp_hist_request_statistics(struct isp_hist_data *histdata); ++ ++/* ++ * Saves hist context ++ */ ++void isphist_save_context(void); ++ ++/* ++ * Restores hist context ++ */ ++void isphist_restore_context(void); ++#else ++#define isp_hist_configure(x) -EFAULT ++#define isp_hist_request_statistics(x) -EFAULT ++#define isphist_save_context() ++#define isphist_restore_context() ++#endif ++ ++#endif /* OMAP_ISP_HIST */ +Index: git/drivers/media/video/isp/ispmmu.c +=================================================================== +--- /dev/null 1970-01-01 00:00:00.000000000 +0000 ++++ git/drivers/media/video/isp/ispmmu.c 2009-02-12 11:41:19.000000000 -0600 +@@ -0,0 +1,792 @@ ++/* ++ * drivers/media/video/isp/ispmmu.c ++ * ++ * Driver Library for ISP MMU module in TI's OMAP3430 Camera ISP ++ * ++ * Copyright (C) 2008 Texas Instruments, Inc. ++ * ++ * This package 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 PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR ++ * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED ++ * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. ++ * ++ */ ++ ++#include <linux/init.h> ++#include <linux/module.h> ++#include <linux/moduleparam.h> ++#include <linux/delay.h> ++#include <linux/errno.h> ++#include <linux/kernel.h> ++#include <linux/sched.h> ++#include <linux/interrupt.h> ++#include <linux/types.h> ++#include <linux/dma-mapping.h> ++#include <linux/mm.h> ++ ++#include <asm/io.h> ++#include <asm/byteorder.h> ++#include <asm/scatterlist.h> ++#include <asm/irq.h> ++ ++ ++#include "isp.h" ++#include "ispreg.h" ++#include "ispmmu.h" ++ ++ ++#define ISPMMU_L1D_TYPE_SHIFT 0 ++#define ISPMMU_L1D_TYPE_MASK 0x3 ++#define ISPMMU_L1D_TYPE_FAULT 0 ++#define ISPMMU_L1D_TYPE_FAULT1 3 ++#define ISPMMU_L1D_TYPE_PAGE 1 ++#define ISPMMU_L1D_TYPE_SECTION 2 ++#define ISPMMU_L1D_PAGE_ADDR_SHIFT 10 ++ ++#define ISPMMU_L2D_TYPE_SHIFT 0 ++#define ISPMMU_L2D_TYPE_MASK 0x3 ++#define ISPMMU_L2D_TYPE_FAULT 0 ++#define ISPMMU_L2D_TYPE_LARGE_PAGE 1 ++#define ISPMMU_L2D_TYPE_SMALL_PAGE 2 ++#define ISPMMU_L2D_SMALL_ADDR_SHIFT 12 ++#define ISPMMU_L2D_SMALL_ADDR_MASK 0xFFFFF000 ++#define ISPMMU_L2D_M_ACCESSBASED (1 << 11) ++#define ISPMMU_L2D_E_BIGENDIAN (1 << 9) ++#define ISPMMU_L2D_ES_SHIFT 4 ++#define ISPMMU_L2D_ES_MASK ~(3 << 4) ++#define ISPMMU_L2D_ES_8BIT 0 ++#define ISPMMU_L2D_ES_16BIT 1 ++#define ISPMMU_L2D_ES_32BIT 2 ++#define ISPMMU_L2D_ES_NOENCONV 3 ++ ++#define ISPMMU_TTB_ENTRIES_NR 4096 ++ ++/* Number 1MB entries in TTB in one 32MB region */ ++#define ISPMMU_REGION_ENTRIES_NR 32 ++ ++/* 128 region entries */ ++#define ISPMMU_REGION_NR \ ++ (ISPMMU_TTB_ENTRIES_NR / ISPMMU_REGION_ENTRIES_NR) ++ ++/* Each region is 32MB */ ++#define ISPMMU_REGION_SIZE (ISPMMU_REGION_ENTRIES_NR * (1 << 20)) ++ ++/* Number of entries per L2 Page table */ ++#define ISPMMU_L2D_ENTRIES_NR 256 ++ ++/* ++ * Statically allocate 16KB for L2 page tables. 16KB can be used for ++ * up to 16 L2 page tables which cover up to 16MB space. We use an array of 16 ++ * to keep track of these 16 L2 page table's status. ++ */ ++#define L2P_TABLE_SIZE 1024 ++#define L2P_TABLE_NR 41 /* Currently supports 4*5MP shots */ ++#define L2P_TABLES_SIZE (L2P_TABLE_SIZE * L2P_TABLE_NR) ++ ++/* Extra memory allocated to get ttb aligned on 16KB */ ++#define ISPMMU_TTB_MISALIGN_SIZE 0x3000 ++ ++/* Page structure for statically allocated l1 and l2 page tables */ ++static struct page *ttb_page; ++static struct page *l2p_page; ++ ++/* ++* Allocate the same number as of TTB entries for easy tracking ++* even though L2P tables are limited to 16 or so ++*/ ++static u32 l2p_table_addr[4096]; ++ ++/* An array of flags to keep the L2P table allotted */ ++static int l2p_table_allotted[L2P_TABLE_NR]; ++ ++/* TTB virtual and physical address */ ++static u32 *ttb, ttb_p; ++ ++/* Worst case allocation for TTB for 16KB alignment */ ++static u32 ttb_aligned_size; ++ ++/* L2 page table base virtural and physical address */ ++static u32 l2_page_cache, l2_page_cache_p; ++ ++/* Structure for Mapping Attributes in the L1, L2 descriptor*/ ++struct ispmmu_mapattr{ ++ enum ISPMMU_MAP_ENDIAN endianism; ++ enum ISPMMU_MAP_ELEMENTSIZE element_size; ++ enum ISPMMU_MAP_MIXEDREGION mixed_size; ++ enum ISPMMU_MAP_SIZE map_size; ++}; ++ ++static struct ispmmu_mapattr l1_mapattr_obj, l2_mapattr_obj; ++ ++/* Structure for saving/restoring mmu module registers*/ ++static struct isp_reg ispmmu_reg_list[] = { ++ {ISPMMU_SYSCONFIG, 0x0000}, ++ {ISPMMU_IRQENABLE, 0x0000}, ++ {ISPMMU_CNTL, 0x0000}, ++ {ISPMMU_TTB, 0x0000}, ++ {ISPMMU_LOCK, 0x0000}, ++ {ISPMMU_LD_TLB, 0x0000}, ++ {ISPMMU_CAM, 0x0000}, ++ {ISPMMU_RAM, 0x0000}, ++ {ISPMMU_GFLUSH, 0x0000}, ++ {ISPMMU_FLUSH_ENTRY, 0x0000}, ++ {ISP_TOK_TERM, 0x0000} ++}; ++ ++/* ++ * Sets the L1,L2 descriptor with section/supersection/Largepage/Smallpage ++ * base address or with L2 Page table address depending on the size parameter. ++ * Returns the written L1/L2 descriptor. ++ * pte_addr : Pointer to the Indexed address in the L1 Page table ie TTB. ++ * phy_addr : Section/Supersection/L2page table physical address. ++ * mapattr : Mapping attributes applicable for Section/Supersections. ++ */ ++static u32 ispmmu_set_pte(u32 *pte_addr, u32 phy_addr, ++ struct ispmmu_mapattr mapattr) ++{ ++ u32 pte = 0; ++ ++ switch (mapattr.map_size) { ++ case PAGE : ++ pte = ISPMMU_L1D_TYPE_PAGE << ISPMMU_L1D_TYPE_SHIFT; ++ pte |= (phy_addr >> ISPMMU_L1D_PAGE_ADDR_SHIFT) ++ << ISPMMU_L1D_PAGE_ADDR_SHIFT; ++ break; ++ case SMALLPAGE: ++ pte = ISPMMU_L2D_TYPE_SMALL_PAGE << ++ ISPMMU_L2D_TYPE_SHIFT; ++ pte &= ~ISPMMU_L2D_M_ACCESSBASED; ++ if (mapattr.endianism) ++ pte |= ISPMMU_L2D_E_BIGENDIAN ; ++ else ++ pte &= ~ISPMMU_L2D_E_BIGENDIAN ; ++ pte &= ISPMMU_L2D_ES_MASK; ++ pte |= mapattr.element_size << ISPMMU_L2D_ES_SHIFT; ++ pte |= (phy_addr >> ISPMMU_L2D_SMALL_ADDR_SHIFT) ++ << ISPMMU_L2D_SMALL_ADDR_SHIFT; ++ break; ++ case L1DFAULT: ++ pte = ISPMMU_L1D_TYPE_FAULT << ISPMMU_L1D_TYPE_SHIFT; ++ break; ++ case L2DFAULT: ++ pte = ISPMMU_L2D_TYPE_FAULT << ISPMMU_L2D_TYPE_SHIFT; ++ break; ++ default: ++ break; ++ }; ++ ++ *pte_addr = pte; ++ return pte; ++} ++ ++/* ++ * Returns the index in the ttb for a free 32MB region ++ * Returns 0 as an error code, if run out of regions. ++ */ ++static u32 find_free_region_index(void) ++{ ++ int idx = 0; ++ /* Find the first free 32M region in ttb. */ ++ /* skip region 0 to avoid NULL pointer */ ++ for (idx = ISPMMU_REGION_ENTRIES_NR; idx < ISPMMU_TTB_ENTRIES_NR; ++ idx += ISPMMU_REGION_ENTRIES_NR){ ++ if (((*(ttb + idx)) & ISPMMU_L1D_TYPE_MASK) == ++ (ISPMMU_L1D_TYPE_FAULT << ISPMMU_L1D_TYPE_SHIFT)) ++ break; ++ } ++ if (idx == ISPMMU_TTB_ENTRIES_NR) { ++ DPRINTK_ISPMMU("run out of virtual space\n"); ++ return 0; ++ } ++ return idx; ++} ++ ++/* ++ * Returns the Page aligned address ++ * addr :Address to be page aligned ++ */ ++static inline u32 page_aligned_addr(u32 addr) ++{ ++ u32 paddress; ++ paddress = addr & ~(PAGE_SIZE-1) ; ++ return paddress; ++} ++ ++ ++/* ++ * Returns the physical address of the allocated L2 page Table. ++ * l2_table : Virtual address of the allocated l2 table. ++ */ ++static inline u32 l2_page_paddr(u32 l2_table) ++{ ++ return (l2_page_cache_p + (l2_table - l2_page_cache)); ++} ++ ++/* ++ * Allocates contigous memory for L2 page tables. ++ */ ++static int init_l2_page_cache(void) ++{ ++ int i; ++ u32 *l2p; ++ ++ l2p_page = alloc_pages(GFP_KERNEL, get_order(L2P_TABLES_SIZE)); ++ if (!l2p_page) { ++ DPRINTK_ISPMMU("ISP_ERR : No Memory for L2 page tables\n"); ++ return -ENOMEM; ++ } ++ l2p = page_address(l2p_page); ++ l2_page_cache = (u32)l2p; ++ l2_page_cache_p = __pa(l2p); ++ l2_page_cache = (u32)ioremap_nocache(l2_page_cache_p, L2P_TABLES_SIZE); ++ ++ for (i = 0; i < L2P_TABLE_NR; i++) ++ l2p_table_allotted[i] = 0; ++ ++ DPRINTK_ISPMMU("Mem for L2 page tables at l2_paddr = %x, \ ++ l2_vaddr = 0x%x, of bytes = 0x%x\n", ++ l2_page_cache_p, l2_page_cache, L2P_TABLES_SIZE); ++ /*HW Errata 1.40. Camera ISP: MMU endianess polarity inverted */ ++/// if (is_sil_rev_less_than(OMAP3430_REV_ES2_0)) ++/// l2_mapattr_obj.endianism = B_ENDIAN; ++/// else ++ l2_mapattr_obj.endianism = L_ENDIAN; ++ l2_mapattr_obj.element_size = ES_8BIT; ++ l2_mapattr_obj.mixed_size = ACCESS_BASED; ++ l2_mapattr_obj.map_size = L2DFAULT; ++ return 0; ++} ++ ++/* ++ * Frees the memory of L2 page tables. ++ */ ++static void cleanup_l2_page_cache(void) ++{ ++ if (l2p_page) { ++ ioremap_cached(l2_page_cache_p, L2P_TABLES_SIZE); ++ __free_pages(l2p_page, get_order(L2P_TABLES_SIZE)); ++ } ++} ++ ++/* ++ * Finds the free L2 Page table slot. ++ * Fills the allotted L2 Page table with default entries. ++ * Returns the virtual address of the allotted L2 Pagetable, ++ */ ++static u32 request_l2_page_table(void) ++{ ++ int i, j; ++ u32 l2_table; ++ ++ for (i = 0; i < L2P_TABLE_NR; i++) { ++ if (!l2p_table_allotted[i]) ++ break; ++ } ++ if (i < L2P_TABLE_NR) { ++ l2p_table_allotted[i] = 1; ++ l2_table = l2_page_cache + (i * L2P_TABLE_SIZE); ++ l2_mapattr_obj.map_size = L2DFAULT; ++ /*Fill up all the entries with fault */ ++ for (j = 0; j < ISPMMU_L2D_ENTRIES_NR; j++) ++ ispmmu_set_pte((u32 *)l2_table+j, 0, l2_mapattr_obj); ++ DPRINTK_ISPMMU("Allotted l2 page table at 0x%x\n", ++ (u32)l2_table); ++ return l2_table; ++ } else { ++ DPRINTK_ISPMMU("ISP_ERR : Cannot allocate more than 16 L2\ ++ Page Tables"); ++ return 0; ++ } ++} ++ ++/* ++ * Frees the allotted L2 Page table slot. ++ */ ++static int free_l2_page_table(u32 l2_table) ++{ ++ int i; ++ ++ DPRINTK_ISPMMU("Free l2 page table at 0x%x\n", l2_table); ++ for (i = 0; i < L2P_TABLE_NR; i++) ++ if (l2_table == (l2_page_cache + (i * L2P_TABLE_SIZE))) { ++ if (!l2p_table_allotted[i]) { ++ DPRINTK_ISPMMU("L2 page not in use\n"); ++ } ++ l2p_table_allotted[i] = 0; ++ return 0; ++ } ++ DPRINTK_ISPMMU("L2 table not found\n"); ++ return -EINVAL; ++} ++ ++/* ++ * Map a physically contiguous buffer to ISP space. This call is used to ++ * map a frame buffer ++ * p_addr : Physical address of the contigous mem to be mapped. ++ * size : Size of the contigous mem to be mapped. ++ */ ++dma_addr_t ispmmu_map(u32 p_addr, int size) ++{ ++ int i, j, idx, num; ++ u32 sz, first_padding; ++ u32 p_addr_align, p_addr_align_end; ++ u32 pd; ++ u32 *l2_table; ++ ++ DPRINTK_ISPMMU("map: p_addr = 0x%x, size = 0x%x\n", p_addr, size); ++ ++ p_addr_align = page_aligned_addr(p_addr); ++ ++ first_padding = p_addr - p_addr_align; ++ ++ if (first_padding > size) ++ sz = 0; ++ else ++ sz = size - first_padding; ++ ++ num = (sz/PAGE_SIZE) + ((sz%PAGE_SIZE)?1:0) + (first_padding ?1:0); ++ p_addr_align_end = p_addr_align + num*PAGE_SIZE; ++ ++ DPRINTK_ISPMMU("buffer at 0x%x of size 0x%x spans to %d pages\n", ++ p_addr, size, num); ++ ++ idx = find_free_region_index(); ++ if (!idx) { ++ DPRINTK_ISPMMU("Runs out of virtual space"); ++ return -EINVAL; ++ } ++ DPRINTK_ISPMMU("allocating region %d\n", idx/ISPMMU_REGION_ENTRIES_NR); ++ ++ /* how many second-level page tables we need */ ++ num = num/ISPMMU_L2D_ENTRIES_NR + ++ ((num%ISPMMU_L2D_ENTRIES_NR)?1:0); ++ DPRINTK_ISPMMU("need %d second-level page tables (1KB each)\n", num); ++ ++ /* create second-level page tables */ ++ for (i = 0; i < num; i++) { ++ l2_table = (u32 *)request_l2_page_table(); ++ if (!l2_table) { ++ DPRINTK_ISPMMU("no memory\n"); ++ i--; ++ goto release_mem; ++ } ++ ++ /* Make the first level page descriptor */ ++ l1_mapattr_obj.map_size = PAGE; ++ pd = ispmmu_set_pte(ttb+idx+i, l2_page_paddr((u32)l2_table), ++ l1_mapattr_obj); ++ DPRINTK_ISPMMU("L1 pte[%d] = 0x%x\n", idx+i, pd); ++ ++ /* Make the second Level page descriptors */ ++ l2_mapattr_obj.map_size = SMALLPAGE; ++ for (j = 0; j < ISPMMU_L2D_ENTRIES_NR; j++) { ++ pd = ispmmu_set_pte(l2_table + j, p_addr_align, ++ l2_mapattr_obj); ++ /* DPRINTK_ISPMMU("L2 pte[%d] = 0x%x\n", j, pd); */ ++ /*Contigous memory, just increment with Page size */ ++ p_addr_align += PAGE_SIZE; ++ if (p_addr_align == p_addr_align_end) ++ break; ++ } ++ /* save it so we can free this l2 table later */ ++ l2p_table_addr[idx + i] = (u32)l2_table; ++ } ++ ++ DPRINTK_ISPMMU("mapped to ISP virtual address 0x%x\n", ++ (u32)((idx << 20) + (p_addr & (PAGE_SIZE - 1)))); ++ ++ omap_writel(1, ISPMMU_GFLUSH); ++ return (dma_addr_t)((idx<<20) + (p_addr & (PAGE_SIZE - 1))); ++ ++release_mem: ++ for (; i >= 0; i--) { ++ free_l2_page_table(l2p_table_addr[idx + i]); ++ l2p_table_addr[idx + i] = 0; ++ } ++ return 0; ++} ++EXPORT_SYMBOL_GPL(ispmmu_map); ++ ++/* ++ * Map a physically discontiguous buffer to ISP space. This call is used to ++ * map a user buffer or a vmalloc buffer. The sg list is a set of pages. ++ * sg_list : Address of the Scatter gather linked list. ++ * sglen : Number of elements in the sg list. ++ */ ++dma_addr_t ispmmu_map_sg(const struct scatterlist *sglist, int sglen) ++{ ++ int i, j, idx, num, sg_num = 0; ++ u32 pd, sg_element_addr; ++ u32 *l2_table; ++ ++ DPRINTK_ISPMMU("Map_sg: sglen (num of pages) = %d\n", sglen); ++ ++ idx = find_free_region_index(); ++ if (!idx) { ++ DPRINTK_ISPMMU("Runs out of virtual space"); ++ return -EINVAL; ++ } ++ ++ DPRINTK_ISPMMU("allocating region %d\n", idx/ISPMMU_REGION_ENTRIES_NR); ++ ++ /* How many second-level page tables we need */ ++ /* ++ * Size of each sglist element does not exceed a page size ++ * so consider the number of elements in the list for calcuating ++ * number of L2P tables ++ */ ++ num = sglen/ISPMMU_L2D_ENTRIES_NR + ++ ((sglen%ISPMMU_L2D_ENTRIES_NR)?1:0); ++ DPRINTK_ISPMMU("Need %d second-level page tables (1KB each)\n", num); ++ ++ /* create second-level page tables */ ++ for (i = 0; i < num; i++) { ++ l2_table = (u32 *)request_l2_page_table(); ++ if (!l2_table) { ++ DPRINTK_ISPMMU("No memory\n"); ++ i--; ++ goto release_mem; ++ } ++ /* Make the first level page descriptor */ ++ l1_mapattr_obj.map_size = PAGE; ++ pd = ispmmu_set_pte(ttb+idx+i, l2_page_paddr((u32)l2_table), ++ l1_mapattr_obj); ++ DPRINTK_ISPMMU("L1 pte[%d] = 0x%x\n", idx+i, pd); ++ ++ /* Make the second Level page descriptors */ ++ l2_mapattr_obj.map_size = SMALLPAGE; ++ for (j = 0; j < ISPMMU_L2D_ENTRIES_NR; j++) { ++ /* ++ * Assuming that sglist elements are always page ++ * aligned ++ */ ++ sg_element_addr = sg_dma_address(sglist + sg_num); ++ if ((sg_num > 0) && page_aligned_addr(sg_element_addr) ++ != sg_element_addr) ++ DPRINTK_ISPMMU("ISP_ERR : Intermediate SG" ++ " elements are not" ++ " page aligned = 0x%x\n", ++ sg_element_addr); ++ pd = ispmmu_set_pte(l2_table + j, sg_element_addr, ++ l2_mapattr_obj); ++ ++ /* DPRINTK_ISPMMU("L2 pte[%d] = 0x%x\n", j, pd); */ ++ ++ sg_num++; ++ if (sg_num == sglen) ++ break; ++ } ++ /* save it so we can free this l2 table later */ ++ l2p_table_addr[idx + i] = (u32)l2_table; ++ } ++ ++ DPRINTK_ISPMMU("mapped sg list to ISP virtual address 0x%x, idx=%d\n", ++ (u32)((idx << 20) + (sg_dma_address(sglist + 0) & ++ (PAGE_SIZE - 1))), idx); ++ ++ omap_writel(1, ISPMMU_GFLUSH); ++ return (dma_addr_t)((idx << 20) + (sg_dma_address(sglist + 0) & ++ (PAGE_SIZE - 1))); ++ ++release_mem: ++ for (; i >= 0; i--) { ++ free_l2_page_table(l2p_table_addr[idx + i]); ++ l2p_table_addr[idx + i] = 0; ++ } ++ return 0; ++} ++EXPORT_SYMBOL_GPL(ispmmu_map_sg); ++ ++/* ++ * Unmap a ISP space that is mapped before via ispmmu_map and ++ * ispmmu_map_sg. ++ * v_addr : Virtural address to be unmapped ++ */ ++int ispmmu_unmap(dma_addr_t v_addr) ++{ ++ u32 v_addr_align; ++ int idx; ++ ++ DPRINTK_ISPMMU("+ispmmu_unmap: 0x%x\n", v_addr); ++ ++ v_addr_align = page_aligned_addr(v_addr); ++ idx = v_addr_align >> 20; ++ if ((idx < ISPMMU_REGION_ENTRIES_NR) || ++ (idx > (ISPMMU_REGION_ENTRIES_NR * (ISPMMU_REGION_NR - 1))) ++ || ((idx << 20) != v_addr_align) ++ || (idx%ISPMMU_REGION_ENTRIES_NR)) { ++ DPRINTK_ISPMMU("Cannot unmap a non region-aligned space \ ++ 0x%x\n", v_addr); ++ return -EINVAL; ++ } ++ ++ if (((*(ttb + idx)) & (ISPMMU_L1D_TYPE_MASK << ++ ISPMMU_L1D_TYPE_SHIFT)) != ++ (ISPMMU_L1D_TYPE_PAGE << ++ ISPMMU_L1D_TYPE_SHIFT)) { ++ DPRINTK_ISPMMU("unmap a wrong region\n"); ++ return -EINVAL; ++ } ++ ++ /* free the associated level-2 page tables */ ++ while (((*(ttb + idx)) & (ISPMMU_L1D_TYPE_MASK << ++ ISPMMU_L1D_TYPE_SHIFT)) == ++ (ISPMMU_L1D_TYPE_PAGE << ++ ISPMMU_L1D_TYPE_SHIFT)) { ++ *(ttb + idx) = (ISPMMU_L1D_TYPE_FAULT << ++ ISPMMU_L1D_TYPE_SHIFT); ++ free_l2_page_table(l2p_table_addr[idx]); ++ l2p_table_addr[idx++] = 0; ++ if (!(idx%ISPMMU_REGION_ENTRIES_NR)) { ++ DPRINTK_ISPMMU("Do not exceed this 32M region\n"); ++ break; ++ } ++ } ++ omap_writel(1, ISPMMU_GFLUSH); ++ ++ DPRINTK_ISPMMU("-ispmmu_unmap()\n"); ++ return 0; ++} ++EXPORT_SYMBOL_GPL(ispmmu_unmap); ++ ++/* ++ * Callback from ISP driver for MMU interrupt ++ * status : IRQ status of ISPMMU ++ * arg1 : Not used as of now. ++ * arg2 : Not used as of now. ++ */ ++static void ispmmu_isr(unsigned long status, isp_vbq_callback_ptr arg1, ++ void *arg2) ++{ ++ u32 irqstatus; ++ ++ irqstatus = omap_readl(ISPMMU_IRQSTATUS); ++ DPRINTK_ISPMMU("mmu error 0x%lx, 0x%x\n", status, irqstatus); ++ ++ if (irqstatus & IRQENABLE_TLBMISS) ++ DPRINTK_ISPMMU("ISP_ERR: TLB Miss\n"); ++ if (irqstatus & IRQENABLE_TRANSLNFAULT) ++ DPRINTK_ISPMMU("ISP_ERR: Invalid descriptor in the " ++ "translation table - Translation Fault\n"); ++ if (irqstatus & IRQENABLE_EMUMISS) ++ DPRINTK_ISPMMU("ISP_ERR: TLB Miss during debug - " ++ "Emulation mode\n"); ++ if (irqstatus & IRQENABLE_TWFAULT) ++ DPRINTK_ISPMMU("ISP_ERR: Table Walk Fault\n"); ++ if (irqstatus & IRQENABLE_MULTIHITFAULT) ++ DPRINTK_ISPMMU("ISP_ERR: Multiple Matches in the TLB\n"); ++ ++ DPRINTK_ISPMMU("Fault address for the ISPMMU is 0x%x\n", ++ omap_readl(ISPMMU_FAULT_AD)); ++ /* ++ * TODO: Indicate the camera driver about the fault and it should ++ * stop using the ISP ++ */ ++ omap_writel(irqstatus, ISPMMU_IRQSTATUS); ++} ++ ++/* ++ * Reserves memory for L1 and L2 Page tables. ++ * Initializes the ISPMMU with TTB address, fault entries as default in the ++ * TTB table. ++ * Enables MMU and TWL. ++ * Sets the callback for the MMU error events. ++ */ ++static int __init ispmmu_init(void) ++{ ++ int i, val = 5; ++ struct isp_sysc isp_sysconfig; ++ ++ isp_get(); ++ ++ /* reset */ ++ omap_writel(0x2, ISPMMU_SYSCONFIG); ++ while (((omap_readl(ISPMMU_SYSSTATUS) & 0x1) != 0x1) && val--) ++ udelay(10); ++ ++ if ((omap_readl(ISPMMU_SYSSTATUS) & 0x1) != 0x1) { ++ DPRINTK_ISPMMU("can't take ISP MMU out of reset\n"); ++ isp_put(); ++ return -ENODEV; ++ } ++ ++ isp_sysconfig.reset = 0; ++ isp_sysconfig.idle_mode = 1; ++ isp_power_settings(isp_sysconfig); ++ ++ ttb_page = alloc_pages(GFP_KERNEL, ++ get_order(ISPMMU_TTB_ENTRIES_NR * 4)); ++ if (!ttb_page) { ++ DPRINTK_ISPMMU("No Memory for TTB\n"); ++ isp_put(); ++ return -ENOMEM; ++ } ++ ++ ttb = page_address(ttb_page); ++ ttb_p = __pa(ttb); ++ ttb_aligned_size = ISPMMU_TTB_ENTRIES_NR * 4; ++ ttb = ioremap_nocache(ttb_p, ttb_aligned_size); ++ if ((ttb_p & 0xFFFFC000) != ttb_p) { ++ DPRINTK_ISPMMU("ISP_ERR : TTB address not aligned at 16KB\n"); ++ __free_pages(ttb_page, get_order(ISPMMU_TTB_ENTRIES_NR * 4)); ++ ttb_aligned_size = (ISPMMU_TTB_ENTRIES_NR * 4) ++ + (ISPMMU_TTB_MISALIGN_SIZE); ++ ttb_page = alloc_pages(GFP_KERNEL, ++ get_order(ttb_aligned_size)); ++ if (!ttb_page) { ++ DPRINTK_ISPMMU("No Memory for TTB\n"); ++ isp_put(); ++ return -ENOMEM; ++ } ++ ttb = page_address(ttb_page); ++ ttb_p = __pa(ttb); ++ ttb = ioremap_nocache(ttb_p, ttb_aligned_size); ++ if ((ttb_p & 0xFFFFC000) != ttb_p) { ++ /* ++ * Move the unaligned address to the next 16KB ++ * alignment ++ */ ++ ttb = (u32 *)(((u32)ttb & 0xFFFFC000) + 0x4000); ++ ttb_p = __pa(ttb); ++ } ++ } ++ ++ DPRINTK_ISPMMU("TTB allocated at p = 0x%x, v = 0x%x, size = 0x%x\n", ++ ttb_p, (u32)ttb, ttb_aligned_size); ++ /*HW Errata 1.40. Camera ISP: MMU endianess polarity inverted */ ++/// if (is_sil_rev_less_than(OMAP3430_REV_ES2_0)) ++/// l1_mapattr_obj.endianism = B_ENDIAN; ++/// else ++ l1_mapattr_obj.endianism = L_ENDIAN; ++ ++ l1_mapattr_obj.element_size = ES_8BIT; ++ l1_mapattr_obj.mixed_size = ACCESS_BASED; ++ l1_mapattr_obj.map_size = L1DFAULT; ++ ++ val = init_l2_page_cache(); ++ if (val) { ++ DPRINTK_ISPMMU("ISP_ERR : init l2 page cache\n"); ++ ttb = page_address(ttb_page); ++ ttb_p = __pa(ttb); ++ ioremap_cached(ttb_p, ttb_aligned_size); ++ __free_pages(ttb_page, get_order(ttb_aligned_size)); ++ ++ isp_put(); ++ return val; ++ } ++ ++ /* Setting all the entries to generate fault by default */ ++ for (i = 0; i < ISPMMU_TTB_ENTRIES_NR; i++) ++ ispmmu_set_pte(ttb + i, 0, l1_mapattr_obj); ++ /* ++ * TTB 31:7 is the address, since TTB is on 16KB boundary the last ++ * 14 bits are 0 ++ */ ++ omap_writel(ttb_p, ISPMMU_TTB); ++ ++ /* Enable MMU with table walking logic */ ++ omap_writel((ISPMMU_MMUCNTL_MMU_EN|ISPMMU_MMUCNTL_TWL_EN), ++ ISPMMU_CNTL); ++ omap_writel(omap_readl(ISPMMU_IRQSTATUS), ISPMMU_IRQSTATUS); ++ omap_writel(0xf, ISPMMU_IRQENABLE); ++ ++ isp_set_callback(CBK_MMU_ERR, ispmmu_isr, (void *)NULL, (void *)NULL); ++ ++ val = omap_readl(ISPMMU_REVISION); ++ DPRINTK_ISPMMU("ISP MMU Rev %c.%c initialized\n", ++ (val>>ISPMMU_REVISION_REV_MAJOR_SHIFT)+'0', ++ (val & ISPMMU_REVISION_REV_MINOR_MASK)+'0'); ++ /* Release the clocks now */ ++ isp_put(); ++ return 0; ++} ++ ++/* ++ * Frees the L1 and L2 Page tables. ++ * Unsets the callback for MMU ++ */ ++static void ispmmu_cleanup(void) ++{ ++ /* free ttb */ ++ ttb = page_address(ttb_page); ++ ttb_p = __pa(ttb); ++ ioremap_cached(ttb_p, ttb_aligned_size); ++ __free_pages(ttb_page, get_order(ttb_aligned_size)); ++ ++ isp_unset_callback(CBK_MMU_ERR); ++ ++ cleanup_l2_page_cache(); ++ ++ return; ++} ++ ++/* ++ * Saves the values of the mmu module registers. ++ */ ++void ispmmu_save_context(void) ++{ ++ DPRINTK_ISPMMU(" Saving context\n"); ++ isp_save_context(ispmmu_reg_list); ++} ++EXPORT_SYMBOL_GPL(ispmmu_save_context); ++ ++/* ++ * Restores the values of the mmu module registers. ++ */ ++void ispmmu_restore_context(void) ++{ ++ DPRINTK_ISPMMU(" Restoring context\n"); ++ isp_restore_context(ispmmu_reg_list); ++} ++EXPORT_SYMBOL_GPL(ispmmu_restore_context); ++ ++/* ++ * Prints the values of the ISPMMU registers ++ * Also prints other debug information stored ++ */ ++void ispmmu_print_status(void) ++{ ++#ifdef OMAP_ISPMMU_DEBUG ++ DPRINTK_ISPMMU("TTB v_addr = 0x%x, p_addr = 0x%x\n", (u32)ttb, ttb_p); ++ DPRINTK_ISPMMU("L2P base v_addr = 0x%x, p_addr = 0x%x\n" ++ , l2_page_cache, l2_page_cache_p); ++ DPRINTK_ISPMMU("ISPMMU_REVISION = 0x%x\n", ++ omap_readl(ISPMMU_REVISION)); ++ DPRINTK_ISPMMU("ISPMMU_SYSCONFIG = 0x%x\n", ++ omap_readl(ISPMMU_SYSCONFIG)); ++ DPRINTK_ISPMMU("ISPMMU_SYSSTATUS = 0x%x\n", ++ omap_readl(ISPMMU_SYSSTATUS)); ++ DPRINTK_ISPMMU("ISPMMU_IRQSTATUS = 0x%x\n", ++ omap_readl(ISPMMU_IRQSTATUS)); ++ DPRINTK_ISPMMU("ISPMMU_IRQENABLE = 0x%x\n", ++ omap_readl(ISPMMU_IRQENABLE)); ++ DPRINTK_ISPMMU("ISPMMU_WALKING_ST = 0x%x\n", ++ omap_readl(ISPMMU_WALKING_ST)); ++ DPRINTK_ISPMMU("ISPMMU_CNTL = 0x%x\n", omap_readl(ISPMMU_CNTL)); ++ DPRINTK_ISPMMU("ISPMMU_FAULT_AD = 0x%x\n", ++ omap_readl(ISPMMU_FAULT_AD)); ++ DPRINTK_ISPMMU("ISPMMU_TTB = 0x%x\n", omap_readl(ISPMMU_TTB)); ++ DPRINTK_ISPMMU("ISPMMU_LOCK = 0x%x\n", omap_readl(ISPMMU_LOCK)); ++ DPRINTK_ISPMMU("ISPMMU_LD_TLB= 0x%x\n", omap_readl(ISPMMU_LD_TLB)); ++ DPRINTK_ISPMMU("ISPMMU_CAM = 0x%x\n", omap_readl(ISPMMU_CAM)); ++ DPRINTK_ISPMMU("ISPMMU_RAM = 0x%x\n", omap_readl(ISPMMU_RAM)); ++ DPRINTK_ISPMMU("ISPMMU_GFLUSH = 0x%x\n", omap_readl(ISPMMU_GFLUSH)); ++ DPRINTK_ISPMMU("ISPMMU_FLUSH_ENTRY = 0x%x\n", ++ omap_readl(ISPMMU_FLUSH_ENTRY)); ++ DPRINTK_ISPMMU("ISPMMU_READ_CAM = 0x%x\n", ++ omap_readl(ISPMMU_READ_CAM)); ++ DPRINTK_ISPMMU("ISPMMU_READ_RAM = 0x%x\n", ++ omap_readl(ISPMMU_READ_RAM)); ++#endif ++} ++EXPORT_SYMBOL_GPL(ispmmu_print_status); ++ ++MODULE_AUTHOR("Texas Instruments."); ++MODULE_DESCRIPTION("OMAP3430 ISP MMU Driver"); ++MODULE_LICENSE("GPL"); ++ ++module_init(ispmmu_init); ++module_exit(ispmmu_cleanup); +Index: git/drivers/media/video/isp/ispmmu.h +=================================================================== +--- /dev/null 1970-01-01 00:00:00.000000000 +0000 ++++ git/drivers/media/video/isp/ispmmu.h 2009-02-12 10:29:26.000000000 -0600 +@@ -0,0 +1,57 @@ ++/* ++ * drivers/media/video/isp/ispmmu.h ++ * ++ * OMAP3430 Camera ISP MMU API ++ * ++ * Copyright (C) 2008 Texas Instruments. ++ * ++ * This package 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 PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR ++ * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED ++ * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. ++ */ ++ ++#ifndef OMAP_ISP_MMU_H ++#define OMAP_ISP_MMU_H ++ ++#ifdef CONFIG_ARCH_OMAP3410 ++#include <asm/scatterlist.h> ++#endif ++ ++dma_addr_t ispmmu_map(unsigned int p_addr, int size); ++ ++/* ++* To be called from camera driver with scatter gather list ++*/ ++dma_addr_t ispmmu_map_sg(const struct scatterlist *sglist, int sglen); ++int ispmmu_unmap(dma_addr_t isp_addr); ++ ++void ispmmu_print_status(void); ++ ++enum ++ISPMMU_MAP_ENDIAN{L_ENDIAN, B_ENDIAN}; ++ ++enum ++ISPMMU_MAP_ELEMENTSIZE{ES_8BIT, ES_16BIT, ES_32BIT, ES_NOENCONV}; ++ ++enum ++ISPMMU_MAP_MIXEDREGION{ACCESS_BASED, PAGE_BASED}; ++ ++enum ++ISPMMU_MAP_SIZE{L1DFAULT, PAGE, SECTION, SUPERSECTION, L2DFAULT, ++ LARGEPAGE, SMALLPAGE}; ++ ++/* ++ * Saves mmu context ++ */ ++void ispmmu_save_context(void); ++ ++/* ++ * Restores mmu context ++ */ ++void ispmmu_restore_context(void); ++ ++#endif /* OMAP_ISP_MMU_H */ +Index: git/drivers/media/video/isp/isppreview.c +=================================================================== +--- /dev/null 1970-01-01 00:00:00.000000000 +0000 ++++ git/drivers/media/video/isp/isppreview.c 2009-02-12 10:29:18.000000000 -0600 +@@ -0,0 +1,1894 @@ ++/* ++ * drivers/media/video/isp/isppreview.c ++ * ++ * Driver Library for Preview module in TI's OMAP3430 Camera ISP ++ * ++ * Copyright (C) 2008 Texas Instruments, Inc. ++ * ++ * This package 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 PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR ++ * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED ++ * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. ++ */ ++ ++#include <linux/mutex.h> ++#include <linux/module.h> ++#include <linux/errno.h> ++#include <linux/types.h> ++#include <asm/io.h> ++ ++#include "isp.h" ++#include "ispreg.h" ++#include "isppreview.h" ++#include <asm/uaccess.h> ++ ++static struct ispprev_nf prev_nf_t; ++static int RG_update, GG_update, BG_update, NF_enable, NF_update; ++ ++/* Structure for saving/restoring preview module registers*/ ++static struct isp_reg ispprev_reg_list[] = { ++ {ISPPRV_HORZ_INFO, 0x0000}, ++ {ISPPRV_VERT_INFO, 0x0000}, ++ {ISPPRV_RSDR_ADDR, 0x0000}, ++ {ISPPRV_RADR_OFFSET, 0x0000}, ++ {ISPPRV_DSDR_ADDR, 0x0000}, ++ {ISPPRV_DRKF_OFFSET, 0x0000}, ++ {ISPPRV_WSDR_ADDR, 0x0000}, ++ {ISPPRV_WADD_OFFSET, 0x0000}, ++ {ISPPRV_AVE, 0x0000}, ++ {ISPPRV_HMED, 0x0000}, ++ {ISPPRV_NF, 0x0000}, ++ {ISPPRV_WB_DGAIN, 0x0000}, ++ {ISPPRV_WBGAIN, 0x0000}, ++ {ISPPRV_WBSEL, 0x0000}, ++ {ISPPRV_CFA, 0x0000}, ++ {ISPPRV_BLKADJOFF, 0x0000}, ++ {ISPPRV_RGB_MAT1, 0x0000}, ++ {ISPPRV_RGB_MAT2, 0x0000}, ++ {ISPPRV_RGB_MAT3, 0x0000}, ++ {ISPPRV_RGB_MAT4, 0x0000}, ++ {ISPPRV_RGB_MAT5, 0x0000}, ++ {ISPPRV_RGB_OFF1, 0x0000}, ++ {ISPPRV_RGB_OFF2, 0x0000}, ++ {ISPPRV_CSC0, 0x0000}, ++ {ISPPRV_CSC1, 0x0000}, ++ {ISPPRV_CSC2, 0x0000}, ++ {ISPPRV_CSC_OFFSET, 0x0000}, ++ {ISPPRV_CNT_BRT, 0x0000}, ++ {ISPPRV_CSUP, 0x0000}, ++ {ISPPRV_SETUP_YC, 0x0000}, ++ {ISPPRV_SET_TBL_ADDR, 0x0000}, ++ {ISPPRV_SET_TBL_DATA, 0x0000}, ++ {ISPPRV_CDC_THR0, 0x0000}, ++ {ISPPRV_CDC_THR1, 0x0000}, ++ {ISPPRV_CDC_THR2, 0x0000}, ++ {ISPPRV_CDC_THR3, 0x0000}, ++ {ISP_TOK_TERM, 0x0000} ++}; ++ ++ ++/* Default values in Office Flourescent Light for RGBtoRGB Blending */ ++static struct ispprev_rgbtorgb flr_rgb2rgb = { ++ { /* RGB-RGB Matrix */ ++ { 0x01E2, 0x0F30, 0x0FEE }, ++ { 0x0F9B, 0x01AC, 0x0FB9 }, ++ { 0x0FE0, 0x0EC0, 0x0260 } ++ }, /* RGB Offset */ ++ {0x0000, 0x0000, 0x0000} ++}; ++ ++/* Default values in Office Flourescent Light for RGB to YUV Conversion*/ ++static struct ispprev_csc flr_prev_csc[] = { ++ { ++ { /* CSC Coef Matrix */ ++ { 66, 129, 25}, ++ { -38, -75, 112}, ++ { 112, -94 , -18} ++ }, /* CSC Offset */ ++ {0x0, 0x0, 0x0} ++ }, ++ { ++ { /* CSC Coef Matrix Sepia*/ ++ { 19, 38, 7}, ++ { 0, 0, 0}, ++ { 0, 0, 0} ++ }, /* CSC Offset */ ++ {0x0, 0xE7, 0x14} ++ }, ++ { ++ { /* CSC Coef Matrix BW*/ ++ { 66, 129, 25}, ++ { 0, 0, 0}, ++ { 0, 0, 0} ++ }, /* CSC Offset */ ++ {0x0, 0x0, 0x0} ++ } ++}; ++ ++ ++/* Default values in Office Flourescent Light for CFA Gradient*/ ++static u8 flr_cfa_gradthrs_horz = 0x28; ++static u8 flr_cfa_gradthrs_vert = 0x28; ++ ++/* Default values in Office Flourescent Light for Chroma Suppression*/ ++static u8 flr_csup_gain = 0x0D; ++static u8 flr_csup_thres = 0xEB; ++ ++/* Default values in Office Flourescent Light for Noise Filter*/ ++static u8 flr_nf_strgth = 0x03; ++ ++/* Default values in Office Flourescent Light for White Balance*/ ++static u16 flr_wbal_dgain = 0x100; ++static u8 flr_wbal_coef0 = 0x68; ++static u8 flr_wbal_coef1 = 0x5c; ++static u8 flr_wbal_coef2 = 0x5c; ++static u8 flr_wbal_coef3 = 0x94; ++ ++/* Default values in Office Flourescent Light for Black Adjustment*/ ++static u8 flr_blkadj_blue = 0x0; ++static u8 flr_blkadj_green = 0x0; ++static u8 flr_blkadj_red = 0x0; ++ ++static int update_color_matrix; ++ ++/* ++ * Structure for the preview module to store its own information. ++ */ ++static struct isp_prev { ++ u8 prev_inuse; ++ u32 prevout_w; ++ u32 prevout_h; ++ u32 previn_w; ++ u32 previn_h; ++ enum preview_input prev_inpfmt; ++ enum preview_output prev_outfmt; ++ u8 hmed_en; ++ u8 nf_en; ++ u8 dcor_en; ++ u8 cfa_en; ++ u8 csup_en; ++ u8 yenh_en; ++ u8 fmtavg; ++ u8 brightness; ++ u8 contrast; ++ enum preview_color_effect color; ++ enum cfa_fmt cfafmt; ++ struct mutex ispprev_mutex; ++} ispprev_obj; ++ ++/* Saved parameters */ ++struct prev_params *prev_config_params; ++ ++/* ++ * Coeficient Tables for the submodules in Preview. ++ * Array is initialised with the values from.the tables text file. ++ */ ++ ++/* ++ * CFA Filter Coefficient Table ++ * ++ */ ++static u32 cfa_coef_table[] = { ++#include "cfa_coef_table.h" ++}; ++ ++/* ++ * Gamma Correction Table - Red ++ */ ++static u32 redgamma_table[] = { ++#include "redgamma_table.h" ++}; ++ ++/* ++ * Gamma Correction Table - Green ++ */ ++static u32 greengamma_table[] = { ++#include "greengamma_table.h" ++}; ++ ++/* ++ * Gamma Correction Table - Blue ++ */ ++static u32 bluegamma_table[] = { ++#include "bluegamma_table.h" ++}; ++ ++/* ++ * Noise Filter Threshold table ++ */ ++static u32 noise_filter_table[] = { ++#include "noise_filter_table.h" ++}; ++ ++/* ++ * Luminance Enhancement Table ++ */ ++static u32 luma_enhance_table[] = { ++#include "luma_enhance_table.h" ++}; ++ ++int omap34xx_isp_preview_config(void *userspace_add) ++{ ++ struct prev_params *params = prev_config_params; ++ struct ispprev_hmed prev_hmed_t; ++ struct ispprev_cfa prev_cfa_t; ++ struct ispprev_csup csup_t; ++ struct ispprev_wbal prev_wbal_t; ++ struct ispprev_blkadj prev_blkadj_t; ++ struct ispprev_rgbtorgb rgb2rgb_t; ++ struct ispprev_csc prev_csc_t; ++ struct ispprev_yclimit yclimit_t; ++ struct ispprev_dcor prev_dcor_t; ++ struct ispprv_update_config preview_struct; ++ int yen_t[128]; ++ ++ if (userspace_add == NULL) ++ return -EINVAL ; ++ if (copy_from_user(&preview_struct, ++ (struct ispprv_update_config *)userspace_add, ++ sizeof(struct ispprv_update_config))) { ++ goto err_copy_from_user; ++ } ++ if ((ISP_ABS_PREV_LUMAENH & preview_struct.flag) == ++ ISP_ABS_PREV_LUMAENH) { ++ if ((ISP_ABS_PREV_LUMAENH & preview_struct.update) == ++ ISP_ABS_PREV_LUMAENH) { ++ if (copy_from_user(yen_t, (preview_struct.yen), ++ sizeof(yen_t))) ++ goto err_copy_from_user; ++ ++ isppreview_config_luma_enhancement(yen_t); ++ params->features |= (PREV_LUMA_ENHANCE); ++ } else ++ params->features |= (PREV_LUMA_ENHANCE); ++ } else { ++ if ((ISP_ABS_PREV_LUMAENH & preview_struct.update) == ++ ISP_ABS_PREV_LUMAENH) ++ params->features &= ~(PREV_LUMA_ENHANCE); ++ } ++ ++ if ((ISP_ABS_PREV_INVALAW & preview_struct.flag) ++ == ISP_ABS_PREV_INVALAW) { ++ isppreview_enable_invalaw(1); ++ params->features |= (PREV_INVERSE_ALAW); ++ } else { ++ isppreview_enable_invalaw(0); ++ params->features &= ~(PREV_INVERSE_ALAW); ++ } ++ ++ if ((ISP_ABS_PREV_HRZ_MED & preview_struct.flag) == ++ ISP_ABS_PREV_HRZ_MED) { ++ if ((ISP_ABS_PREV_HRZ_MED & preview_struct.update) ++ == ISP_ABS_PREV_HRZ_MED) { ++ if (copy_from_user(&prev_hmed_t, ++ (struct ispprev_hmed *) ++ (preview_struct.prev_hmed), ++ sizeof(struct ispprev_hmed))) ++ goto err_copy_from_user; ++ isppreview_config_hmed(prev_hmed_t); ++ isppreview_enable_hmed(1); ++ params->features |= (PREV_HORZ_MEDIAN_FILTER); ++ } else { ++ isppreview_enable_hmed(1); ++ params->features |= (PREV_HORZ_MEDIAN_FILTER); ++ } ++ } else { ++ if ((ISP_ABS_PREV_HRZ_MED & preview_struct.update) == ++ ISP_ABS_PREV_HRZ_MED) { ++ isppreview_enable_hmed(0); ++ params->features &= ~(PREV_HORZ_MEDIAN_FILTER); ++ } ++ } ++ ++ if ((ISP_ABS_PREV_CFA & preview_struct.flag) == ++ ISP_ABS_PREV_CFA) { ++ if ((ISP_ABS_PREV_CFA & preview_struct.update) == ++ ISP_ABS_PREV_CFA) { ++ if (copy_from_user(&prev_cfa_t, ++ (struct ispprev_cfa *)preview_struct. ++ prev_cfa, sizeof(struct ispprev_cfa))) ++ goto err_copy_from_user; ++ ++ isppreview_config_cfa(prev_cfa_t); ++ isppreview_enable_cfa(1); ++ params->features |= (PREV_CFA); ++ ++ } else { ++ isppreview_enable_cfa(1); ++ params->features |= (PREV_CFA); ++ } ++ } else { ++ if ((ISP_ABS_PREV_CFA & preview_struct.update) == ++ ISP_ABS_PREV_CFA) { ++ isppreview_enable_cfa(0); ++ params->features &= ~(PREV_CFA); ++ } ++ } ++ ++ if ((ISP_ABS_PREV_CHROMA_SUPP & preview_struct.flag) == ++ ISP_ABS_PREV_CHROMA_SUPP) { ++ if ((ISP_ABS_PREV_CHROMA_SUPP & ++ preview_struct.update) == ++ ISP_ABS_PREV_CHROMA_SUPP) { ++ if (copy_from_user(&csup_t, ++ (struct ispprev_csup *) ++ (preview_struct.csup), ++ sizeof(struct ispprev_csup))) ++ goto err_copy_from_user; ++ ++ isppreview_config_chroma_suppression(csup_t); ++ isppreview_enable_chroma_suppression(1); ++ params->features |= (PREV_CHROMA_SUPPRESS); ++ ++ } else { ++ isppreview_enable_chroma_suppression(1); ++ params->features |= (PREV_CHROMA_SUPPRESS); ++ } ++ } else { ++ if ((ISP_ABS_PREV_CHROMA_SUPP & ++ preview_struct.update) == ++ ISP_ABS_PREV_CHROMA_SUPP) { ++ isppreview_enable_chroma_suppression(0); ++ params->features &= ~(PREV_CHROMA_SUPPRESS); ++ } ++ } ++ ++ if ((ISP_ABS_PREV_WB & preview_struct.update) == ISP_ABS_PREV_WB) { ++ if (copy_from_user(&prev_wbal_t, ++ (struct ispprev_wbal *)(preview_struct. ++ prev_wbal), sizeof(struct ispprev_wbal))) ++ goto err_copy_from_user; ++ ++ isppreview_config_whitebalance(prev_wbal_t); ++ } ++ ++ if ((ISP_ABS_PREV_BLKADJ & preview_struct.update) ++ == ISP_ABS_PREV_BLKADJ) { ++ if (copy_from_user(&prev_blkadj_t, ++ (struct ispprev_blkadjl *)(preview_struct. ++ prev_blkadj), sizeof(struct ispprev_blkadj))) { ++ goto err_copy_from_user; ++ } ++ isppreview_config_blkadj(prev_blkadj_t); ++ } ++ ++ if ((ISP_ABS_PREV_RGB2RGB & preview_struct.update) ++ == ISP_ABS_PREV_RGB2RGB) { ++ if (copy_from_user(&rgb2rgb_t, ++ (struct ispprev_rgbtorgb *)(preview_struct. ++ rgb2rgb), sizeof(struct ispprev_rgbtorgb))) ++ goto err_copy_from_user; ++ ++ isppreview_config_rgb_blending(rgb2rgb_t); ++ } ++ ++ if ((ISP_ABS_PREV_COLOR_CONV & preview_struct.update) ++ == ISP_ABS_PREV_COLOR_CONV) { ++ if (copy_from_user(&prev_csc_t, ++ (struct ispprev_csc *)(preview_struct. ++ prev_csc), sizeof(struct ispprev_csc))) ++ goto err_copy_from_user; ++ ++ isppreview_config_rgb_to_ycbcr(prev_csc_t); ++ } ++ ++ if ((ISP_ABS_PREV_YC_LIMIT & preview_struct.update) ++ == ISP_ABS_PREV_YC_LIMIT) { ++ if (copy_from_user(&yclimit_t, ++ (struct ispprev_yclimit *)(preview_struct. ++ yclimit), sizeof(struct ispprev_yclimit))) ++ goto err_copy_from_user; ++ ++ isppreview_config_yc_range(yclimit_t); ++ } ++ ++ if ((ISP_ABS_PREV_DEFECT_COR & preview_struct.flag) == ++ ISP_ABS_PREV_DEFECT_COR) { ++ if ((ISP_ABS_PREV_DEFECT_COR & preview_struct.update) == ++ ISP_ABS_PREV_DEFECT_COR) { ++ if (copy_from_user(&prev_dcor_t, ++ (struct ispprev_dcor *) ++ (preview_struct.prev_dcor), ++ sizeof(struct ispprev_dcor))) ++ goto err_copy_from_user; ++ ++ isppreview_config_dcor(prev_dcor_t); ++ isppreview_enable_dcor(1); ++ params->features |= (PREV_DEFECT_COR); ++ } else { ++ isppreview_enable_dcor(1); ++ params->features |= (PREV_DEFECT_COR); ++ } ++ } else { ++ if ((ISP_ABS_PREV_DEFECT_COR & preview_struct.update) == ++ ISP_ABS_PREV_DEFECT_COR) { ++ isppreview_enable_dcor(0); ++ params->features &= ~(PREV_DEFECT_COR); ++ } ++ } ++ ++ if ((ISP_ABS_PREV_GAMMABYPASS & preview_struct.flag) == ++ ISP_ABS_PREV_GAMMABYPASS) { ++ isppreview_enable_gammabypass(1); ++ params->features |= (PREV_GAMMA_BYPASS); ++ } else { ++ isppreview_enable_gammabypass(0); ++ params->features &= ~(PREV_GAMMA_BYPASS); ++ } ++ ++ return 0; ++ ++err_copy_from_user: ++ printk(KERN_ERR); ++ DPRINTK_ISPPREV("ISP_ERR : Preview Copy From User Error \n"); ++ return -EINVAL ; ++} ++EXPORT_SYMBOL(omap34xx_isp_preview_config); ++ ++int omap34xx_isp_tables_update(void *userspace_add) ++{ ++ struct isptables_update isptables_struct; ++ struct prev_params *params = prev_config_params; ++ ++ if (userspace_add == NULL) ++ return -EINVAL; ++ ++ if (copy_from_user(&isptables_struct, ++ (struct isptables_update *)(userspace_add), ++ sizeof(struct isptables_update))) ++ goto err_copy_from_user; ++ ++ if ((ISP_ABS_TBL_NF & isptables_struct.flag) == ISP_ABS_TBL_NF) { ++ NF_enable = 1; ++ params->features |= (PREV_NOISE_FILTER); ++ } else { ++ NF_enable = 0; ++ params->features &= ~(PREV_NOISE_FILTER); ++ } ++ ++ if ((ISP_ABS_TBL_NF & isptables_struct.update) == ISP_ABS_TBL_NF) { ++ if (copy_from_user(&prev_nf_t, (void *)isptables_struct.prev_nf, ++ sizeof(struct ispprev_nf))) ++ goto err_copy_from_user; ++ ++ if (copy_from_user(noise_filter_table, prev_nf_t.table, ++ sizeof(noise_filter_table))) { ++ NF_update = 0; ++ goto err_copy_from_user; ++ } ++ prev_nf_t.table = noise_filter_table; ++ NF_update = 1; ++ } ++ ++ if ((ISP_ABS_TBL_REDGAMMA & isptables_struct.update) == ++ ISP_ABS_TBL_REDGAMMA) { ++ if (copy_from_user(redgamma_table, ++ (isptables_struct.red_gamma), ++ sizeof(redgamma_table))) { ++ RG_update = 0; ++ goto err_copy_from_user; ++ } ++ RG_update = 1; ++ } ++ ++ if ((ISP_ABS_TBL_GREENGAMMA & isptables_struct.update) == ++ ISP_ABS_TBL_GREENGAMMA) { ++ if (copy_from_user(greengamma_table, ++ (isptables_struct.green_gamma), ++ sizeof(greengamma_table))) { ++ GG_update = 0; ++ goto err_copy_from_user; ++ } ++ GG_update = 1; ++ } ++ ++ if ((ISP_ABS_TBL_BLUEGAMMA & isptables_struct.update) == ++ ISP_ABS_TBL_BLUEGAMMA) { ++ if (copy_from_user(bluegamma_table, ++ (isptables_struct.blue_gamma), ++ sizeof(bluegamma_table))) { ++ BG_update = 0; ++ goto err_copy_from_user; ++ } ++ BG_update = 1; ++ } ++ ++ return 0; ++ ++err_copy_from_user: ++ printk(KERN_ERR "Preview Tables:Copy From User Error"); ++ return -EINVAL; ++} ++EXPORT_SYMBOL(omap34xx_isp_tables_update); ++ ++/* ++ * Allows user to program shadow registers associated with preview module. ++ */ ++void ++isppreview_config_shadow_registers() ++{ ++ struct prev_params *params = prev_config_params; ++ u8 current_brightness_contrast; ++ int ctr, prv_disabled; ++ ++ /* Program Brightness if needed */ ++ isppreview_query_brightness(¤t_brightness_contrast); ++ if (current_brightness_contrast != ((ispprev_obj.brightness) * ++ ISPPRV_BRIGHT_UNITS)) { ++ DPRINTK_ISPPREV(" Changing Brightness level to %d\n", ++ ispprev_obj.brightness); ++ isppreview_config_brightness((ispprev_obj.brightness) * ++ ISPPRV_BRIGHT_UNITS); ++ } ++ ++ /* Program Contrast if needed */ ++ isppreview_query_contrast(¤t_brightness_contrast); ++ if (current_brightness_contrast != ((ispprev_obj.contrast) * ++ ISPPRV_CONTRAST_UNITS)) { ++ DPRINTK_ISPPREV(" Changing Contrast level to %d\n", ++ ispprev_obj.contrast); ++ isppreview_config_contrast((ispprev_obj.contrast) * ++ ISPPRV_CONTRAST_UNITS); ++ } ++ ++ if (update_color_matrix) { ++ isppreview_config_rgb_to_ycbcr( ++ flr_prev_csc[ispprev_obj.color]); ++ update_color_matrix = 0; ++ } ++ ++ if (GG_update || RG_update || BG_update || NF_update) { ++ isppreview_enable(0); ++ prv_disabled = 1; ++ } ++ ++ if (GG_update) { ++ omap_writel(0x400, ISPPRV_SET_TBL_ADDR); ++ ++ for (ctr = 0; ctr < ISP_GAMMA_TABLE_SIZE; ctr++) ++ omap_writel(greengamma_table[ctr], ++ ISPPRV_SET_TBL_DATA); ++ ++ GG_update = 0; ++ } ++ ++ if (RG_update) { ++ omap_writel(0, ISPPRV_SET_TBL_ADDR); ++ ++ for (ctr = 0; ctr < ISP_GAMMA_TABLE_SIZE; ctr++) ++ omap_writel(redgamma_table[ctr], ISPPRV_SET_TBL_DATA); ++ ++ RG_update = 0; ++ } ++ ++ if (BG_update) { ++ omap_writel(0x800, ISPPRV_SET_TBL_ADDR); ++ ++ for (ctr = 0; ctr < ISP_GAMMA_TABLE_SIZE; ctr++) ++ omap_writel(bluegamma_table[ctr], ISPPRV_SET_TBL_DATA); ++ ++ BG_update = 0; ++ } ++ ++ if (NF_update) { ++ isppreview_config_noisefilter(prev_nf_t); ++ ++ if (NF_enable) { ++ isppreview_enable_noisefilter(1); ++ params->features |= ~(PREV_NOISE_FILTER); ++ } else { ++ isppreview_enable_noisefilter(0); ++ params->features &= ~(PREV_NOISE_FILTER); ++ } ++ ++ NF_update = 0; ++ } ++ ++ if (prv_disabled) { ++ isppreview_enable(1); ++ prv_disabled = 0; ++ } ++} ++EXPORT_SYMBOL(isppreview_config_shadow_registers); ++ ++/** ++ * isppreview_request - Reserves the preview module. ++ * ++ * Returns 0 if successful, or -EBUSY if the module was already reserved. ++ **/ ++int isppreview_request() ++{ ++ mutex_lock(&ispprev_obj.ispprev_mutex); ++ if (!(ispprev_obj.prev_inuse)) { ++ ispprev_obj.prev_inuse = 1; ++ mutex_unlock(&ispprev_obj.ispprev_mutex); ++ /* Turn on Preview module Clocks. */ ++ omap_writel((omap_readl(ISP_CTRL)) | ISPCTRL_PREV_RAM_EN | ++ ISPCTRL_PREV_CLK_EN | ISPCTRL_SBL_WR1_RAM_EN ++ , ISP_CTRL); ++ return 0; ++ } else{ ++ mutex_unlock(&ispprev_obj.ispprev_mutex); ++ printk(KERN_ERR "ISP_ERR : Preview Module Busy\n"); ++ return -EBUSY; ++ } ++} ++EXPORT_SYMBOL(isppreview_request); ++ ++/* ++ * Marks Preview module free. ++ */ ++int ++isppreview_free() ++{ ++ mutex_lock(&ispprev_obj.ispprev_mutex); ++ if (ispprev_obj.prev_inuse) { ++ ispprev_obj.prev_inuse = 0; ++ mutex_unlock(&ispprev_obj.ispprev_mutex); ++ omap_writel(omap_readl(ISP_CTRL) & ~(ISPCTRL_PREV_CLK_EN | ++ ISPCTRL_PREV_RAM_EN ++ | ISPCTRL_SBL_WR1_RAM_EN), ISP_CTRL); ++ return 0; ++ } else { ++ mutex_unlock(&ispprev_obj.ispprev_mutex); ++ DPRINTK_ISPPREV("ISP_ERR : Preview Module already freed\n"); ++ return -EINVAL; ++ } ++ ++} ++EXPORT_SYMBOL(isppreview_free); ++ ++/* Sets up the default preview configuration according to the arguments. ++ * input: Indicates the module that gives the image to preview ++ * output: Indicates the module to which the preview outputs to. ++ */ ++int ++isppreview_config_datapath(enum preview_input input, ++ enum preview_output output) ++{ ++ u32 pcr = 0; ++ u8 enable = 0; ++ struct prev_params *params = prev_config_params; ++ struct ispprev_yclimit yclimit; ++ ++ pcr = omap_readl(ISPPRV_PCR); ++ ++ switch (input) { ++ case PRV_RAW_CCDC: ++ pcr &= ~(ISPPRV_PCR_SOURCE); ++ pcr &= ~(ISPPRV_PCR_ONESHOT); ++ ispprev_obj.prev_inpfmt = PRV_RAW_CCDC; ++ break; ++ case PRV_RAW_MEM: ++ pcr |= ISPPRV_PCR_SOURCE; ++ pcr |= ISPPRV_PCR_ONESHOT; ++ ispprev_obj.prev_inpfmt = PRV_RAW_MEM; ++ break; ++ case PRV_CCDC_DRKF: ++ pcr |= ISPPRV_PCR_DRKFCAP; ++ pcr |= ISPPRV_PCR_ONESHOT; ++ ispprev_obj.prev_inpfmt = PRV_CCDC_DRKF; ++ break; ++ /* Just check for input path validity. No PCR update required ++ * for the current HW setup. ++ */ ++ case PRV_COMPCFA: ++ ispprev_obj.prev_inpfmt = PRV_COMPCFA; ++ break; ++ case PRV_OTHERS: ++ ispprev_obj.prev_inpfmt = PRV_OTHERS; ++ break; ++ case PRV_RGBBAYERCFA: ++ ispprev_obj.prev_inpfmt = PRV_RGBBAYERCFA; ++ break; ++ default: ++ printk(KERN_ERR "ISP_ERR : Wrong Input\n"); ++ return -EINVAL; ++ }; ++ ++ if (output == PREVIEW_RSZ) { ++ pcr |= ISPPRV_PCR_RSZPORT; ++ pcr &= (~ISPPRV_PCR_SDRPORT); ++ ispprev_obj.prev_outfmt = PREVIEW_RSZ; ++ } else if (output == PREVIEW_MEM) { ++ pcr &= (~ISPPRV_PCR_RSZPORT); ++ pcr |= ISPPRV_PCR_SDRPORT; ++ ispprev_obj.prev_outfmt = PREVIEW_MEM; ++ } else { ++ printk(KERN_ERR "ISP_ERR : Wrong Output\n"); ++ return -EINVAL; ++ } ++ omap_writel(pcr, ISPPRV_PCR); ++ ++ /* Default Output format configured is YCrYCb (UYVY) */ ++ isppreview_config_ycpos(params->pix_fmt); ++ ++ /* CFA */ ++ if (params->cfa.cfa_table != NULL) ++ isppreview_config_cfa(params->cfa); ++ /* Chroma Suppression */ ++ if (params->csup.hypf_en == 1) ++ isppreview_config_chroma_suppression(params->csup); ++ /* Luma */ ++ if (params->ytable != NULL) ++ isppreview_config_luma_enhancement(params->ytable); ++ /* Noise Filter */ ++ /* Gamma Correction */ ++ if (params->gtable.redtable != NULL) ++ isppreview_config_gammacorrn(params->gtable); ++ ++ /* Enabling specific features */ ++ enable = ((params->features & PREV_CFA) == PREV_CFA) ? 1 : 0; ++ isppreview_enable_cfa(enable); ++ ++ enable = ((params->features & PREV_CHROMA_SUPPRESS) ++ == PREV_CHROMA_SUPPRESS) ? 1 : 0; ++ isppreview_enable_chroma_suppression(enable); ++ ++ enable = ((params->features & PREV_LUMA_ENHANCE) ++ == PREV_LUMA_ENHANCE) ? 1 : 0; ++ isppreview_enable_luma_enhancement(enable); ++ ++ enable = ((params->features & PREV_NOISE_FILTER) ++ == PREV_NOISE_FILTER) ? 1 : 0; ++ if (enable) ++ isppreview_config_noisefilter(params->nf); ++ isppreview_enable_noisefilter(enable); ++ ++ enable = ((params->features & PREV_DEFECT_COR) ++ == PREV_DEFECT_COR) ? 1 : 0; ++ if (enable) ++ isppreview_config_dcor(params->dcor); ++ isppreview_enable_dcor(enable); ++ ++ enable = ((params->features & PREV_GAMMA_BYPASS) ++ == PREV_GAMMA_BYPASS) ? 1 : 0; ++ isppreview_enable_gammabypass(enable); ++ ++ isppreview_config_whitebalance(params->wbal); ++ isppreview_config_blkadj(params->blk_adj); ++ isppreview_config_rgb_blending(params->rgb2rgb); ++ isppreview_config_rgb_to_ycbcr(params->rgb2ycbcr); ++ ++ isppreview_config_contrast(params->contrast * ISPPRV_CONTRAST_UNITS); ++ isppreview_config_brightness(params->brightness * ISPPRV_BRIGHT_UNITS); ++ ++ yclimit.minC = ISPPRV_YC_MIN; ++ yclimit.maxC = ISPPRV_YC_MAX; ++ yclimit.minY = ISPPRV_YC_MIN; ++ yclimit.maxY = ISPPRV_YC_MAX; ++ isppreview_config_yc_range(yclimit); ++ ++ return 0; ++} ++EXPORT_SYMBOL(isppreview_config_datapath); ++ ++/* ++ * Configure byte layout of YUV image ++ */ ++void isppreview_config_ycpos(enum preview_ycpos_mode mode) ++{ ++ u32 pcr = omap_readl(ISPPRV_PCR); ++ pcr &= (~ISPPRV_PCR_YCPOS_CrYCbY); ++ pcr |= (mode << ISPPRV_PCR_YCPOS_SHIFT); ++ omap_writel(pcr, ISPPRV_PCR); ++} ++EXPORT_SYMBOL(isppreview_config_ycpos); ++ ++/* ++ * Enable/disable/configure averager ++ */ ++void ++isppreview_config_averager(u8 average) ++{ ++ int reg = 0; ++ ++ reg = AVE_ODD_PIXEL_DIST | AVE_EVEN_PIXEL_DIST | average; ++ omap_writel(reg, ISPPRV_AVE); ++} ++EXPORT_SYMBOL(isppreview_config_averager); ++ ++/* ++ * Enable/Disable the Inverse A-Law module in Preview ++ * enable: 1- Reverse the ALaw done in CCDC. ++ */ ++void isppreview_enable_invalaw(u8 enable) ++{ ++ u32 pcr_val = 0; ++ pcr_val = omap_readl(ISPPRV_PCR); ++ ++ if (enable) ++ omap_writel(pcr_val | ISPPRV_PCR_WIDTH | ISPPRV_PCR_INVALAW, ++ ISPPRV_PCR); ++ else ++ omap_writel(pcr_val & ~(ISPPRV_PCR_WIDTH | ISPPRV_PCR_INVALAW), ++ ISPPRV_PCR); ++} ++EXPORT_SYMBOL(isppreview_enable_invalaw); ++ ++/* Enable/Disable of the darkframe subtract for each captured frame. ++ * enable: 1- Acquires memory bandwidth since the pixels in each frame is ++ * subtracted with the pixels in the current frame. ++ */ ++void ++isppreview_enable_drkframe(u8 enable) ++{ ++ if (enable) ++ omap_writel(omap_readl(ISPPRV_PCR) | ISPPRV_PCR_DRKFEN, ++ ISPPRV_PCR); ++ else ++ omap_writel((omap_readl(ISPPRV_PCR)) & ~ISPPRV_PCR_DRKFEN, ++ ISPPRV_PCR); ++} ++EXPORT_SYMBOL(isppreview_enable_drkframe); ++ ++/* If dark frame subtract not to be used, then enable this shading compensation ++ * enable: 1- Enables the shading compensation. ++ */ ++void ++isppreview_enable_shadcomp(u8 enable) ++{ ++ ++ if (enable) { ++ omap_writel((omap_readl(ISPPRV_PCR)) | ISPPRV_PCR_SCOMP_EN, ++ ISPPRV_PCR); ++ isppreview_enable_drkframe(1); ++ } else ++ omap_writel((omap_readl(ISPPRV_PCR)) & ~ISPPRV_PCR_SCOMP_EN, ++ ISPPRV_PCR); ++} ++EXPORT_SYMBOL(isppreview_enable_shadcomp); ++ ++/* Configure the shift value to be used in shading compensation. ++ * scomp_shtval: 3bit value of shift used in shading compensation. ++ */ ++void isppreview_config_drkf_shadcomp(u8 scomp_shtval) ++{ ++ u32 pcr_val = omap_readl(ISPPRV_PCR); ++ ++ pcr_val &= ISPPRV_PCR_SCOMP_SFT_MASK; ++ omap_writel(pcr_val | (scomp_shtval << ISPPRV_PCR_SCOMP_SFT_SHIFT), ++ ISPPRV_PCR); ++} ++EXPORT_SYMBOL(isppreview_config_drkf_shadcomp); ++ ++/* ++ * Enable/Disable of the Horizontal Median Filter ++ * enable: 1- Enables Horizontal Median Filter ++ */ ++void isppreview_enable_hmed(u8 enable) ++{ ++ if (enable) { ++ omap_writel((omap_readl(ISPPRV_PCR)) | ISPPRV_PCR_HMEDEN, ++ ISPPRV_PCR); ++ ispprev_obj.hmed_en = 1; ++ } else { ++ omap_writel((omap_readl(ISPPRV_PCR)) & (~ISPPRV_PCR_HMEDEN), ++ ISPPRV_PCR); ++ ispprev_obj.hmed_en = 0; ++ } ++} ++EXPORT_SYMBOL(isppreview_enable_hmed); ++ ++/* ++ *Configures the Horizontal Median Filter ++ * prev_hmed: Structure containing the odd and even distance between the ++ * pixels in the image along with the filter threshold. ++ */ ++void isppreview_config_hmed(struct ispprev_hmed prev_hmed) ++{ ++ ++ u32 odddist = 0; ++ u32 evendist = 0; ++ ++ if (prev_hmed.odddist == 1) ++ odddist = ~ISPPRV_HMED_ODDDIST; ++ else /* else the odd distance is 2 */ ++ odddist = ISPPRV_HMED_ODDDIST; ++ ++ if (prev_hmed.evendist == 1) ++ evendist = ~ISPPRV_HMED_EVENDIST; ++ else /* else the even distance is 2 */ ++ evendist = ISPPRV_HMED_EVENDIST; ++ ++ omap_writel(odddist | evendist ++ | (prev_hmed.thres<<ISPPRV_HMED_THRESHOLD_SHIFT), ++ ISPPRV_HMED); ++ ++} ++EXPORT_SYMBOL(isppreview_config_hmed); ++ ++/* ++ * Configures the Noise Filter ++ * prev_nf: Structure containing the noisefilter table, strength to be used ++ * for the noise filter and the defect correction enable flag. ++ */ ++void ++isppreview_config_noisefilter(struct ispprev_nf prev_nf) ++{ ++ int i = 0; ++ omap_writel(prev_nf.spread, ISPPRV_NF); ++ omap_writel(ISPPRV_NF_TABLE_ADDR, ISPPRV_SET_TBL_ADDR); ++ for (i = 0; i < 64; i++) ++ omap_writel(prev_nf.table[i], ISPPRV_SET_TBL_DATA); ++} ++EXPORT_SYMBOL(isppreview_config_noisefilter); ++ ++/* ++ * Configures the defect correction ++ * prev_nf: Structure containing the defect correction structure ++ */ ++void ++isppreview_config_dcor(struct ispprev_dcor prev_dcor) ++{ ++ if (prev_dcor.couplet_mode_en) { ++ omap_writel(prev_dcor.detect_correct[0], ISPPRV_CDC_THR0); ++ omap_writel(prev_dcor.detect_correct[1], ISPPRV_CDC_THR1); ++ omap_writel(prev_dcor.detect_correct[2], ISPPRV_CDC_THR2); ++ omap_writel(prev_dcor.detect_correct[3], ISPPRV_CDC_THR3); ++ omap_writel((omap_readl(ISPPRV_PCR)) | ISPPRV_PCR_DCCOUP, ++ ISPPRV_PCR); ++ } else ++ omap_writel((omap_readl(ISPPRV_PCR)) & (~ISPPRV_PCR_DCCOUP), ++ ISPPRV_PCR); ++} ++EXPORT_SYMBOL(isppreview_config_dcor); ++ ++/* ++ * Configures the CFA Interpolation parameters ++ * prev_cfa: Structure containing the CFA interpolation table, CFA format ++ * in the image, vertical and horizontal gradient threshold. ++ */ ++void isppreview_config_cfa(struct ispprev_cfa prev_cfa) ++{ ++ int i = 0; ++ ispprev_obj.cfafmt = prev_cfa.cfafmt; ++ ++ omap_writel((omap_readl(ISPPRV_PCR)) ++ | (prev_cfa.cfafmt << ISPPRV_PCR_CFAFMT_SHIFT), ISPPRV_PCR); ++ ++ omap_writel((prev_cfa.cfa_gradthrs_vert << ISPPRV_CFA_GRADTH_VER_SHIFT) ++ | (prev_cfa.cfa_gradthrs_horz << ISPPRV_CFA_GRADTH_HOR_SHIFT), ++ ISPPRV_CFA); ++ ++ omap_writel(ISPPRV_CFA_TABLE_ADDR, ISPPRV_SET_TBL_ADDR); ++ ++ /* Array of 576 */ ++ for (i = 0; i < 576; i++) ++ omap_writel(prev_cfa.cfa_table[i], ISPPRV_SET_TBL_DATA); ++} ++EXPORT_SYMBOL(isppreview_config_cfa); ++ ++/* ++ * Configures the Gamma Correction table values ++ * gtable: Structure containing the table for red, blue, green gamma table. ++ */ ++void ++isppreview_config_gammacorrn(struct ispprev_gtable gtable) ++{ ++ int i = 0; ++ ++ omap_writel(ISPPRV_REDGAMMA_TABLE_ADDR, ISPPRV_SET_TBL_ADDR); ++ /* Array of 1024 */ ++ for (i = 0; i < 1024; i++) ++ omap_writel(gtable.redtable[i], ISPPRV_SET_TBL_DATA); ++ ++ omap_writel(ISPPRV_GREENGAMMA_TABLE_ADDR, ISPPRV_SET_TBL_ADDR); ++ /* Array of 1024 */ ++ for (i = 0; i < 1024; i++) ++ omap_writel(gtable.greentable[i], ISPPRV_SET_TBL_DATA); ++ ++ omap_writel(ISPPRV_BLUEGAMMA_TABLE_ADDR, ISPPRV_SET_TBL_ADDR); ++ /* Array of 1024 */ ++ for (i = 0; i < 1024; i++) ++ omap_writel(gtable.bluetable[i], ISPPRV_SET_TBL_DATA); ++} ++EXPORT_SYMBOL(isppreview_config_gammacorrn); ++ ++/* ++ * Configures the Luminance Enhancement table values ++ * ytable: Structure containing the table for Luminance Enhancement table. ++ */ ++void ++isppreview_config_luma_enhancement(u32 *ytable) ++{ ++ int i = 0; ++ omap_writel(ISPPRV_YENH_TABLE_ADDR, ISPPRV_SET_TBL_ADDR); ++ /* Array of 128 */ ++ for (i = 0; i < 128; i++) ++ omap_writel(ytable[i], ISPPRV_SET_TBL_DATA); ++} ++EXPORT_SYMBOL(isppreview_config_luma_enhancement); ++ ++/* ++ * Configures the Chroma Suppression ++ * csup: Structure containing the threshold value for suppression ++ * and the hypass filter enable flag. ++ */ ++void ++isppreview_config_chroma_suppression(struct ispprev_csup csup) ++{ ++ omap_writel(csup.gain | (csup.thres << ISPPRV_CSUP_THRES_SHIFT) ++ | (csup.hypf_en << ISPPRV_CSUP_HPYF_SHIFT) ++ , ISPPRV_CSUP); ++} ++EXPORT_SYMBOL(isppreview_config_chroma_suppression); ++ ++/* ++ * Enable/Disable the Noise Filter ++ * enable: 1 - Enables the Noise Filter. ++ */ ++void ++isppreview_enable_noisefilter(u8 enable) ++{ ++ if (enable) { ++ omap_writel((omap_readl(ISPPRV_PCR)) | ISPPRV_PCR_NFEN, ++ ISPPRV_PCR); ++ ispprev_obj.nf_en = 1; ++ } else { ++ omap_writel((omap_readl(ISPPRV_PCR)) & (~ISPPRV_PCR_NFEN), ++ ISPPRV_PCR); ++ ispprev_obj.nf_en = 0; ++ } ++} ++EXPORT_SYMBOL(isppreview_enable_noisefilter); ++ ++/* ++ * Enable/Disable the defect correction ++ * enable: 1 - Enables the defect correction. ++ */ ++void ++isppreview_enable_dcor(u8 enable) ++{ ++ if (enable) { ++ omap_writel((omap_readl(ISPPRV_PCR)) | ISPPRV_PCR_DCOREN, ++ ISPPRV_PCR); ++ ispprev_obj.dcor_en = 1; ++ } else { ++ omap_writel((omap_readl(ISPPRV_PCR)) & (~ISPPRV_PCR_DCOREN), ++ ISPPRV_PCR); ++ ispprev_obj.dcor_en = 0; ++ } ++} ++EXPORT_SYMBOL(isppreview_enable_dcor); ++ ++/* ++ * Enable/Disable the CFA Interpolation ++ * enable: 1 - Enables the CFA. ++ */ ++void ++isppreview_enable_cfa(u8 enable) ++{ ++ if (enable) { ++ omap_writel((omap_readl(ISPPRV_PCR)) | ISPPRV_PCR_CFAEN, ++ ISPPRV_PCR); ++ ispprev_obj.cfa_en = 1; ++ } else { ++ omap_writel((omap_readl(ISPPRV_PCR)) & (~ISPPRV_PCR_CFAEN), ++ ISPPRV_PCR); ++ ispprev_obj.cfa_en = 0; ++ } ++ ++} ++EXPORT_SYMBOL(isppreview_enable_cfa); ++ ++/* ++ * Enable/Disable the GammaByPass ++ * enable: 1 - Bypasses Gamma - 10bit input is cropped to 8MSB. ++ * 0 - Goes through Gamma Correction. input and output is 10bit. ++ */ ++void ++isppreview_enable_gammabypass(u8 enable) ++{ ++ if (enable) ++ omap_writel((omap_readl(ISPPRV_PCR)) | ISPPRV_PCR_GAMMA_BYPASS, ++ ISPPRV_PCR); ++ else ++ omap_writel((omap_readl(ISPPRV_PCR)) & ++ (~ISPPRV_PCR_GAMMA_BYPASS), ++ ISPPRV_PCR); ++} ++EXPORT_SYMBOL(isppreview_enable_gammabypass); ++ ++/* ++ * Enable/Disable the Luminance Enhancement ++ * enable: 1 - Enable the Luminance Enhancement. ++ */ ++void ++isppreview_enable_luma_enhancement(u8 enable) ++{ ++ if (enable) { ++ omap_writel((omap_readl(ISPPRV_PCR)) | ISPPRV_PCR_YNENHEN, ++ ISPPRV_PCR); ++ ispprev_obj.yenh_en = 1; ++ } else { ++ omap_writel((omap_readl(ISPPRV_PCR)) & (~ISPPRV_PCR_YNENHEN), ++ ISPPRV_PCR); ++ ispprev_obj.yenh_en = 0; ++ } ++} ++EXPORT_SYMBOL(isppreview_enable_luma_enhancement); ++ ++/* ++ * Enable/Disable the Chrominance Suppression ++ * enable: 1 - Enable the Chrominance Suppression. ++ */ ++void ++isppreview_enable_chroma_suppression(u8 enable) ++{ ++ if (enable) { ++ omap_writel((omap_readl(ISPPRV_PCR)) | ISPPRV_PCR_SUPEN, ++ ISPPRV_PCR); ++ ispprev_obj.csup_en = 1; ++ } else { ++ omap_writel((omap_readl(ISPPRV_PCR)) & (~ISPPRV_PCR_SUPEN), ++ ISPPRV_PCR); ++ ispprev_obj.csup_en = 0; ++ } ++} ++EXPORT_SYMBOL(isppreview_enable_chroma_suppression); ++ ++/* ++ * Configures the White Balance parameters. Coefficient matrix always with ++ * default values. ++ * prev_wbal: Structure containing the digital gain and white balance ++ * coefficient. ++ */ ++void isppreview_config_whitebalance(struct ispprev_wbal prev_wbal) ++{ ++ ++ omap_writel(prev_wbal.dgain, ISPPRV_WB_DGAIN); ++ omap_writel(prev_wbal.coef0 | ++ prev_wbal.coef1 << ISPPRV_WBGAIN_COEF1_SHIFT | ++ prev_wbal.coef2 << ISPPRV_WBGAIN_COEF2_SHIFT | ++ prev_wbal.coef3 << ISPPRV_WBGAIN_COEF3_SHIFT, ISPPRV_WBGAIN); ++ ++ /* Keeping the HW default value as such */ ++ omap_writel(ISPPRV_WBSEL_COEF0 << ISPPRV_WBSEL_N0_0_SHIFT ++ | ISPPRV_WBSEL_COEF1 << ISPPRV_WBSEL_N0_1_SHIFT ++ | ISPPRV_WBSEL_COEF0 << ISPPRV_WBSEL_N0_2_SHIFT ++ | ISPPRV_WBSEL_COEF1 << ISPPRV_WBSEL_N0_3_SHIFT ++ | ISPPRV_WBSEL_COEF2 << ISPPRV_WBSEL_N1_0_SHIFT ++ | ISPPRV_WBSEL_COEF3 << ISPPRV_WBSEL_N1_1_SHIFT ++ | ISPPRV_WBSEL_COEF2 << ISPPRV_WBSEL_N1_2_SHIFT ++ | ISPPRV_WBSEL_COEF3 << ISPPRV_WBSEL_N1_3_SHIFT ++ | ISPPRV_WBSEL_COEF0 << ISPPRV_WBSEL_N2_0_SHIFT ++ | ISPPRV_WBSEL_COEF1 << ISPPRV_WBSEL_N2_1_SHIFT ++ | ISPPRV_WBSEL_COEF0 << ISPPRV_WBSEL_N2_2_SHIFT ++ | ISPPRV_WBSEL_COEF1 << ISPPRV_WBSEL_N2_3_SHIFT ++ | ISPPRV_WBSEL_COEF2 << ISPPRV_WBSEL_N3_0_SHIFT ++ | ISPPRV_WBSEL_COEF3 << ISPPRV_WBSEL_N3_1_SHIFT ++ | ISPPRV_WBSEL_COEF2 << ISPPRV_WBSEL_N3_2_SHIFT ++ | ISPPRV_WBSEL_COEF3 << ISPPRV_WBSEL_N3_3_SHIFT, ++ ISPPRV_WBSEL); ++ ++} ++EXPORT_SYMBOL(isppreview_config_whitebalance); ++ ++/* ++ * Configures the White Balance parameters. Coefficient matrix can be changed. ++ * prev_wbal: Structure containing the digital gain and white balance ++ * coefficient. ++ */ ++void isppreview_config_whitebalance2(struct prev_white_balance prev_wbal) ++{ ++ omap_writel(prev_wbal.wb_dgain, ISPPRV_WB_DGAIN); ++ omap_writel(prev_wbal.wb_gain[0] ++ | prev_wbal.wb_gain[1] << ISPPRV_WBGAIN_COEF1_SHIFT ++ | prev_wbal.wb_gain[2] << ISPPRV_WBGAIN_COEF2_SHIFT ++ | prev_wbal.wb_gain[3] << ISPPRV_WBGAIN_COEF3_SHIFT, ++ ISPPRV_WBGAIN); ++ ++ /* Changing the HW default value */ ++ omap_writel(prev_wbal.wb_coefmatrix[0][0] << ISPPRV_WBSEL_N0_0_SHIFT ++ | prev_wbal.wb_coefmatrix[0][1] << ISPPRV_WBSEL_N0_1_SHIFT ++ | prev_wbal.wb_coefmatrix[0][2] << ISPPRV_WBSEL_N0_2_SHIFT ++ | prev_wbal.wb_coefmatrix[0][3] << ISPPRV_WBSEL_N0_3_SHIFT ++ | prev_wbal.wb_coefmatrix[1][0] << ISPPRV_WBSEL_N1_0_SHIFT ++ | prev_wbal.wb_coefmatrix[1][1] << ISPPRV_WBSEL_N1_1_SHIFT ++ | prev_wbal.wb_coefmatrix[1][2] << ISPPRV_WBSEL_N1_2_SHIFT ++ | prev_wbal.wb_coefmatrix[1][3] << ISPPRV_WBSEL_N1_3_SHIFT ++ | prev_wbal.wb_coefmatrix[2][0] << ISPPRV_WBSEL_N2_0_SHIFT ++ | prev_wbal.wb_coefmatrix[2][1] << ISPPRV_WBSEL_N2_1_SHIFT ++ | prev_wbal.wb_coefmatrix[2][2] << ISPPRV_WBSEL_N2_2_SHIFT ++ | prev_wbal.wb_coefmatrix[2][3] << ISPPRV_WBSEL_N2_3_SHIFT ++ | prev_wbal.wb_coefmatrix[3][0] << ISPPRV_WBSEL_N3_0_SHIFT ++ | prev_wbal.wb_coefmatrix[3][1] << ISPPRV_WBSEL_N3_1_SHIFT ++ | prev_wbal.wb_coefmatrix[3][2] << ISPPRV_WBSEL_N3_2_SHIFT ++ | prev_wbal.wb_coefmatrix[3][3] << ISPPRV_WBSEL_N3_3_SHIFT, ++ ISPPRV_WBSEL); ++} ++EXPORT_SYMBOL(isppreview_config_whitebalance2); ++ ++/* ++ * Configures the Black Adjustment parameters ++ * prev_blkadj: Structure containing the black adjustment towards red, ++ * green, blue. ++ */ ++void ++isppreview_config_blkadj(struct ispprev_blkadj prev_blkadj) ++{ ++ omap_writel(prev_blkadj.blue ++ | (prev_blkadj.green << ISPPRV_BLKADJOFF_G_SHIFT) ++ | (prev_blkadj.red << ISPPRV_BLKADJOFF_R_SHIFT) ++ , ISPPRV_BLKADJOFF); ++} ++EXPORT_SYMBOL(isppreview_config_blkadj); ++ ++/* ++ * Configures the RGB-RGB Blending matrix ++ * rgb2rgb: Structure containing the rgb to rgb blending matrix and the ++ * rgb offset. ++ */ ++void ++isppreview_config_rgb_blending(struct ispprev_rgbtorgb rgb2rgb) ++{ ++ omap_writel((rgb2rgb.matrix[0][0] << ISPPRV_RGB_MAT1_MTX_RR_SHIFT) ++ | (rgb2rgb.matrix[0][1] << ISPPRV_RGB_MAT1_MTX_GR_SHIFT), ++ ISPPRV_RGB_MAT1); ++ ++ omap_writel((rgb2rgb.matrix[0][2] << ISPPRV_RGB_MAT2_MTX_BR_SHIFT) ++ | (rgb2rgb.matrix[1][0] << ISPPRV_RGB_MAT2_MTX_RG_SHIFT), ++ ISPPRV_RGB_MAT2); ++ ++ omap_writel((rgb2rgb.matrix[1][1] << ISPPRV_RGB_MAT3_MTX_GG_SHIFT) ++ | (rgb2rgb.matrix[1][2] << ISPPRV_RGB_MAT3_MTX_BG_SHIFT), ++ ISPPRV_RGB_MAT3); ++ ++ omap_writel((rgb2rgb.matrix[2][0] << ISPPRV_RGB_MAT4_MTX_RB_SHIFT) ++ | (rgb2rgb.matrix[2][1] << ISPPRV_RGB_MAT4_MTX_GB_SHIFT), ++ ISPPRV_RGB_MAT4); ++ ++ omap_writel((rgb2rgb.matrix[2][2] << ISPPRV_RGB_MAT5_MTX_BB_SHIFT), ++ ISPPRV_RGB_MAT5); ++ ++ omap_writel((rgb2rgb.offset[0] << ISPPRV_RGB_OFF1_MTX_OFFG_SHIFT) ++ | (rgb2rgb.offset[1] << ISPPRV_RGB_OFF1_MTX_OFFR_SHIFT), ++ ISPPRV_RGB_OFF1); ++ ++ omap_writel(rgb2rgb.offset[2] << ISPPRV_RGB_OFF2_MTX_OFFB_SHIFT, ++ ISPPRV_RGB_OFF2); ++ ++} ++EXPORT_SYMBOL(isppreview_config_rgb_blending); ++ ++/* ++ * Configures the RGB-YCbYCr conversion matrix ++ * prev_csc: Structure containing the RGB to YCbYCr matrix and the ++ * YCbCr offset. ++ */ ++void ++isppreview_config_rgb_to_ycbcr(struct ispprev_csc prev_csc) ++{ ++ omap_writel(prev_csc.matrix[0][0] << ISPPRV_CSC0_RY_SHIFT ++ | prev_csc.matrix[0][1] << ISPPRV_CSC0_GY_SHIFT ++ | prev_csc.matrix[0][2] << ISPPRV_CSC0_BY_SHIFT, ++ ISPPRV_CSC0); ++ ++ omap_writel(prev_csc.matrix[1][0] << ISPPRV_CSC1_RCB_SHIFT ++ | prev_csc.matrix[1][1] << ISPPRV_CSC1_GCB_SHIFT ++ | prev_csc.matrix[1][2] << ISPPRV_CSC1_BCB_SHIFT, ++ ISPPRV_CSC1); ++ ++ omap_writel(prev_csc.matrix[2][0] << ISPPRV_CSC2_RCR_SHIFT ++ | prev_csc.matrix[2][1] << ISPPRV_CSC2_GCR_SHIFT ++ | prev_csc.matrix[2][2] << ISPPRV_CSC2_BCR_SHIFT, ++ ISPPRV_CSC2); ++ ++ omap_writel(prev_csc.offset[0] << ISPPRV_CSC_OFFSET_CR_SHIFT ++ | prev_csc.offset[1] << ISPPRV_CSC_OFFSET_CB_SHIFT ++ | prev_csc.offset[2] << ISPPRV_CSC_OFFSET_Y_SHIFT, ++ ISPPRV_CSC_OFFSET); ++} ++EXPORT_SYMBOL(isppreview_config_rgb_to_ycbcr); ++ ++/* ++ * Query the contrast. ++ * contrast: Pointer to hold the current programmed contrast value. ++ */ ++void ++isppreview_query_contrast(u8 *contrast) ++{ ++ u32 brt_cnt_val = 0; ++ brt_cnt_val = omap_readl(ISPPRV_CNT_BRT); ++ *contrast = (brt_cnt_val >> ISPPRV_CNT_BRT_CNT_SHIFT) & 0xFF; ++ DPRINTK_ISPPREV(" Current brt cnt value in hw is %x\n", brt_cnt_val); ++} ++EXPORT_SYMBOL(isppreview_query_contrast); ++ ++/* ++ * Updates the contrast. ++ * Value should be programmed before enabling the module. ++ */ ++void ++isppreview_update_contrast(u8 *contrast) ++{ ++ ispprev_obj.contrast = *contrast; ++} ++EXPORT_SYMBOL(isppreview_update_contrast); ++ ++/* ++ * Configures the Contrast. ++ * contrast: 8bitvalue in U8Q4 format. ++ * Value should be programmed before enabling the module. ++ */ ++void ++isppreview_config_contrast(u8 contrast) ++{ ++ u32 brt_cnt_val = 0; ++ ++ brt_cnt_val = omap_readl(ISPPRV_CNT_BRT); ++ brt_cnt_val &= ~(0xFF << ISPPRV_CNT_BRT_CNT_SHIFT); ++ contrast &= 0xFF; ++ omap_writel((brt_cnt_val)|(contrast << ISPPRV_CNT_BRT_CNT_SHIFT) ++ , ISPPRV_CNT_BRT); ++} ++EXPORT_SYMBOL(isppreview_config_contrast); ++ ++/* ++ * Gets the range contrast value ++ * min_contrast: Pointer to hold the minimum Contrast value ++ * max_contrast: Pointer to hold the maximum Contrast value ++ */ ++void ++isppreview_get_contrast_range(u8 *min_contrast, u8 *max_contrast) ++{ ++ *min_contrast = ISPPRV_CONTRAST_MIN; ++ *max_contrast = ISPPRV_CONTRAST_MAX; ++} ++EXPORT_SYMBOL(isppreview_get_contrast_range); ++ ++/* ++ * Updates the brightness in the preview module. ++ */ ++void ++isppreview_update_brightness(u8 *brightness) ++{ ++ ispprev_obj.brightness = *brightness; ++} ++EXPORT_SYMBOL(isppreview_update_brightness); ++ ++/* ++ * Configures the brightness. ++ * contrast: 8bitvalue in U8Q0 format. ++ */ ++void ++isppreview_config_brightness(u8 brightness) ++{ ++ u32 brt_cnt_val = 0; ++ DPRINTK_ISPPREV("\tConfiguring brightness in ISP: %d\n", brightness); ++ brt_cnt_val = omap_readl(ISPPRV_CNT_BRT); ++ brt_cnt_val &= ~(0xFF << ISPPRV_CNT_BRT_BRT_SHIFT); ++ brightness &= 0xFF; ++ omap_writel((brt_cnt_val)|(brightness << ISPPRV_CNT_BRT_BRT_SHIFT) ++ , ISPPRV_CNT_BRT); ++} ++EXPORT_SYMBOL(isppreview_config_brightness); ++ ++/* ++ * Query the brightness. ++ * brightness: Pointer to hold the current programmed brightness value. ++ */ ++void ++isppreview_query_brightness(u8 *brightness) ++{ ++ ++ *brightness = omap_readl(ISPPRV_CNT_BRT); ++} ++EXPORT_SYMBOL(isppreview_query_brightness); ++ ++/* ++ * Gets the range brightness value ++ * min_brightness: Pointer to hold the minimum brightness value ++ * max_brightness: Pointer to hold the maximum brightness value ++ */ ++void ++isppreview_get_brightness_range(u8 *min_brightness, u8 *max_brightness) ++{ ++ *min_brightness = ISPPRV_BRIGHT_MIN; ++ *max_brightness = ISPPRV_BRIGHT_MAX; ++} ++EXPORT_SYMBOL(isppreview_get_brightness_range); ++ ++/** ++ * @brief isppreview_set_color -- sets the color effect. ++ * @param mode -- indicates the required color effect. ++ */ ++void isppreview_set_color(u8 *mode) ++{ ++ ispprev_obj.color = *mode; ++ update_color_matrix = 1; ++} ++EXPORT_SYMBOL(isppreview_set_color); ++ ++/** ++ * @brief isppreview_get_color -- gets the current color effect. ++ * @param mode -- indicates the current color effect. ++ */ ++void isppreview_get_color(u8 *mode) ++{ ++ *mode = ispprev_obj.color; ++} ++EXPORT_SYMBOL(isppreview_get_color); ++ ++/* ++ * Configures the max and minim Y and C values. ++ * yclimit: Structure containing the min,max Y,C values. ++ */ ++void ++isppreview_config_yc_range(struct ispprev_yclimit yclimit) ++{ ++ omap_writel(((yclimit.maxC << ISPPRV_SETUP_YC_MAXC_SHIFT) ++ | (yclimit.maxY << ISPPRV_SETUP_YC_MAXY_SHIFT) ++ | (yclimit.minC << ISPPRV_SETUP_YC_MINC_SHIFT) ++ | (yclimit.minY << ISPPRV_SETUP_YC_MINY_SHIFT)) ++ , ISPPRV_SETUP_YC); ++} ++EXPORT_SYMBOL(isppreview_config_yc_range); ++ ++/* ++ * Calculates the number of pixels cropped in the submodules that are enabled, ++ * Fills up the output widht height variables in the isp_prev structure . ++ * input_w: input width for the preview in number of pixels per line ++ * input_h: input height for the preview in number of lines ++ * output_w: output width from the preview in number of pixels per line ++ * output_h: output height for the preview in number of lines ++*/ ++int ++isppreview_try_size(u32 input_w, u32 input_h, u32 *output_w, ++ u32 *output_h) ++{ ++ u32 prevout_w = input_w; ++ u32 prevout_h = input_h; ++ u32 div = 0; ++ int max_out; ++ ++ ispprev_obj.previn_w = input_w; ++ ispprev_obj.previn_h = input_h; ++ ++ /*Checks if input size is more than the preview output width limit, ++ *else suggests for downsampling in the averager. ++ */ ++ if (is_sil_rev_equal_to(OMAP3430_REV_ES1_0)) ++ max_out = ISPPRV_MAXOUTPUT_WIDTH; ++ else ++ max_out = ISPPRV_MAXOUTPUT_WIDTH_ES2; ++ ++ ispprev_obj.fmtavg = 0; ++ ++ if (input_w > max_out) { ++ div = (input_w/max_out); ++ if (div >= 2 && div < 4) { ++ ispprev_obj.fmtavg = 1; ++ prevout_w /= 2; ++ } else if (div >= 4 && div < 8) { ++ ispprev_obj.fmtavg = 2; ++ prevout_w /= 4; ++ } else if (div >= 8) { ++ ispprev_obj.fmtavg = 3; ++ prevout_w /= 8; ++ } ++ } ++ ++ if (ispprev_obj.hmed_en) ++ prevout_w -= 4; ++ if (ispprev_obj.nf_en) { ++ prevout_w -= 4; ++ prevout_h -= 4; ++ } ++ if (ispprev_obj.cfa_en) { ++ switch (ispprev_obj.cfafmt) { ++ case CFAFMT_BAYER: ++ case CFAFMT_SONYVGA: ++ prevout_w -= 4; ++ prevout_h -= 4; ++ break; ++ case CFAFMT_RGBFOVEON: ++ case CFAFMT_RRGGBBFOVEON: ++ case CFAFMT_DNSPL: ++ case CFAFMT_HONEYCOMB: ++ prevout_h -= 2; ++ break; ++ }; ++ } ++ if ((ispprev_obj.yenh_en) || (ispprev_obj.csup_en)) ++ prevout_w -= 2; ++ ++ /* FMTSPH is always set to be 4 */ ++ prevout_w -= 4; ++ /* Reserving for now, another 2 extra pixels from Preview to Resizer ++ prevout_w -=2;*/ ++ ++ /* ++ * Make sure that preview always outputs even number of pixels ++ */ ++ if (prevout_w % 2) ++ prevout_w -= 1; ++ ++ if (ispprev_obj.prev_outfmt == PREVIEW_MEM) { ++ if (((prevout_w*2)&ISP_32B_BOUNDARY_OFFSET) != (prevout_w*2)) ++ prevout_w = ((prevout_w*2)&ISP_32B_BOUNDARY_OFFSET)/2; ++ } ++ ispprev_obj.prevout_w = *output_w = prevout_w; ++ ispprev_obj.prevout_h = *output_h = prevout_h; ++ return 0; ++} ++EXPORT_SYMBOL(isppreview_try_size); ++ ++/* ++ * Configures the appropriate values stored in the isp_prev structure to ++ * HORZ/VERT_INFO. ++ * Configures PRV_AVE if needed for downsampling as calculated in trysize. ++ * input_w: input width for the preview in number of pixels per line ++ * input_h: input height for the preview in number of lines ++ * output_w: output width from the preview in number of pixels per line ++ * output_h: output height for the preview in number of lines ++ */ ++int ++isppreview_config_size(u32 input_w, u32 input_h, u32 output_w, ++ u32 output_h) ++{ ++ u32 prevsdroff; ++ ++ /* Checks if the parameters match the values calculated in the ++ * isppreview_try_size(). If not return error. ++ */ ++ if ((output_w != ispprev_obj.prevout_w) ++ || (output_h != ispprev_obj.prevout_h)) { ++ printk(KERN_ERR "ISP_ERR : isppreview_try_size should " ++ "be called before config size\n"); ++ return -EINVAL; ++ } ++ ++ omap_writel((4 << ISPPRV_HORZ_INFO_SPH_SHIFT) | ++ (ispprev_obj.previn_w - 1), ++ ISPPRV_HORZ_INFO); ++ omap_writel((0 << ISPPRV_VERT_INFO_SLV_SHIFT) | ++ (ispprev_obj.previn_h - 1), ++ ISPPRV_VERT_INFO); ++ ++ if (ispprev_obj.cfafmt == CFAFMT_BAYER) ++ omap_writel(ISPPRV_AVE_EVENDIST_2 << ISPPRV_AVE_EVENDIST_SHIFT ++ | ISPPRV_AVE_ODDDIST_2 << ISPPRV_AVE_ODDDIST_SHIFT ++ | ispprev_obj.fmtavg, ++ ISPPRV_AVE); ++ ++ /* When written to memory output should be of 32byte boundary */ ++ if (ispprev_obj.prev_outfmt == PREVIEW_MEM) { ++ prevsdroff = ispprev_obj.prevout_w*2; ++ if ((prevsdroff & ISP_32B_BOUNDARY_OFFSET) != prevsdroff) { ++ DPRINTK_ISPPREV("ISP_WARN : Preview output buffer line" ++ " size is truncated to 32byte boundary\n"); ++ prevsdroff &= ISP_32B_BOUNDARY_BUF ; ++ } ++ isppreview_config_outlineoffset(prevsdroff); ++ } ++ return 0; ++} ++EXPORT_SYMBOL(isppreview_config_size); ++ ++/* ++ * Configures the Read address line offset. ++ * offset: Line Offset for the input image. ++ */ ++int ++isppreview_config_inlineoffset(u32 offset) ++{ ++ if ((offset & ISP_32B_BOUNDARY_OFFSET) == offset) ++ omap_writel(offset&0xFFFF, ISPPRV_RADR_OFFSET); ++ else{ ++ printk(KERN_ERR "ISP_ERR : Offset should be in 32 byte " ++ "boundary\n"); ++ return -EINVAL; ++ } ++ return 0; ++} ++EXPORT_SYMBOL(isppreview_config_inlineoffset); ++ ++/* ++ * Configures the memory address from which the input frame is to be read. ++ * addr: 32bit memory address aligned on 32byte boundary. ++ */ ++int isppreview_set_inaddr(u32 addr) ++{ ++ if ((addr & ISP_32B_BOUNDARY_BUF) == addr) ++ omap_writel(addr, ISPPRV_RSDR_ADDR); ++ else{ ++ printk(KERN_ERR "ISP_ERR : Address should be in 32 byte " ++ "boundary\n"); ++ return -EINVAL; ++ } ++ return 0; ++} ++EXPORT_SYMBOL(isppreview_set_inaddr); ++ ++/* ++ * Configures the Write address line offset. ++ * offset: Line Offset for the preview output. ++ */ ++int isppreview_config_outlineoffset(u32 offset) ++{ ++ if ((offset & ISP_32B_BOUNDARY_OFFSET) == offset) { ++ omap_writel(offset&0xFFFF, ISPPRV_WADD_OFFSET); ++ } ++ else{ ++ printk(KERN_ERR "ISP_ERR : Offset should be in 32 byte " ++ "boundary\n"); ++ return -EINVAL; ++ } ++ return 0; ++} ++EXPORT_SYMBOL(isppreview_config_outlineoffset); ++ ++/* ++ * Configures the memory address to which the output frame is written. ++ * addr: 32bit memory address aligned on 32byte boundary. ++ */ ++int ++isppreview_set_outaddr(u32 addr) ++{ ++ if ((addr & ISP_32B_BOUNDARY_BUF) == addr) { ++ omap_writel(addr, ISPPRV_WSDR_ADDR); ++ } else { ++ printk(KERN_ERR "ISP_ERR : Address should be in 32 byte " ++ "boundary\n"); ++ return -EINVAL; ++ } ++ return 0; ++} ++EXPORT_SYMBOL(isppreview_set_outaddr); ++ ++/* ++ * Configures the Dark frame address line offset. ++ * offset: Line Offset for the Darkframe. ++ */ ++int ++isppreview_config_darklineoffset(u32 offset) ++{ ++ if ((offset & ISP_32B_BOUNDARY_OFFSET) == offset) ++ omap_writel(offset&0xFFFF, ISPPRV_DRKF_OFFSET); ++ else{ ++ printk(KERN_ERR "ISP_ERR : Offset should be in 32 byte " ++ "boundary\n"); ++ return -EINVAL; ++ } ++ return 0; ++} ++EXPORT_SYMBOL(isppreview_config_darklineoffset); ++ ++/* ++ * Configures the memory address where the Dark frame should be stored. ++ * addr: 32bit memory address aligned on 32 bit boundary. ++ */ ++int ++isppreview_set_darkaddr(u32 addr) ++{ ++ if ((addr & ISP_32B_BOUNDARY_BUF) == addr) ++ omap_writel(addr, ISPPRV_DSDR_ADDR); ++ else{ ++ printk(KERN_ERR "ISP_ERR : Address should be in 32 byte " ++ "boundary\n"); ++ return -EINVAL; ++ } ++ return 0; ++} ++EXPORT_SYMBOL(isppreview_set_darkaddr); ++ ++/* ++ * ++ * Enables the Preview module. ++ * Client should configure all the sub modules in Preview before this. ++ * enable: 1- Enables the preview module. ++ */ ++void ++isppreview_enable(u8 enable) ++{ ++ ++ if (enable) ++ omap_writel((omap_readl(ISPPRV_PCR)) ++ | ISPPRV_PCR_EN, ISPPRV_PCR); ++ else ++ omap_writel((omap_readl(ISPPRV_PCR)) ++ & ~ISPPRV_PCR_EN, ISPPRV_PCR); ++} ++EXPORT_SYMBOL(isppreview_enable); ++ ++int isppreview_busy(void) ++{ ++ return (omap_readl(ISPPRV_PCR) & ISPPRV_PCR_BUSY); ++} ++EXPORT_SYMBOL(isppreview_busy); ++ ++struct prev_params *isppreview_get_config(void) ++{ ++ return prev_config_params; ++} ++EXPORT_SYMBOL(isppreview_get_config); ++ ++/* ++ * Saves the values of the preview module registers. ++ */ ++void isppreview_save_context(void) ++{ ++ DPRINTK_ISPPREV(" Saving context\n"); ++ isp_save_context(ispprev_reg_list); ++} ++EXPORT_SYMBOL(isppreview_save_context); ++ ++/* ++ * Restores the values of the preview module registers. ++ */ ++void isppreview_restore_context(void) ++{ ++ DPRINTK_ISPPREV(" Restoring context\n"); ++ isp_restore_context(ispprev_reg_list); ++} ++EXPORT_SYMBOL(isppreview_restore_context); ++ ++/* ++ * Prints the values of the Preview Module registers ++ * Also prints other debug information stored in the preview moduel ++ */ ++void isppreview_print_status(void) ++{ ++#ifdef OMAP_ISPPREV_DEBUG ++ printk("Module in use =%d\n", ispprev_obj.prev_inuse); ++ DPRINTK_ISPPREV("Preview Input format =%d, Output Format =%d\n", ++ ispprev_obj.prev_inpfmt, ++ ispprev_obj.prev_outfmt); ++ DPRINTK_ISPPREV("Accepted Preview Input (width = %d,Height = %d)\n", ++ ispprev_obj.previn_w, ++ ispprev_obj.previn_h); ++ DPRINTK_ISPPREV("Accepted Preview Output (width = %d,Height = %d)\n", ++ ispprev_obj.prevout_w, ++ ispprev_obj.prevout_h); ++ DPRINTK_ISPPREV("###ISP_CTRL in preview =0x%x\n", ++ omap_readl(ISP_CTRL)); ++ DPRINTK_ISPPREV("###ISP_IRQ0ENABLE in preview =0x%x\n", ++ omap_readl(ISP_IRQ0ENABLE)); ++ DPRINTK_ISPPREV("###ISP_IRQ0STATUS in preview =0x%x\n", ++ omap_readl(ISP_IRQ0STATUS)); ++ DPRINTK_ISPPREV("###PRV PCR =0x%x\n", omap_readl(ISPPRV_PCR)); ++ DPRINTK_ISPPREV("###PRV HORZ_INFO =0x%x\n", ++ omap_readl(ISPPRV_HORZ_INFO)); ++ DPRINTK_ISPPREV("###PRV VERT_INFO =0x%x\n", ++ omap_readl(ISPPRV_VERT_INFO)); ++ DPRINTK_ISPPREV("###PRV WSDR_ADDR =0x%x\n", ++ omap_readl(ISPPRV_WSDR_ADDR)); ++ DPRINTK_ISPPREV("###PRV WADD_OFFSET =0x%x\n", ++ omap_readl(ISPPRV_WADD_OFFSET)); ++ DPRINTK_ISPPREV("###PRV AVE =0x%x\n", omap_readl(ISPPRV_AVE)); ++ DPRINTK_ISPPREV("###PRV HMED =0x%x\n", omap_readl(ISPPRV_HMED)); ++ DPRINTK_ISPPREV("###PRV NF =0x%x\n", omap_readl(ISPPRV_NF)); ++ DPRINTK_ISPPREV("###PRV WB_DGAIN =0x%x\n", ++ omap_readl(ISPPRV_WB_DGAIN)); ++ DPRINTK_ISPPREV("###PRV WBGAIN =0x%x\n", omap_readl(ISPPRV_WBGAIN)); ++ DPRINTK_ISPPREV("###PRV WBSEL =0x%x\n", omap_readl(ISPPRV_WBSEL)); ++ DPRINTK_ISPPREV("###PRV CFA =0x%x\n", omap_readl(ISPPRV_CFA)); ++ DPRINTK_ISPPREV("###PRV BLKADJOFF =0x%x\n", ++ omap_readl(ISPPRV_BLKADJOFF)); ++ DPRINTK_ISPPREV("###PRV RGB_MAT1 =0x%x\n", ++ omap_readl(ISPPRV_RGB_MAT1)); ++ DPRINTK_ISPPREV("###PRV RGB_MAT2 =0x%x\n", ++ omap_readl(ISPPRV_RGB_MAT2)); ++ DPRINTK_ISPPREV("###PRV RGB_MAT3 =0x%x\n", ++ omap_readl(ISPPRV_RGB_MAT3)); ++ DPRINTK_ISPPREV("###PRV RGB_MAT4 =0x%x\n", ++ omap_readl(ISPPRV_RGB_MAT4)); ++ DPRINTK_ISPPREV("###PRV RGB_MAT5 =0x%x\n", ++ omap_readl(ISPPRV_RGB_MAT5)); ++ DPRINTK_ISPPREV("###PRV RGB_OFF1 =0x%x\n", ++ omap_readl(ISPPRV_RGB_OFF1)); ++ DPRINTK_ISPPREV("###PRV RGB_OFF2 =0x%x\n", ++ omap_readl(ISPPRV_RGB_OFF2)); ++ DPRINTK_ISPPREV("###PRV CSC0 =0x%x\n", omap_readl(ISPPRV_CSC0)); ++ DPRINTK_ISPPREV("###PRV CSC1 =0x%x\n", omap_readl(ISPPRV_CSC1)); ++ DPRINTK_ISPPREV("###PRV CSC2 =0x%x\n", omap_readl(ISPPRV_CSC2)); ++ DPRINTK_ISPPREV("###PRV CSC_OFFSET =0x%x\n", ++ omap_readl(ISPPRV_CSC_OFFSET)); ++ DPRINTK_ISPPREV("###PRV CNT_BRT =0x%x\n", omap_readl(ISPPRV_CNT_BRT)); ++ DPRINTK_ISPPREV("###PRV CSUP =0x%x\n", omap_readl(ISPPRV_CSUP)); ++ DPRINTK_ISPPREV("###PRV SETUP_YC =0x%x\n", ++ omap_readl(ISPPRV_SETUP_YC)); ++#endif ++} ++EXPORT_SYMBOL(isppreview_print_status); ++ ++/* ++ * Module Initialisation. ++ */ ++static int __init ++isp_preview_init(void) ++{ ++ struct prev_params *params; ++ int i = 0; ++ ++ prev_config_params = kmalloc(sizeof(*prev_config_params), GFP_KERNEL); ++ if (prev_config_params == NULL) { ++ printk(KERN_ERR "Can't get memory for isp_preview params!\n"); ++ return -ENOMEM; ++ } ++ params = prev_config_params; ++ ++ ispprev_obj.prev_inuse = 0; ++ mutex_init(&ispprev_obj.ispprev_mutex); ++ ++ if (is_sil_rev_equal_to(OMAP3430_REV_ES2_0)) { ++ flr_wbal_coef0 = 0x23; ++ flr_wbal_coef1 = 0x20; ++ flr_wbal_coef2 = 0x20; ++ flr_wbal_coef3 = 0x39; ++ } ++ ++ /* Init values */ ++ ispprev_obj.color = PREV_DEFAULT_COLOR; ++ params->contrast = ispprev_obj.contrast = ISPPRV_CONTRAST_DEF; ++ params->brightness = ispprev_obj.brightness = ISPPRV_BRIGHT_DEF; ++ params->average = NO_AVE; ++ params->lens_shading_shift = 0; ++ params->pix_fmt = YCPOS_YCrYCb; ++ /* Color Filter Array */ ++ params->cfa.cfafmt = CFAFMT_BAYER; ++ params->cfa.cfa_table = cfa_coef_table; ++ params->cfa.cfa_gradthrs_horz = flr_cfa_gradthrs_horz; ++ params->cfa.cfa_gradthrs_vert = flr_cfa_gradthrs_vert; ++ /* Chroma Suppression */ ++ params->csup.gain = flr_csup_gain; ++ params->csup.thres = flr_csup_thres; ++ params->csup.hypf_en = 0; ++ /* Lumma Enhancement Table */ ++ params->ytable = luma_enhance_table; ++ /* Noise Filter */ ++ params->nf.spread = flr_nf_strgth; ++ params->nf.table = noise_filter_table; ++ /* defect correction */ ++ params->dcor.couplet_mode_en = 1; ++ for (i = 0; i < 4; i++) ++ params->dcor.detect_correct[i] = 0xE; ++ /* Gamma Correction */ ++ params->gtable.bluetable = bluegamma_table; ++ params->gtable.greentable = greengamma_table; ++ params->gtable.redtable = redgamma_table; ++ /* White Balance */ ++ params->wbal.dgain = flr_wbal_dgain; ++ params->wbal.coef0 = flr_wbal_coef0; ++ params->wbal.coef1 = flr_wbal_coef1; ++ params->wbal.coef2 = flr_wbal_coef2; ++ params->wbal.coef3 = flr_wbal_coef3; ++ /* Black Adjustment */ ++ params->blk_adj.red = flr_blkadj_red; ++ params->blk_adj.green = flr_blkadj_green; ++ params->blk_adj.blue = flr_blkadj_blue; ++ /* RGB to RGB Blending */ ++ params->rgb2rgb = flr_rgb2rgb; ++ /* RGB to YCbCr Blending */ ++ params->rgb2ycbcr = flr_prev_csc[ispprev_obj.color]; ++ ++ /* Features enabled by default */ ++ params->features = PREV_CFA | PREV_CHROMA_SUPPRESS | PREV_LUMA_ENHANCE ++ | PREV_DEFECT_COR | PREV_NOISE_FILTER; ++ params->features &= ~(PREV_AVERAGER | PREV_INVERSE_ALAW | ++ PREV_HORZ_MEDIAN_FILTER | ++ PREV_GAMMA_BYPASS | ++ PREV_DARK_FRAME_SUBTRACT | ++ PREV_LENS_SHADING | ++ PREV_DARK_FRAME_CAPTURE); ++ return 0; ++} ++ ++static void ++isp_preview_cleanup(void) ++{ ++ kfree(prev_config_params); ++ prev_config_params = NULL; ++} ++ ++module_init(isp_preview_init); ++module_exit(isp_preview_cleanup); ++ ++MODULE_AUTHOR("Texas Instruments"); ++MODULE_DESCRIPTION("ISP Preview Library"); ++MODULE_LICENSE("GPL"); +Index: git/drivers/media/video/isp/isppreview.h +=================================================================== +--- /dev/null 1970-01-01 00:00:00.000000000 +0000 ++++ git/drivers/media/video/isp/isppreview.h 2009-02-12 16:32:50.000000000 -0600 +@@ -0,0 +1,525 @@ ++/* ++ * drivers/media/video/isp/isppreview.h ++ * ++ * Driver include file for Preview module in TI's OMAP3430 Camera ISP ++ * ++ * Copyright (C) 2008 Texas Instruments, Inc. ++ * ++ * This package 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 PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR ++ * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED ++ * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. ++ */ ++ ++#ifndef OMAP_ISP_PREVIEW_H ++#define OMAP_ISP_PREVIEW_H ++ ++/* Isp query control structure */ ++ ++#define ISPPRV_BRIGHT_STEP 0x1 ++#define ISPPRV_BRIGHT_DEF 0x1 ++#define ISPPRV_BRIGHT_LOW 0x0 ++#define ISPPRV_BRIGHT_HIGH 0xF ++#define ISPPRV_BRIGHT_UNITS 0x7 ++ ++#define ISPPRV_CONTRAST_STEP 0x1 ++#define ISPPRV_CONTRAST_DEF 0x2 ++#define ISPPRV_CONTRAST_LOW 0x0 ++#define ISPPRV_CONTRAST_HIGH 0xF ++#define ISPPRV_CONTRAST_UNITS 0x5 ++ ++#define NO_AVE 0x0 ++#define AVE_2_PIX 0x1 ++#define AVE_4_PIX 0x2 ++#define AVE_8_PIX 0x3 ++#define AVE_ODD_PIXEL_DIST (1 << 4) /* For Bayer Sensors */ ++#define AVE_EVEN_PIXEL_DIST (1 << 2) ++ ++#define WB_GAIN_MAX 4 ++#define RGB_MAX 3 ++ ++/* Features list */ ++#define PREV_AVERAGER (1 << 0) ++#define PREV_INVERSE_ALAW (1 << 1) ++#define PREV_HORZ_MEDIAN_FILTER (1 << 2) ++#define PREV_NOISE_FILTER (1 << 3) ++#define PREV_CFA (1 << 4) ++#define PREV_GAMMA_BYPASS (1 << 5) ++#define PREV_LUMA_ENHANCE (1 << 6) ++#define PREV_CHROMA_SUPPRESS (1 << 7) ++#define PREV_DARK_FRAME_SUBTRACT (1 << 8) ++#define PREV_LENS_SHADING (1 << 9) ++#define PREV_DARK_FRAME_CAPTURE (1 << 10) ++#define PREV_DEFECT_COR (1 << 11) ++ ++/* Abstraction layer preview configurations */ ++#define ISP_ABS_PREV_LUMAENH (1 << 1) ++#define ISP_ABS_PREV_INVALAW (1 << 2) ++#define ISP_ABS_PREV_HRZ_MED (1 << 5) ++#define ISP_ABS_PREV_CFA (1 << 6) ++#define ISP_ABS_PREV_CHROMA_SUPP (1 << 7) ++#define ISP_ABS_PREV_WB (1 << 8) ++#define ISP_ABS_PREV_BLKADJ (1 << 9) ++#define ISP_ABS_PREV_RGB2RGB (1 << 10) ++#define ISP_ABS_PREV_COLOR_CONV (1 << 11) ++#define ISP_ABS_PREV_YC_LIMIT (1 << 12) ++#define ISP_ABS_PREV_DEFECT_COR (1 << 13) ++#define ISP_ABS_PREV_GAMMABYPASS (1 << 14) ++ ++/* Abstraction layer Table Update Flags */ ++#define ISP_ABS_TBL_NF (1 << 1) ++#define ISP_ABS_TBL_REDGAMMA (1 << 2) ++#define ISP_ABS_TBL_GREENGAMMA (1 << 3) ++#define ISP_ABS_TBL_BLUEGAMMA (1 << 4) ++ ++#define ISP_NF_TABLE_SIZE 64 ++#define ISP_GAMMA_TABLE_SIZE 1024 ++ ++/* ++ *Enumeration Constants for input and output format ++ */ ++enum preview_input { ++ PRV_RAW_CCDC, ++ PRV_RAW_MEM, ++ PRV_RGBBAYERCFA, ++ PRV_COMPCFA, ++ PRV_CCDC_DRKF, ++ PRV_OTHERS ++}; ++ ++enum preview_output { ++ PREVIEW_RSZ, ++ PREVIEW_MEM ++}; ++/* ++ * Configure byte layout of YUV image ++ */ ++enum preview_ycpos_mode { ++ YCPOS_YCrYCb = 0, ++ YCPOS_YCbYCr = 1, ++ YCPOS_CbYCrY = 2, ++ YCPOS_CrYCbY = 3 ++}; ++ ++enum preview_color_effect { ++ PREV_DEFAULT_COLOR = 0, ++ PREV_BW_COLOR = 1, ++ PREV_SEPIA_COLOR = 2 ++}; ++ ++/** ++ * struct ispprev_hmed - Structure for Horizontal Median Filter. ++ * @odddist: Distance between consecutive pixels of same color in the odd line. ++ * @evendist: Distance between consecutive pixels of same color in the even ++ * line. ++ * @thres: Horizontal median filter threshold. ++ */ ++struct ispprev_hmed { ++ u8 odddist; ++ u8 evendist; ++ u8 thres; ++}; ++ ++/* ++ * Structure for Noise Filter ++ */ ++struct ispprev_nf { ++ /* Spread value to be used in Noise Filter*/ ++ u8 spread; ++ /*Pointer to the Noise Filter table */ ++ u32 *table; ++}; ++ ++/* ++ * Structure for Defect correction ++ */ ++struct ispprev_dcor { ++ /* Flag to enable or disable the couplet dc Correction in NF*/ ++ u8 couplet_mode_en; ++ /* Thresholds for correction bit 0:10 detect 16:25 correct*/ ++ u32 detect_correct[4]; ++}; ++ ++ ++ ++/* ++ * Enumeration for CFA Formats supported by preview ++ */ ++enum cfa_fmt { ++ CFAFMT_BAYER, CFAFMT_SONYVGA, CFAFMT_RGBFOVEON, ++ CFAFMT_DNSPL, CFAFMT_HONEYCOMB, CFAFMT_RRGGBBFOVEON ++}; ++/* ++ * Structure for CFA Inpterpolation ++ */ ++struct ispprev_cfa { ++ /* CFA Format Enum value supported by preview.*/ ++ enum cfa_fmt cfafmt; ++ /* CFA Gradient Threshold - Vertical */ ++ u8 cfa_gradthrs_vert; ++ /* CFA Gradient Threshold - Horizontal */ ++ u8 cfa_gradthrs_horz; ++ /* Pointer to the CFA table */ ++ u32 *cfa_table; ++}; ++/* ++ * Structure for Gamma Correction ++ */ ++struct ispprev_gtable { ++ /* Pointer to the red gamma table */ ++ u32 *redtable; ++ /* Pointer to the green gamma table */ ++ u32 *greentable; ++ /* Pointer to the blue gamma table */ ++ u32 *bluetable; ++}; ++/* ++ * Structure for Chrominance Suppression ++ */ ++struct ispprev_csup { ++ /* Gain */ ++ u8 gain; ++ /* Threshold */ ++ u8 thres; ++ /* Flag to enable/disable the High Pass Filter */ ++ u8 hypf_en; ++}; ++/* ++ * Structure for White Balance ++ */ ++struct ispprev_wbal { ++ /*Digital gain (U10Q8) */ ++ u16 dgain; ++ /*White balance gain - COEF 3 (U8Q5) */ ++ u8 coef3; ++ /*White balance gain - COEF 2 (U8Q5) */ ++ u8 coef2; ++ /*White balance gain - COEF 1 (U8Q5) */ ++ u8 coef1; ++ /*White balance gain - COEF 0 (U8Q5) */ ++ u8 coef0; ++}; ++ ++struct prev_white_balance { ++ u16 wb_dgain; /* white balance common gain */ ++ u8 wb_gain[WB_GAIN_MAX]; /* individual color gains */ ++ u8 wb_coefmatrix[WB_GAIN_MAX][WB_GAIN_MAX]; ++}; ++/* ++ * Structure for Black Adjustment ++ */ ++struct ispprev_blkadj { ++ /*Black level offset adjustment for Red in 2's complement format */ ++ u8 red; ++ /*Black level offset adjustment for Green in 2's complement format */ ++ u8 green; ++ /* Black level offset adjustment for Blue in 2's complement format */ ++ u8 blue; ++}; ++/* ++ * Structure for RGB to RGB Blending ++ */ ++struct ispprev_rgbtorgb { ++ /* ++ * Blending values(S12Q8 format) ++ * [RR] [GR] [BR] ++ * [RG] [GG] [BG] ++ * [RB] [GB] [BB] ++ */ ++ u16 matrix[3][3]; ++ /*Blending offset value for R,G,B in 2's complement integer format*/ ++ u16 offset[3]; ++}; ++/* ++ * Structure for Color Space Conversion from RGB-YCbYCr ++ */ ++struct ispprev_csc { ++ /* ++ *Color space conversion coefficients(S10Q8) ++ * [CSCRY] [CSCGY] [CSCBY] ++ * [CSCRCB] [CSCGCB] [CSCBCB] ++ * [CSCRCR] [CSCGCR] [CSCBCR] ++ */ ++ u16 matrix[RGB_MAX][RGB_MAX]; ++ /* ++ *CSC offset values for Y offset, CB offset and CR offset respectively ++ */ ++ s16 offset[RGB_MAX]; ++}; ++/* ++ * Structure for Y, C Value Limit ++ */ ++struct ispprev_yclimit{ ++ u8 minC; ++ u8 maxC; ++ u8 minY; ++ u8 maxY; ++}; ++ ++/* ++ * Structure for size parameters ++ */ ++struct prev_size_params { ++ unsigned int hstart; /* Starting pixel */ ++ unsigned int vstart; /* Starting line */ ++ unsigned int hsize; /* width of input image */ ++ unsigned int vsize; /* height of input image */ ++ unsigned char pixsize; /* pixel size of the image in ++ terms of bits */ ++ unsigned short in_pitch; /* line offset of input image */ ++ unsigned short out_pitch; /* line offset of output image */ ++}; ++ ++/* ++ * Structure RGB2YCbCr parameters ++ */ ++struct prev_rgb2ycbcr_coeffs { ++ short coeff[RGB_MAX][RGB_MAX]; /* color conversion gains in ++ 3x3 matrix */ ++ short offset[RGB_MAX]; /* color conversion offsets */ ++}; ++ ++/* ++ * Structure for Dark frame suppression ++ */ ++struct prev_darkfrm_params { ++ u32 addr; /* memory start address */ ++ u32 offset; /* line offset */ ++}; ++ ++ ++/* ++ * Structure for all configuration ++ */ ++struct prev_params { ++ u16 features; /* Set of features enabled */ ++ ++ enum preview_ycpos_mode pix_fmt; /* output pixel format */ ++ ++ struct ispprev_cfa cfa; /* CFA coefficients */ ++ ++ struct ispprev_csup csup; /* chroma suppression coefficients */ ++ ++ u32 *ytable; /* luma enhancement coeffs */ ++ ++ struct ispprev_nf nf; /* noise filter coefficients */ ++ ++ struct ispprev_dcor dcor; /* noise filter coefficients */ ++ ++ struct ispprev_gtable gtable; /* gamma coefficients */ ++ ++ struct ispprev_wbal wbal; ++ /* ++ struct prev_white_balance prev_wbal; ++ */ ++ struct ispprev_blkadj blk_adj; /* black adjustment parameters */ ++ ++ struct ispprev_rgbtorgb rgb2rgb; /* rgb blending parameters */ ++ ++ struct ispprev_csc rgb2ycbcr; /* rgb to ycbcr parameters */ ++ ++ struct ispprev_hmed hmf_params; /* horizontal median filter */ ++ ++ struct prev_size_params size_params; /* size parameters */ ++ struct prev_darkfrm_params drkf_params; ++ u8 lens_shading_shift; ++ u8 average; /* down sampling rate for averager */ ++ ++ u8 contrast; /* contrast */ ++ u8 brightness; /* brightness */ ++}; ++ ++/** ++ * struct ispprv_update_config - Structure for Preview Configuration (user). ++ * @update: Specifies which ISP Preview registers should be updated. ++ * @flag: Specifies which ISP Preview functions should be enabled. ++ * @yen: Pointer to luma enhancement table. ++ * @shading_shift: 3bit value of shift used in shading compensation. ++ * @prev_hmed: Pointer to structure containing the odd and even distance. ++ * between the pixels in the image along with the filter threshold. ++ * @prev_cfa: Pointer to structure containing the CFA interpolation table, CFA. ++ * format in the image, vertical and horizontal gradient threshold. ++ * @csup: Pointer to Structure for Chrominance Suppression coefficients. ++ * @prev_wbal: Pointer to structure for White Balance. ++ * @prev_blkadj: Pointer to structure for Black Adjustment. ++ * @rgb2rgb: Pointer to structure for RGB to RGB Blending. ++ * @prev_csc: Pointer to structure for Color Space Conversion from RGB-YCbYCr. ++ * @yclimit: Pointer to structure for Y, C Value Limit. ++ * @prev_dcor: Pointer to structure for defect correction. ++ */ ++struct ispprv_update_config { ++ u16 update; ++ u16 flag; ++ void *yen; ++ u32 shading_shift; ++ struct ispprev_hmed *prev_hmed; ++ struct ispprev_cfa *prev_cfa; ++ struct ispprev_csup *csup; ++ struct ispprev_wbal *prev_wbal; ++ struct ispprev_blkadj *prev_blkadj; ++ struct ispprev_rgbtorgb *rgb2rgb; ++ struct ispprev_csc *prev_csc; ++ struct ispprev_yclimit *yclimit; ++ struct ispprev_dcor *prev_dcor; ++}; ++ ++/** ++ * struct isptables_update - Structure for Table Configuration. ++ * @update: Specifies which tables should be updated. ++ * @flag: Specifies which tables should be enabled. ++ * @lsc_cfg: Pointer to structure for LSC configuration. ++ * @prev_nf: Pointer to structure for Noise Filter ++ * @lsc: Pointer to LSC gain table. (currently not used) ++ * @red_gamma: Pointer to red gamma correction table. ++ * @green_gamma: Pointer to green gamma correction table. ++ * @blue_gamma: Pointer to blue gamma correction table. ++ */ ++struct isptables_update { ++ u16 update; ++ u16 flag; ++ struct ispprev_nf *prev_nf; ++ u32 *lsc; ++ u32 *red_gamma; ++ u32 *green_gamma; ++ u32 *blue_gamma; ++}; ++ ++void isppreview_config_shadow_registers(void); ++ ++#include <linux/autoconf.h> ++#ifdef CONFIG_VIDEO_OMAP34XX_ISP_PREVIEWER ++int isppreview_request(void); ++ ++int isppreview_free(void); ++ ++int isppreview_config_datapath(enum preview_input input, ++ enum preview_output output); ++ ++void isppreview_config_ycpos(enum preview_ycpos_mode mode); ++ ++void isppreview_set_color(u8 *mode); ++ ++void isppreview_get_color(u8 *mode); ++ ++void isppreview_query_contrast(u8 *contrast); ++ ++void isppreview_query_brightness(u8 *brightness); ++ ++int isppreview_try_size(u32 input_w, u32 input_h, u32 *output_w, u32 *output_h); ++ ++int isppreview_config_size(u32 input_w, u32 input_h, u32 output_w, ++ u32 output_h); ++ ++void isppreview_update_contrast(u8 *contrast); ++ ++void isppreview_update_brightness(u8 *brightness); ++ ++int isppreview_busy(void); ++ ++void isppreview_save_context(void); ++ ++void isppreview_restore_context(void); ++ ++int omap34xx_isp_preview_config(void *userspace_add); ++ ++int omap34xx_isp_tables_update(void *userspace_add); ++ ++#else ++static inline int isppreview_request(void) { return 0;} ++static inline int isppreview_free(void) { return 0;} ++static inline int isppreview_config_datapath(enum preview_input input, ++ enum preview_output output) { return 0;} ++static inline void isppreview_config_ycpos(enum preview_ycpos_mode mode) {} ++static inline void isppreview_set_color(u8 *mode) {} ++static inline void isppreview_get_color(u8 *mode) {} ++static inline void isppreview_query_brightness(u8 *brightness) {} ++static inline void isppreview_query_contrast(u8 *contrast){} ++static inline int isppreview_try_size(u32 input_w, u32 input_h, u32 *output_w, u32 *output_h){ return 0;} ++static inline int isppreview_config_size(u32 input_w, u32 input_h, u32 output_w, u32 output_h) {return 0;} ++static inline void isppreview_update_contrast(u8 *contrast) {} ++static inline void isppreview_update_brightness(u8 *brightness) {} ++static inline int isppreview_busy(void){return 0;} ++static inline int omap34xx_isp_preview_config(void *userspace_add){return 0;} ++static inline int omap34xx_isp_tables_update(void *userspace_add){return 0;} ++static inline void isppreview_save_context(void) {} ++static inline void isppreview_restore_context(void) {} ++#endif ++ ++void isppreview_config_averager(u8 average); ++ ++void isppreview_enable_invalaw(u8 enable); ++ ++void isppreview_enable_drkframe(u8 enable); ++ ++void isppreview_enable_shadcomp(u8 enable); ++ ++void isppreview_config_drkf_shadcomp(u8 scomp_shtval); ++ ++void isppreview_enable_gammabypass(u8 enable); ++ ++void isppreview_enable_hmed(u8 enable); ++ ++void isppreview_config_hmed(struct ispprev_hmed); ++ ++void isppreview_enable_noisefilter(u8 enable); ++ ++void isppreview_config_noisefilter(struct ispprev_nf prev_nf); ++ ++void isppreview_enable_dcor(u8 enable); ++ ++void isppreview_config_dcor(struct ispprev_dcor prev_dcor); ++ ++void isppreview_config_cfa(struct ispprev_cfa); ++ ++void isppreview_config_gammacorrn(struct ispprev_gtable); ++ ++void isppreview_config_chroma_suppression(struct ispprev_csup csup); ++ ++void isppreview_enable_cfa(u8 enable); ++ ++void isppreview_config_luma_enhancement(u32 *ytable); ++ ++void isppreview_enable_luma_enhancement(u8 enable); ++ ++void isppreview_enable_chroma_suppression(u8 enable); ++ ++void isppreview_config_whitebalance(struct ispprev_wbal); ++ ++void isppreview_config_blkadj(struct ispprev_blkadj); ++ ++void isppreview_config_rgb_blending(struct ispprev_rgbtorgb); ++ ++void isppreview_config_rgb_to_ycbcr(struct ispprev_csc); ++ ++void isppreview_config_contrast(u8 contrast); ++ ++void isppreview_get_contrast_range(u8 *min_contrast, u8 *max_contrast); ++ ++void isppreview_config_brightness(u8 brightness); ++ ++void isppreview_get_brightness_range(u8 *min_brightness, u8 *max_brightness); ++ ++void isppreview_config_yc_range(struct ispprev_yclimit yclimit); ++ ++int isppreview_config_inlineoffset(u32 offset); ++ ++int isppreview_set_inaddr(u32 addr); ++ ++int isppreview_config_outlineoffset(u32 offset); ++ ++int isppreview_set_outaddr(u32 addr); ++ ++int isppreview_config_darklineoffset(u32 offset); ++ ++int isppreview_set_darkaddr(u32 addr); ++ ++void isppreview_enable(u8 enable); ++ ++struct prev_params *isppreview_get_config(void); ++ ++void isppreview_print_status(void); ++ ++#endif/* OMAP_ISP_PREVIEW_H */ +Index: git/drivers/media/video/isp/ispreg.h +=================================================================== +--- /dev/null 1970-01-01 00:00:00.000000000 +0000 ++++ git/drivers/media/video/isp/ispreg.h 2009-02-12 10:29:26.000000000 -0600 +@@ -0,0 +1,1225 @@ ++/* ++ * drivers/media/video/omap/isp/ispreg.h ++ * ++ * Header file for all the ISP module in TI's OMAP3430 Camera ISP. ++ * It has the OMAP HW register definitions. ++ * ++ * Copyright (C) 2007 Texas Instruments. ++ * ++ * This package 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 PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR ++ * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED ++ * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. ++ */ ++ ++#ifndef __ISPREG_H__ ++#define __ISPREG_H__ ++ ++#if 0 ++#define OMAP_ISPCTRL_DEBUG ++#define OMAP_ISPCCDC_DEBUG ++#define OMAP_ISPPREV_DEBUG ++#define OMAP_ISPRESZ_DEBUG ++#define OMAP_ISPMMU_DEBUG ++#define OMAP_ISPH3A_DEBUG ++#define OMAP_ISPHIST_DEBUG ++#endif ++ ++#ifdef OMAP_ISPCTRL_DEBUG ++#define DPRINTK_ISPCTRL(format,...)\ ++ printk("ISPCTRL: " format, ## __VA_ARGS__) ++#else ++#define DPRINTK_ISPCTRL(format, ...) ++#endif ++ ++#ifdef OMAP_ISPCCDC_DEBUG ++#define DPRINTK_ISPCCDC(format, ...)\ ++ printk("ISPCCDC: " format, ## __VA_ARGS__) ++#else ++#define DPRINTK_ISPCCDC(format, ...) ++#endif ++ ++#ifdef OMAP_ISPPREV_DEBUG ++#define DPRINTK_ISPPREV(format, ...)\ ++ printk("ISPPREV: " format, ## __VA_ARGS__) ++#else ++#define DPRINTK_ISPPREV(format, ...) ++#endif ++ ++#ifdef OMAP_ISPRESZ_DEBUG ++#define DPRINTK_ISPRESZ(format, ...)\ ++ printk("ISPRESZ: " format, ## __VA_ARGS__) ++#else ++#define DPRINTK_ISPRESZ(format, ...) ++#endif ++ ++#ifdef OMAP_ISPMMU_DEBUG ++#define DPRINTK_ISPMMU(format, ...)\ ++ printk("ISPMMU: " format, ## __VA_ARGS__) ++#else ++#define DPRINTK_ISPMMU(format, ...) ++#endif ++ ++#ifdef OMAP_ISPH3A_DEBUG ++#define DPRINTK_ISPH3A(format, ...)\ ++ printk("ISPH3A: " format, ## __VA_ARGS__) ++#else ++#define DPRINTK_ISPH3A(format, ...) ++#endif ++ ++#ifdef OMAP_ISPHIST_DEBUG ++#define DPRINTK_ISPHIST(format, ...)\ ++ printk("ISPHIST: " format, ## __VA_ARGS__) ++#else ++#define DPRINTK_ISPHIST(format, ...) ++#endif ++ ++#define ISP_32B_BOUNDARY_BUF 0xFFFFFFE0 ++#define ISP_32B_BOUNDARY_OFFSET 0x0000FFE0 ++ ++/*PRCM Clock definition*/ ++ ++#define CM_FCLKEN_CAM 0x48004f00 ++#define CM_ICLKEN_CAM 0x48004f10 ++#define CM_AUTOIDLE_CAM 0x48004f30 ++#define CM_CLKSEL_CAM 0x48004f40 ++#define CM_CLKEN_PLL 0x48004D00 ++#define CM_CLKSEL2_PLL 0x48004D44 ++#define CTRL_PADCONF_CAM_HS 0x4800210C ++#define CTRL_PADCONF_CAM_XCLKA 0x48002110 ++#define CTRL_PADCONF_CAM_D1 0x48002118 ++#define CTRL_PADCONF_CAM_D3 0x4800211C ++#define CTRL_PADCONF_CAM_D5 0x48002120 ++ ++#define CTRL_PADCONF_CAM_D7 0x48002124 ++#define CTRL_PADCONF_CAM_D9 0x48002128 ++#define CTRL_PADCONF_CAM_D11 0x4800212C ++ ++#define CM_ICLKEN_CAM_EN 0x1 ++#define CM_FCLKEN_CAM_EN 0x1 ++ ++#define CM_CAM_MCLK_HZ 216000000 ++ ++/* ISP Submodules offset */ ++ ++#define ISP_REG_BASE 0x480BC000 ++#define ISP_REG_SIZE 0x00001600 ++ ++#define ISPCBUFF_REG_BASE 0x480BC100 ++#define ISPCBUFF_REG(offset) (ISPCBUFF_REG_BASE + (offset)) ++ ++#define ISPCCP2A_REG_OFFSET 0x00000200 ++#define ISPCCP2A_REG_BASE 0x480BC200 ++ ++#define ISPCCP2B_REG_OFFSET 0x00000400 ++#define ISPCCP2B_REG_BASE 0x480BC400 ++ ++#define ISPCCDC_REG_OFFSET 0x00000600 ++#define ISPCCDC_REG_BASE 0x480BC600 ++ ++#define ISPSCMP_REG_OFFSET 0x00000800 ++#define ISPSCMP_REG_BASE 0x480BC800 ++ ++#define ISPHIST_REG_OFFSET 0x00000A00 ++#define ISPHIST_REG_BASE 0x480BCA00 ++#define ISPHIST_REG(offset) (ISPHIST_REG_BASE + (offset)) ++ ++#define ISPH3A_REG_OFFSET 0x00000C00 ++#define ISPH3A_REG_BASE 0x480BCC00 ++#define ISPH3A_REG(offset) (ISPH3A_REG_BASE + (offset)) ++ ++#define ISPPREVIEW_REG_OFFSET 0x00000E00 ++#define ISPPREVIEW_REG_BASE 0x480BCE00 ++ ++#define ISPRESIZER_REG_OFFSET 0x00001000 ++#define ISPRESIZER_REG_BASE 0x480BD000 ++ ++#define ISPSBL_REG_OFFSET 0x00001200 ++#define ISPSBL_REG_BASE 0x480BD200 ++ ++#define ISPMMU_REG_OFFSET 0x00001400 ++#define ISPMMU_REG_BASE 0x480BD400 ++ ++/* ISP module register offset */ ++ ++#define ISP_REVISION 0x480BC000 ++#define ISP_SYSCONFIG 0x480BC004 ++#define ISP_SYSSTATUS 0x480BC008 ++#define ISP_IRQ0ENABLE 0x480BC00C ++#define ISP_IRQ0STATUS 0x480BC010 ++#define ISP_IRQ1ENABLE 0x480BC014 ++#define ISP_IRQ1STATUS 0x480BC018 ++#define ISP_TCTRL_GRESET_LENGTH 0x480BC030 ++#define ISP_TCTRL_PSTRB_REPLAY 0x480BC034 ++#define ISP_CTRL 0x480BC040 ++#define ISP_SECURE 0x480BC044 ++#define ISP_TCTRL_CTRL 0x480BC050 ++#define ISP_TCTRL_FRAME 0x480BC054 ++#define ISP_TCTRL_PSTRB_DELAY 0x480BC058 ++#define ISP_TCTRL_STRB_DELAY 0x480BC05C ++#define ISP_TCTRL_SHUT_DELAY 0x480BC060 ++#define ISP_TCTRL_PSTRB_LENGTH 0x480BC064 ++#define ISP_TCTRL_STRB_LENGTH 0x480BC068 ++#define ISP_TCTRL_SHUT_LENGTH 0x480BC06C ++#define ISP_PING_PONG_ADDR 0x480BC070 ++#define ISP_PING_PONG_MEM_RANGE 0x480BC074 ++#define ISP_PING_PONG_BUF_SIZE 0x480BC078 ++ ++/* CSI1 receiver registers */ ++ ++#define ISP_CSIA_SYSCONFIG 0x480BC204 ++#define ISP_CSIB_SYSCONFIG 0x480BC404 ++ ++/* ISP_CBUFF Registers */ ++ ++#define ISP_CBUFF_SYSCONFIG ISPCBUFF_REG(0x010) ++#define ISP_CBUFF_IRQENABLE ISPCBUFF_REG(0x01C) ++ ++#define ISP_CBUFF0_CTRL ISPCBUFF_REG(0x020) ++#define ISP_CBUFF1_CTRL (ISP_CBUFF0_CTRL + (0x004)) ++ ++#define ISP_CBUFF0_START ISPCBUFF_REG(0x040) ++#define ISP_CBUFF1_START (ISP_CBUFF0_START + (0x004)) ++ ++#define ISP_CBUFF0_END ISPCBUFF_REG(0x050) ++#define ISP_CBUFF1_END (ISP_CBUFF0_END + (0x04)) ++ ++#define ISP_CBUFF0_WINDOWSIZE ISPCBUFF_REG(0x060) ++#define ISP_CBUFF1_WINDOWSIZE (ISP_CBUFF0_WINDOWSIZE + (0x004)) ++ ++#define ISP_CBUFF0_THRESHOLD ISPCBUFF_REG(0x070) ++#define ISP_CBUFF1_THRESHOLD (ISP_CBUFF0_THRESHOLD + (0x004)) ++ ++ ++/* CCDC module register offset */ ++ ++#define ISPCCDC_PID 0x480BC600 ++#define ISPCCDC_PCR 0x480BC604 ++#define ISPCCDC_SYN_MODE 0x480BC608 ++#define ISPCCDC_HD_VD_WID 0x480BC60C ++#define ISPCCDC_PIX_LINES 0x480BC610 ++#define ISPCCDC_HORZ_INFO 0x480BC614 ++#define ISPCCDC_VERT_START 0x480BC618 ++#define ISPCCDC_VERT_LINES 0x480BC61C ++#define ISPCCDC_CULLING 0x480BC620 ++#define ISPCCDC_HSIZE_OFF 0x480BC624 ++#define ISPCCDC_SDOFST 0x480BC628 ++#define ISPCCDC_SDR_ADDR 0x480BC62C ++#define ISPCCDC_CLAMP 0x480BC630 ++#define ISPCCDC_DCSUB 0x480BC634 ++#define ISPCCDC_COLPTN 0x480BC638 ++#define ISPCCDC_BLKCMP 0x480BC63C ++#define ISPCCDC_FPC 0x480BC640 ++#define ISPCCDC_FPC_ADDR 0x480BC644 ++#define ISPCCDC_VDINT 0x480BC648 ++#define ISPCCDC_ALAW 0x480BC64C ++#define ISPCCDC_REC656IF 0x480BC650 ++#define ISPCCDC_CFG 0x480BC654 ++#define ISPCCDC_FMTCFG 0x480BC658 ++#define ISPCCDC_FMT_HORZ 0x480BC65C ++#define ISPCCDC_FMT_VERT 0x480BC660 ++#define ISPCCDC_FMT_ADDR0 0x480BC664 ++#define ISPCCDC_FMT_ADDR1 0x480BC668 ++#define ISPCCDC_FMT_ADDR2 0x480BC66C ++#define ISPCCDC_FMT_ADDR3 0x480BC670 ++#define ISPCCDC_FMT_ADDR4 0x480BC674 ++#define ISPCCDC_FMT_ADDR5 0x480BC678 ++#define ISPCCDC_FMT_ADDR6 0x480BC67C ++#define ISPCCDC_FMT_ADDR7 0x480BC680 ++#define ISPCCDC_PRGEVEN0 0x480BC684 ++#define ISPCCDC_PRGEVEN1 0x480BC688 ++#define ISPCCDC_PRGODD0 0x480BC68C ++#define ISPCCDC_PRGODD1 0x480BC690 ++#define ISPCCDC_VP_OUT 0x480BC694 ++ ++#define ISPCCDC_LSC_CONFIG 0x480BC698 ++#define ISPCCDC_LSC_INITIAL 0x480BC69C ++#define ISPCCDC_LSC_TABLE_BASE 0x480BC6A0 ++#define ISPCCDC_LSC_TABLE_OFFSET 0x480BC6A4 ++ ++ ++/* Histogram registers */ ++#define ISPHIST_PID ISPHIST_REG(0x000) ++#define ISPHIST_PCR ISPHIST_REG(0x004) ++#define ISPHIST_CNT ISPHIST_REG(0x008) ++#define ISPHIST_WB_GAIN ISPHIST_REG(0x00C) ++#define ISPHIST_R0_HORZ ISPHIST_REG(0x010) ++#define ISPHIST_R0_VERT ISPHIST_REG(0x014) ++#define ISPHIST_R1_HORZ ISPHIST_REG(0x018) ++#define ISPHIST_R1_VERT ISPHIST_REG(0x01C) ++#define ISPHIST_R2_HORZ ISPHIST_REG(0x020) ++#define ISPHIST_R2_VERT ISPHIST_REG(0x024) ++#define ISPHIST_R3_HORZ ISPHIST_REG(0x028) ++#define ISPHIST_R3_VERT ISPHIST_REG(0x02C) ++#define ISPHIST_ADDR ISPHIST_REG(0x030) ++#define ISPHIST_DATA ISPHIST_REG(0x034) ++#define ISPHIST_RADD ISPHIST_REG(0x038) ++#define ISPHIST_RADD_OFF ISPHIST_REG(0x03C) ++#define ISPHIST_H_V_INFO ISPHIST_REG(0x040) ++ ++/* H3A module registers */ ++#define ISPH3A_PID ISPH3A_REG(0x000) ++#define ISPH3A_PCR ISPH3A_REG(0x004) ++#define ISPH3A_AEWWIN1 ISPH3A_REG(0x04C) ++#define ISPH3A_AEWINSTART ISPH3A_REG(0x050) ++#define ISPH3A_AEWINBLK ISPH3A_REG(0x054) ++#define ISPH3A_AEWSUBWIN ISPH3A_REG(0x058) ++#define ISPH3A_AEWBUFST ISPH3A_REG(0x05C) ++#define ISPH3A_AFPAX1 ISPH3A_REG(0x008) ++#define ISPH3A_AFPAX2 ISPH3A_REG(0x00C) ++#define ISPH3A_AFPAXSTART ISPH3A_REG(0x010) ++#define ISPH3A_AFIIRSH ISPH3A_REG(0x014) ++#define ISPH3A_AFBUFST ISPH3A_REG(0x018) ++#define ISPH3A_AFCOEF010 ISPH3A_REG(0x01C) ++#define ISPH3A_AFCOEF032 ISPH3A_REG(0x020) ++#define ISPH3A_AFCOEF054 ISPH3A_REG(0x024) ++#define ISPH3A_AFCOEF076 ISPH3A_REG(0x028) ++#define ISPH3A_AFCOEF098 ISPH3A_REG(0x02C) ++#define ISPH3A_AFCOEF0010 ISPH3A_REG(0x030) ++#define ISPH3A_AFCOEF110 ISPH3A_REG(0x034) ++#define ISPH3A_AFCOEF132 ISPH3A_REG(0x038) ++#define ISPH3A_AFCOEF154 ISPH3A_REG(0x03C) ++#define ISPH3A_AFCOEF176 ISPH3A_REG(0x040) ++#define ISPH3A_AFCOEF198 ISPH3A_REG(0x044) ++#define ISPH3A_AFCOEF1010 ISPH3A_REG(0x048) ++ ++ ++ ++ ++#define ISPPRV_PCR 0x480BCE04 ++#define ISPPRV_HORZ_INFO 0x480BCE08 ++#define ISPPRV_VERT_INFO 0x480BCE0C ++#define ISPPRV_RSDR_ADDR 0x480BCE10 ++#define ISPPRV_RADR_OFFSET 0x480BCE14 ++#define ISPPRV_DSDR_ADDR 0x480BCE18 ++#define ISPPRV_DRKF_OFFSET 0x480BCE1C ++#define ISPPRV_WSDR_ADDR 0x480BCE20 ++#define ISPPRV_WADD_OFFSET 0x480BCE24 ++#define ISPPRV_AVE 0x480BCE28 ++#define ISPPRV_HMED 0x480BCE2C ++#define ISPPRV_NF 0x480BCE30 ++#define ISPPRV_WB_DGAIN 0x480BCE34 ++#define ISPPRV_WBGAIN 0x480BCE38 ++#define ISPPRV_WBSEL 0x480BCE3C ++#define ISPPRV_CFA 0x480BCE40 ++#define ISPPRV_BLKADJOFF 0x480BCE44 ++#define ISPPRV_RGB_MAT1 0x480BCE48 ++#define ISPPRV_RGB_MAT2 0x480BCE4C ++#define ISPPRV_RGB_MAT3 0x480BCE50 ++#define ISPPRV_RGB_MAT4 0x480BCE54 ++#define ISPPRV_RGB_MAT5 0x480BCE58 ++#define ISPPRV_RGB_OFF1 0x480BCE5C ++#define ISPPRV_RGB_OFF2 0x480BCE60 ++#define ISPPRV_CSC0 0x480BCE64 ++#define ISPPRV_CSC1 0x480BCE68 ++#define ISPPRV_CSC2 0x480BCE6C ++#define ISPPRV_CSC_OFFSET 0x480BCE70 ++#define ISPPRV_CNT_BRT 0x480BCE74 ++#define ISPPRV_CSUP 0x480BCE78 ++#define ISPPRV_SETUP_YC 0x480BCE7C ++#define ISPPRV_SET_TBL_ADDR 0x480BCE80 ++#define ISPPRV_SET_TBL_DATA 0x480BCE84 ++#define ISPPRV_CDC_THR0 0x480BCE90 ++#define ISPPRV_CDC_THR1 (ISPPRV_CDC_THR0 + (0x4)) ++#define ISPPRV_CDC_THR2 (ISPPRV_CDC_THR0 + (0x4)*2) ++#define ISPPRV_CDC_THR3 (ISPPRV_CDC_THR0 + (0x4)*3) ++ ++#define ISPPRV_REDGAMMA_TABLE_ADDR 0x0000 ++#define ISPPRV_GREENGAMMA_TABLE_ADDR 0x0400 ++#define ISPPRV_BLUEGAMMA_TABLE_ADDR 0x0800 ++#define ISPPRV_NF_TABLE_ADDR 0x0C00 ++#define ISPPRV_YENH_TABLE_ADDR 0x1000 ++#define ISPPRV_CFA_TABLE_ADDR 0x1400 ++ ++#define ISPPRV_MAXOUTPUT_WIDTH 1280 ++#define ISPPRV_MAXOUTPUT_WIDTH_ES2 3300 ++ ++/* Resizer module register offset */ ++ ++#define ISPRSZ_PID 0x480BD000 ++#define ISPRSZ_PCR 0x480BD004 ++#define ISPRSZ_CNT 0x480BD008 ++#define ISPRSZ_OUT_SIZE 0x480BD00C ++#define ISPRSZ_IN_START 0x480BD010 ++#define ISPRSZ_IN_SIZE 0x480BD014 ++#define ISPRSZ_SDR_INADD 0x480BD018 ++#define ISPRSZ_SDR_INOFF 0x480BD01C ++#define ISPRSZ_SDR_OUTADD 0x480BD020 ++#define ISPRSZ_SDR_OUTOFF 0x480BD024 ++#define ISPRSZ_HFILT10 0x480BD028 ++#define ISPRSZ_HFILT32 0x480BD02C ++#define ISPRSZ_HFILT54 0x480BD030 ++#define ISPRSZ_HFILT76 0x480BD034 ++#define ISPRSZ_HFILT98 0x480BD038 ++#define ISPRSZ_HFILT1110 0x480BD03C ++#define ISPRSZ_HFILT1312 0x480BD040 ++#define ISPRSZ_HFILT1514 0x480BD044 ++#define ISPRSZ_HFILT1716 0x480BD048 ++#define ISPRSZ_HFILT1918 0x480BD04C ++#define ISPRSZ_HFILT2120 0x480BD050 ++#define ISPRSZ_HFILT2322 0x480BD054 ++#define ISPRSZ_HFILT2524 0x480BD058 ++#define ISPRSZ_HFILT2726 0x480BD05C ++#define ISPRSZ_HFILT2928 0x480BD060 ++#define ISPRSZ_HFILT3130 0x480BD064 ++#define ISPRSZ_VFILT10 0x480BD068 ++#define ISPRSZ_VFILT32 0x480BD06C ++#define ISPRSZ_VFILT54 0x480BD070 ++#define ISPRSZ_VFILT76 0x480BD074 ++#define ISPRSZ_VFILT98 0x480BD078 ++#define ISPRSZ_VFILT1110 0x480BD07C ++#define ISPRSZ_VFILT1312 0x480BD080 ++#define ISPRSZ_VFILT1514 0x480BD084 ++#define ISPRSZ_VFILT1716 0x480BD088 ++#define ISPRSZ_VFILT1918 0x480BD08C ++#define ISPRSZ_VFILT2120 0x480BD090 ++#define ISPRSZ_VFILT2322 0x480BD094 ++#define ISPRSZ_VFILT2524 0x480BD098 ++#define ISPRSZ_VFILT2726 0x480BD09C ++#define ISPRSZ_VFILT2928 0x480BD0A0 ++#define ISPRSZ_VFILT3130 0x480BD0A4 ++#define ISPRSZ_YENH 0x480BD0A8 ++ ++ ++/* MMU module registers */ ++#define ISPMMU_REVISION 0x480BD400 ++#define ISPMMU_SYSCONFIG 0x480BD410 ++#define ISPMMU_SYSSTATUS 0x480BD414 ++#define ISPMMU_IRQSTATUS 0x480BD418 ++#define ISPMMU_IRQENABLE 0x480BD41C ++#define ISPMMU_WALKING_ST 0x480BD440 ++#define ISPMMU_CNTL 0x480BD444 ++#define ISPMMU_FAULT_AD 0x480BD448 ++#define ISPMMU_TTB 0x480BD44C ++#define ISPMMU_LOCK 0x480BD450 ++#define ISPMMU_LD_TLB 0x480BD454 ++#define ISPMMU_CAM 0x480BD458 ++#define ISPMMU_RAM 0x480BD45C ++#define ISPMMU_GFLUSH 0x480BD460 ++#define ISPMMU_FLUSH_ENTRY 0x480BD464 ++#define ISPMMU_READ_CAM 0x480BD468 ++#define ISPMMU_READ_RAM 0x480BD46c ++#define ISPMMU_EMU_FAULT_AD 0x480BD470 ++ ++ ++#define ISP_INT_CLR 0xFF113F11 ++#define ISPPRV_PCR_EN 1 ++#define ISPPRV_PCR_BUSY (1<<1) ++#define ISPPRV_PCR_SOURCE (1<<2) ++#define ISPPRV_PCR_ONESHOT (1<<3) ++#define ISPPRV_PCR_WIDTH (1<<4) ++#define ISPPRV_PCR_INVALAW (1<<5) ++#define ISPPRV_PCR_DRKFEN (1<<6) ++#define ISPPRV_PCR_DRKFCAP (1<<7) ++#define ISPPRV_PCR_HMEDEN (1<<8) ++#define ISPPRV_PCR_NFEN (1<<9) ++#define ISPPRV_PCR_CFAEN (1<<10) ++#define ISPPRV_PCR_CFAFMT_SHIFT 11 ++#define ISPPRV_PCR_CFAFMT_MASK 0x7800 ++#define ISPPRV_PCR_CFAFMT_BAYER (0<<11) ++#define ISPPRV_PCR_CFAFMT_SONYVGA (1<<11) ++#define ISPPRV_PCR_CFAFMT_RGBFOVEON (2<<11) ++#define ISPPRV_PCR_CFAFMT_DNSPL (3<<11) ++#define ISPPRV_PCR_CFAFMT_HONEYCOMB (4<<11) ++#define ISPPRV_PCR_CFAFMT_RRGGBBFOVEON (5<<11) ++#define ISPPRV_PCR_YNENHEN (1<<15) ++#define ISPPRV_PCR_SUPEN (1<<16) ++#define ISPPRV_PCR_YCPOS_SHIFT 17 ++#define ISPPRV_PCR_YCPOS_YCrYCb (0<<17) ++#define ISPPRV_PCR_YCPOS_YCbYCr (1<<17) ++#define ISPPRV_PCR_YCPOS_CbYCrY (2<<17) ++#define ISPPRV_PCR_YCPOS_CrYCbY (3<<17) ++#define ISPPRV_PCR_RSZPORT (1<<19) ++#define ISPPRV_PCR_SDRPORT (1<<20) ++#define ISPPRV_PCR_SCOMP_EN (1<<21) ++#define ISPPRV_PCR_SCOMP_SFT_SHIFT (22) ++#define ISPPRV_PCR_SCOMP_SFT_MASK ~(7<<22) ++#define ISPPRV_PCR_GAMMA_BYPASS (1<<26) ++#define ISPPRV_PCR_DCOREN (1<<27) ++#define ISPPRV_PCR_DCCOUP (1<<28) ++#define ISPPRV_PCR_DRK_FAIL (1<<31) ++ ++#define ISPPRV_HORZ_INFO_EPH_SHIFT 0 ++#define ISPPRV_HORZ_INFO_EPH_MASK 0x3fff; ++#define ISPPRV_HORZ_INFO_SPH_SHIFT 16 ++#define ISPPRV_HORZ_INFO_SPH_MASK 0x3fff0 ++ ++#define ISPPRV_VERT_INFO_ELV_SHIFT 0 ++#define ISPPRV_VERT_INFO_ELV_MASK 0x3fff ++#define ISPPRV_VERT_INFO_SLV_SHIFT 16 ++#define ISPPRV_VERT_INFO_SLV_MASK 0x3fff0 ++ ++#define ISPPRV_AVE_EVENDIST_SHIFT 2 ++#define ISPPRV_AVE_EVENDIST_1 0x0 ++#define ISPPRV_AVE_EVENDIST_2 0x1 ++#define ISPPRV_AVE_EVENDIST_3 0x2 ++#define ISPPRV_AVE_EVENDIST_4 0x3 ++#define ISPPRV_AVE_ODDDIST_SHIFT 4 ++#define ISPPRV_AVE_ODDDIST_1 0x0 ++#define ISPPRV_AVE_ODDDIST_2 0x1 ++#define ISPPRV_AVE_ODDDIST_3 0x2 ++#define ISPPRV_AVE_ODDDIST_4 0x3 ++ ++#define ISPPRV_HMED_THRESHOLD_SHIFT 0 ++#define ISPPRV_HMED_EVENDIST (1<<8) ++#define ISPPRV_HMED_ODDDIST (1<<9) ++ ++#define ISPPRV_WBGAIN_COEF0_SHIFT 0 ++#define ISPPRV_WBGAIN_COEF1_SHIFT 8 ++#define ISPPRV_WBGAIN_COEF2_SHIFT 16 ++#define ISPPRV_WBGAIN_COEF3_SHIFT 24 ++ ++#define ISPPRV_WBSEL_COEF0 0x0 ++#define ISPPRV_WBSEL_COEF1 0x1 ++#define ISPPRV_WBSEL_COEF2 0x2 ++#define ISPPRV_WBSEL_COEF3 0x3 ++ ++#define ISPPRV_WBSEL_N0_0_SHIFT 0 ++#define ISPPRV_WBSEL_N0_1_SHIFT 2 ++#define ISPPRV_WBSEL_N0_2_SHIFT 4 ++#define ISPPRV_WBSEL_N0_3_SHIFT 6 ++#define ISPPRV_WBSEL_N1_0_SHIFT 8 ++#define ISPPRV_WBSEL_N1_1_SHIFT 10 ++#define ISPPRV_WBSEL_N1_2_SHIFT 12 ++#define ISPPRV_WBSEL_N1_3_SHIFT 14 ++#define ISPPRV_WBSEL_N2_0_SHIFT 16 ++#define ISPPRV_WBSEL_N2_1_SHIFT 18 ++#define ISPPRV_WBSEL_N2_2_SHIFT 20 ++#define ISPPRV_WBSEL_N2_3_SHIFT 22 ++#define ISPPRV_WBSEL_N3_0_SHIFT 24 ++#define ISPPRV_WBSEL_N3_1_SHIFT 26 ++#define ISPPRV_WBSEL_N3_2_SHIFT 28 ++#define ISPPRV_WBSEL_N3_3_SHIFT 30 ++ ++#define ISPPRV_CFA_GRADTH_HOR_SHIFT 0 ++#define ISPPRV_CFA_GRADTH_VER_SHIFT 8 ++ ++#define ISPPRV_BLKADJOFF_B_SHIFT 0 ++#define ISPPRV_BLKADJOFF_G_SHIFT 8 ++#define ISPPRV_BLKADJOFF_R_SHIFT 16 ++ ++#define ISPPRV_RGB_MAT1_MTX_RR_SHIFT 0 ++#define ISPPRV_RGB_MAT1_MTX_GR_SHIFT 16 ++ ++#define ISPPRV_RGB_MAT2_MTX_BR_SHIFT 0 ++#define ISPPRV_RGB_MAT2_MTX_RG_SHIFT 16 ++ ++#define ISPPRV_RGB_MAT3_MTX_GG_SHIFT 0 ++#define ISPPRV_RGB_MAT3_MTX_BG_SHIFT 16 ++ ++#define ISPPRV_RGB_MAT4_MTX_RB_SHIFT 0 ++#define ISPPRV_RGB_MAT4_MTX_GB_SHIFT 16 ++ ++#define ISPPRV_RGB_MAT5_MTX_BB_SHIFT 0 ++ ++#define ISPPRV_RGB_OFF1_MTX_OFFG_SHIFT 0 ++#define ISPPRV_RGB_OFF1_MTX_OFFR_SHIFT 16 ++ ++#define ISPPRV_RGB_OFF2_MTX_OFFB_SHIFT 0 ++ ++#define ISPPRV_CSC0_RY_SHIFT 0 ++#define ISPPRV_CSC0_GY_SHIFT 10 ++#define ISPPRV_CSC0_BY_SHIFT 20 ++ ++#define ISPPRV_CSC1_RCB_SHIFT 0 ++#define ISPPRV_CSC1_GCB_SHIFT 10 ++#define ISPPRV_CSC1_BCB_SHIFT 20 ++ ++#define ISPPRV_CSC2_RCR_SHIFT 0 ++#define ISPPRV_CSC2_GCR_SHIFT 10 ++#define ISPPRV_CSC2_BCR_SHIFT 20 ++ ++#define ISPPRV_CSC_OFFSET_CR_SHIFT 0 ++#define ISPPRV_CSC_OFFSET_CB_SHIFT 8 ++#define ISPPRV_CSC_OFFSET_Y_SHIFT 16 ++ ++#define ISPPRV_CNT_BRT_BRT_SHIFT 0 ++#define ISPPRV_CNT_BRT_CNT_SHIFT 8 ++ ++#define ISPPRV_CONTRAST_MAX 0x10 ++#define ISPPRV_CONTRAST_MIN 0xFF ++#define ISPPRV_BRIGHT_MIN 0x00 ++#define ISPPRV_BRIGHT_MAX 0xFF ++ ++ ++#define ISPPRV_CSUP_CSUPG_SHIFT 0 ++#define ISPPRV_CSUP_THRES_SHIFT 8 ++#define ISPPRV_CSUP_HPYF_SHIFT 16 ++ ++#define ISPPRV_SETUP_YC_MINC_SHIFT 0 ++#define ISPPRV_SETUP_YC_MAXC_SHIFT 8 ++#define ISPPRV_SETUP_YC_MINY_SHIFT 16 ++#define ISPPRV_SETUP_YC_MAXY_SHIFT 24 ++#define ISPPRV_YC_MAX 0xFF ++#define ISPPRV_YC_MIN 0x0 ++ ++ ++ ++ ++/* Define bit fields within selected registers */ ++ ++#define ISP_REVISION_SHIFT 0 ++ ++#define ISP_SYSCONFIG_AUTOIDLE 0 ++#define ISP_SYSCONFIG_SOFTRESET (1<<1) ++#define ISP_SYSCONFIG_MIdleMode_SHIFT 12 ++#define ISP_SYSCONFIG_MIdleMode_ForceStandBy 0x0 ++#define ISP_SYSCONFIG_MIdleMode_NoStandBy 0x1 ++#define ISP_SYSCONFIG_MIdleMode_SmartStandBy 0x2 ++ ++#define ISP_SYSSTATUS_ResetDone 0 ++ ++#define IRQ0ENABLE_CSIA_IRQ 1 ++#define IRQ0ENABLE_CSIA_LC1_IRQ (1<<1) ++#define IRQ0ENABLE_CSIA_LC2_IRQ (1<<2) ++#define IRQ0ENABLE_CSIA_LC3_IRQ (1<<3) ++#define IRQ0ENABLE_CSIB_IRQ (1<<4) ++#define IRQ0ENABLE_CSIB_LC1_IRQ (1<<5) ++#define IRQ0ENABLE_CSIB_LC2_IRQ (1<<6) ++#define IRQ0ENABLE_CSIB_LC3_IRQ (1<<7) ++#define IRQ0ENABLE_CCDC_VD0_IRQ (1<<8) ++#define IRQ0ENABLE_CCDC_VD1_IRQ (1<<9) ++#define IRQ0ENABLE_CCDC_VD2_IRQ (1<<10) ++#define IRQ0ENABLE_CCDC_ERR_IRQ (1<<11) ++#define IRQ0ENABLE_H3A_AF_DONE_IRQ (1<<12) ++#define IRQ0ENABLE_H3A_AWB_DONE_IRQ (1<<13) ++#define IRQ0ENABLE_HIST_DONE_IRQ (1<<16) ++#define IRQ0ENABLE_CCDC_LSC_DONE_IRQ (1<<17) ++#define IRQ0ENABLE_CCDC_LSC_PREF_COMP_IRQ (1<<18) ++#define IRQ0ENABLE_CCDC_LSC_PREF_ERR_IRQ (1<<19) ++#define IRQ0ENABLE_PRV_DONE_IRQ (1<<20) ++#define IRQ0ENABLE_RSZ_DONE_IRQ (1<<24) ++#define IRQ0ENABLE_OVF_IRQ (1<<25) ++#define IRQ0ENABLE_PING_IRQ (1<<26) ++#define IRQ0ENABLE_PONG_IRQ (1<<27) ++#define IRQ0ENABLE_MMU_ERR_IRQ (1<<28) ++#define IRQ0ENABLE_OCP_ERR_IRQ (1<<29) ++#define IRQ0ENABLE_SEC_ERR_IRQ (1<<30) ++#define IRQ0ENABLE_HS_VS_IRQ (1<<31) ++ ++#define IRQ0STATUS_CSIA_IRQ 1 ++#define IRQ0STATUS_CSIA_LC1_IRQ (1<<1) ++#define IRQ0STATUS_CSIA_LC2_IRQ (1<<2) ++#define IRQ0STATUS_CSIA_LC3_IRQ (1<<3) ++#define IRQ0STATUS_CSIB_IRQ (1<<4) ++#define IRQ0STATUS_CSIB_LC1_IRQ (1<<5) ++#define IRQ0STATUS_CSIB_LC2_IRQ (1<<6) ++#define IRQ0STATUS_CSIB_LC3_IRQ (1<<7) ++#define IRQ0STATUS_CCDC_VD0_IRQ (1<<8) ++#define IRQ0STATUS_CCDC_VD1_IRQ (1<<9) ++#define IRQ0STATUS_CCDC_VD2_IRQ (1<<10) ++#define IRQ0STATUS_CCDC_ERR_IRQ (1<<11) ++#define IRQ0STATUS_H3A_AF_DONE_IRQ (1<<12) ++#define IRQ0STATUS_H3A_AWB_DONE_IRQ (1<<13) ++#define IRQ0STATUS_HIST_DONE_IRQ (1<<16) ++#define IRQ0STATUS_PRV_DONE_IRQ (1<<20) ++#define IRQ0STATUS_RSZ_DONE_IRQ (1<<24) ++#define IRQ0STATUS_OVF_IRQ (1<<25) ++#define IRQ0STATUS_PING_IRQ (1<<26) ++#define IRQ0STATUS_PONG_IRQ (1<<27) ++#define IRQ0STATUS_MMU_ERR_IRQ (1<<28) ++#define IRQ0STATUS_OCP_ERR_IRQ (1<<29) ++#define IRQ0STATUS_SEC_ERR_IRQ (1<<30) ++#define IRQ0STATUS_HS_VS_IRQ (1<<31) ++ ++#define TCTRL_GRESET_LEN 0 ++ ++#define TCTRL_PSTRB_REPLAY_DELAY 0 ++#define TCTRL_PSTRB_REPLAY_COUNTER_SHIFT 25 ++ ++#define ISPCTRL_PAR_SER_CLK_SEL_parallel 0x0 ++#define ISPCTRL_PAR_SER_CLK_SEL_CSIA 0x1 ++#define ISPCTRL_PAR_SER_CLK_SEL_CSIB 0x2 ++#define ISPCTRL_PAR_SER_CLK_SEL_MASK 0xFFFFFFFC ++ ++#define ISPCTRL_PAR_BRIDGE_SHIFT 2 ++#define ISPCTRL_PAR_BRIDGE_DISABLE (0x0 << 2) ++#define ISPCTRL_PAR_BRIDGE_LENDIAN (0x2 << 2) ++#define ISPCTRL_PAR_BRIDGE_BENDIAN (0x3 << 2) ++ ++#define ISPCTRL_PAR_CLK_POL_SHIFT 4 ++#define ISPCTRL_PAR_CLK_POL_INV (1 << 4) ++#define ISPCTRL_PING_PONG_EN (1 << 5) ++#define ISPCTRL_SHIFT_SHIFT 6 ++#define ISPCTRL_SHIFT_0 (0x0 << 6) ++#define ISPCTRL_SHIFT_2 (0x1 << 6) ++#define ISPCTRL_SHIFT_4 (0x2 << 6) ++#define ISPCTRL_SHIFT_MASK (~(0x3 << 6)) ++ ++#define ISPCTRL_CCDC_CLK_EN (1 << 8) ++#define ISPCTRL_SCMP_CLK_EN (1 << 9) ++#define ISPCTRL_H3A_CLK_EN (1 << 10) ++#define ISPCTRL_HIST_CLK_EN (1 << 11) ++#define ISPCTRL_PREV_CLK_EN (1 << 12) ++#define ISPCTRL_RSZ_CLK_EN (1 << 13) ++#define ISPCTRL_SYNC_DETECT_SHIFT 14 ++#define ISPCTRL_SYNC_DETECT_HSFALL 0x0 ++#define ISPCTRL_SYNC_DETECT_HSRISE 0x1 ++#define ISPCTRL_SYNC_DETECT_VSFALL 0x2 ++#define ISPCTRL_SYNC_DETECT_VSRISE 0x3 ++ ++#define ISPCTRL_CCDC_RAM_EN (1 << 16) ++#define ISPCTRL_PREV_RAM_EN (1 << 17) ++#define ISPCTRL_SBL_RD_RAM_EN (1 << 18) ++#define ISPCTRL_SBL_WR1_RAM_EN (1 << 19) ++#define ISPCTRL_SBL_WR0_RAM_EN (1 << 20) ++#define ISPCTRL_SBL_AutoIdle (1 << 21) ++#define ISPCTRL_SBL_SHARED_RPORTB (1 << 28) ++#define ISPCTRL_JPEG_FLUSH (1 << 30) ++#define ISPCTRL_CCDC_FLUSH (1 << 31) ++ ++#define ISPSECURE_SecureMode 0 ++ ++#define ISPTCTRL_CTRL_DIVA_SHIFT 0 ++#define ISPTCTRL_CTRL_DIVA_MASK (0x1F << ISPTCTRL_CTRL_DIVA_SHIFT) ++#define ISPTCTRL_CTRL_DIVA_Low 0x0 ++#define ISPTCTRL_CTRL_DIVA_High 0x1 ++#define ISPTCTRL_CTRL_DIVA_Bypass 0x1F ++ ++#define ISPTCTRL_CTRL_DIVB_SHIFT 5 ++#define ISPTCTRL_CTRL_DIVB_MASK (0x1F << ISPTCTRL_CTRL_DIVB_SHIFT) ++#define ISPTCTRL_CTRL_DIVB_Low (0x0 << 5) ++#define ISPTCTRL_CTRL_DIVB_High (0x1 << 5) ++#define ISPTCTRL_CTRL_DIVB_Bypass (0x1F << 5) ++ ++#define ISPTCTRL_CTRL_DIVC_SHIFT 10 ++#define ISPTCTRL_CTRL_DIVC_NoClock (0x0 << 10) ++ ++#define ISPTCTRL_CTRL_SHUTEN (1 << 21) ++#define ISPTCTRL_CTRL_PSTRBEN (1 << 22) ++#define ISPTCTRL_CTRL_STRBEN (1 << 23) ++#define ISPTCTRL_CTRL_SHUTPOL (1 << 24) ++#define ISPTCTRL_CTRL_STRBPSTRBPOL (1 << 26) ++ ++#define ISPTCTRL_CTRL_INSEL_SHIFT 27 ++#define ISPTCTRL_CTRL_INSEL_Parallel (0x0 << 27) ++#define ISPTCTRL_CTRL_INSEL_CSIA (0x1 << 27) ++#define ISPTCTRL_CTRL_INSEL_CSIB (0x2 << 27) ++ ++#define ISPTCTRL_CTRL_GRESETEn (1 << 29) ++#define ISPTCTRL_CTRL_GRESETPOL (1 << 30) ++#define ISPTCTRL_CTRL_GRESETDIR (1 << 31) ++ ++#define ISPTCTRL_FRAME_SHUT_SHIFT 0 ++#define ISPTCTRL_FRAME_PSTRB_SHIFT 6 ++#define ISPTCTRL_FRAME_STRB_SHIFT 12 ++ ++#define ISPCCDC_PID_PREV_SHIFT 0 ++#define ISPCCDC_PID_CID_SHIFT 8 ++#define ISPCCDC_PID_TID_SHIFT 16 ++ ++#define ISPCCDC_PCR_EN 1 ++#define ISPCCDC_PCR_BUSY (1 << 1) ++ ++#define ISPCCDC_SYN_MODE_VDHDOUT 0x1 ++#define ISPCCDC_SYN_MODE_FLDOUT (1 << 1) ++#define ISPCCDC_SYN_MODE_VDPOL (1 << 2) ++#define ISPCCDC_SYN_MODE_HDPOL (1 << 3) ++#define ISPCCDC_SYN_MODE_FLDPOL (1 << 4) ++#define ISPCCDC_SYN_MODE_EXWEN (1 << 5) ++#define ISPCCDC_SYN_MODE_DATAPOL (1 << 6) ++#define ISPCCDC_SYN_MODE_FLDMODE (1 << 7) ++#define ISPCCDC_SYN_MODE_DATSIZ_MASK 0xFFFFF8FF ++#define ISPCCDC_SYN_MODE_DATSIZ_8_16 (0x0 << 8) ++#define ISPCCDC_SYN_MODE_DATSIZ_12 (0x4 << 8) ++#define ISPCCDC_SYN_MODE_DATSIZ_11 (0x5 << 8) ++#define ISPCCDC_SYN_MODE_DATSIZ_10 (0x6 << 8) ++#define ISPCCDC_SYN_MODE_DATSIZ_8 (0x7 << 8) ++#define ISPCCDC_SYN_MODE_PACK8 (1 << 11) ++#define ISPCCDC_SYN_MODE_INPMOD_MASK 0xFFFFCFFF ++#define ISPCCDC_SYN_MODE_INPMOD_RAW (0 << 12) ++#define ISPCCDC_SYN_MODE_INPMOD_YCBCR16 (1 << 12) ++#define ISPCCDC_SYN_MODE_INPMOD_YCBCR8 (2 << 12) ++#define ISPCCDC_SYN_MODE_LPF (1 << 14) ++#define ISPCCDC_SYN_MODE_FLDSTAT (1 << 15) ++#define ISPCCDC_SYN_MODE_VDHDEN (1 << 16) ++#define ISPCCDC_SYN_MODE_WEN (1 << 17) ++#define ISPCCDC_SYN_MODE_VP2SDR (1 << 18) ++#define ISPCCDC_SYN_MODE_SDR2RSZ (1 << 19) ++ ++#define ISPCCDC_HD_VD_WID_VDW_SHIFT 0 ++#define ISPCCDC_HD_VD_WID_HDW_SHIFT 16 ++ ++#define ISPCCDC_PIX_LINES_HLPRF_SHIFT 0 ++#define ISPCCDC_PIX_LINES_PPLN_SHIFT 16 ++ ++#define ISPCCDC_HORZ_INFO_NPH_SHIFT 0 ++#define ISPCCDC_HORZ_INFO_NPH_MASK 0xFFFF8000 ++#define ISPCCDC_HORZ_INFO_SPH_MASK 0x1000FFFF ++#define ISPCCDC_HORZ_INFO_SPH_SHIFT 16 ++ ++#define ISPCCDC_VERT_START_SLV0_SHIFT 16 ++#define ISPCCDC_VERT_START_SLV0_MASK 0x1000FFFF ++#define ISPCCDC_VERT_START_SLV1_SHIFT 0 ++ ++#define ISPCCDC_VERT_LINES_NLV_MASK 0xFFFF8000 ++#define ISPCCDC_VERT_LINES_NLV_SHIFT 0 ++ ++#define ISPCCDC_CULLING_CULV_SHIFT 0 ++#define ISPCCDC_CULLING_CULHODD_SHIFT 16 ++#define ISPCCDC_CULLING_CULHEVN_SHIFT 24 ++ ++#define ISPCCDC_HSIZE_OFF_SHIFT 0 ++ ++#define ISPCCDC_SDOFST_FINV (1 << 14) ++#define ISPCCDC_SDOFST_FOFST_1L (~(3 << 12)) ++#define ISPCCDC_SDOFST_FOFST_4L (3 << 12) ++#define ISPCCDC_SDOFST_LOFST3_SHIFT 0 ++#define ISPCCDC_SDOFST_LOFST2_SHIFT 3 ++#define ISPCCDC_SDOFST_LOFST1_SHIFT 6 ++#define ISPCCDC_SDOFST_LOFST0_SHIFT 9 ++#define EVENEVEN 1 ++#define ODDEVEN 2 ++#define EVENODD 3 ++#define ODDODD 4 ++ ++#define ISPCCDC_CLAMP_OBGAIN_SHIFT 0 ++#define ISPCCDC_CLAMP_OBST_SHIFT 10 ++#define ISPCCDC_CLAMP_OBSLN_SHIFT 25 ++#define ISPCCDC_CLAMP_OBSLEN_SHIFT 28 ++#define ISPCCDC_CLAMP_CLAMPEN (1 << 31) ++ ++#define ISPCCDC_COLPTN_R_Ye 0x0 ++#define ISPCCDC_COLPTN_Gr_Cy 0x1 ++#define ISPCCDC_COLPTN_Gb_G 0x2 ++#define ISPCCDC_COLPTN_B_Mg 0x3 ++#define ISPCCDC_COLPTN_CP0PLC0_SHIFT 0 ++#define ISPCCDC_COLPTN_CP0PLC1_SHIFT 2 ++#define ISPCCDC_COLPTN_CP0PLC2_SHIFT 4 ++#define ISPCCDC_COLPTN_CP0PLC3_SHIFT 6 ++#define ISPCCDC_COLPTN_CP1PLC0_SHIFT 8 ++#define ISPCCDC_COLPTN_CP1PLC1_SHIFT 10 ++#define ISPCCDC_COLPTN_CP1PLC2_SHIFT 12 ++#define ISPCCDC_COLPTN_CP1PLC3_SHIFT 14 ++#define ISPCCDC_COLPTN_CP2PLC0_SHIFT 16 ++#define ISPCCDC_COLPTN_CP2PLC1_SHIFT 18 ++#define ISPCCDC_COLPTN_CP2PLC2_SHIFT 20 ++#define ISPCCDC_COLPTN_CP2PLC3_SHIFT 22 ++#define ISPCCDC_COLPTN_CP3PLC0_SHIFT 24 ++#define ISPCCDC_COLPTN_CP3PLC1_SHIFT 26 ++#define ISPCCDC_COLPTN_CP3PLC2_SHIFT 28 ++#define ISPCCDC_COLPTN_CP3PLC3_SHIFT 30 ++ ++#define ISPCCDC_BLKCMP_B_MG_SHIFT 0 ++#define ISPCCDC_BLKCMP_GB_G_SHIFT 8 ++#define ISPCCDC_BLKCMP_GR_CY_SHIFT 6 ++#define ISPCCDC_BLKCMP_R_YE_SHIFT 24 ++ ++#define ISPCCDC_FPC_FPNUM_SHIFT 0 ++#define ISPCCDC_FPC_FPCEN (1 << 15) ++#define ISPCCDC_FPC_FPERR (1 << 16) ++ ++#define ISPCCDC_VDINT_1_SHIFT 0 ++#define ISPCCDC_VDINT_0_SHIFT 16 ++#define ISPCCDC_VDINT_0_MASK 0x7FFF ++#define ISPCCDC_VDINT_1_MASK 0x7FFF ++ ++#define ISPCCDC_ALAW_GWDI_SHIFT 0 ++#define ISPCCDC_ALAW_CCDTBL (1 << 3) ++ ++#define ISPCCDC_REC656IF_R656ON 1 ++#define ISPCCDC_REC656IF_ECCFVH (1 << 1) ++ ++#define ISPCCDC_CFG_BW656 (1 << 5) ++#define ISPCCDC_CFG_FIDMD_SHIFT 6 ++#define ISPCCDC_CFG_WENLOG (1 << 8) ++#define ISPCCDC_CFG_Y8POS (1 << 11) ++#define ISPCCDC_CFG_BSWD (1 << 12) ++#define ISPCCDC_CFG_MSBINVI (1 << 13) ++#define ISPCCDC_CFG_VDLC (1 << 15) ++ ++#define ISPCCDC_FMTCFG_FMTEN 0x1 ++#define ISPCCDC_FMTCFG_LNALT (1 << 1) ++#define ISPCCDC_FMTCFG_LNUM_SHIFT 2 ++#define ISPCCDC_FMTCFG_PLEN_ODD_SHIFT 4 ++#define ISPCCDC_FMTCFG_PLEN_EVEN_SHIFT 8 ++#define ISPCCDC_FMTCFG_VPIN_MASK 0xFFFF8000 ++#define ISPCCDC_FMTCFG_VPIN_12_3 (0x3 << 12) ++#define ISPCCDC_FMTCFG_VPIN_11_2 (0x4 << 12) ++#define ISPCCDC_FMTCFG_VPIN_10_1 (0x5 << 12) ++#define ISPCCDC_FMTCFG_VPIN_9_0 (0x6 << 12) ++#define ISPCCDC_FMTCFG_VPEN (1 << 15) ++ ++#define ISPCCDC_FMTCF_VPIF_FRQ_MASK 0xFFF8FFFF ++#define ISPCCDC_FMTCF_VPIF_FRQ_BY2 (0x0 << 16) ++#define ISPCCDC_FMTCF_VPIF_FRQ_BY3 (0x1 << 16) ++#define ISPCCDC_FMTCF_VPIF_FRQ_BY4 (0x2 << 16) ++#define ISPCCDC_FMTCF_VPIF_FRQ_BY5 (0x3 << 16) ++#define ISPCCDC_FMTCF_VPIF_FRQ_BY6 (0x4 << 16) ++ ++#define ISPCCDC_FMT_HORZ_FMTLNH_SHIFT 0 ++#define ISPCCDC_FMT_HORZ_FMTSPH_SHIFT 16 ++ ++#define ISPCCDC_FMT_VERT_FMTLNV_SHIFT 0 ++#define ISPCCDC_FMT_VERT_FMTSLV_SHIFT 16 ++ ++#define ISPCCDC_FMT_HORZ_FMTSPH_MASK 0x1FFF0000 ++#define ISPCCDC_FMT_HORZ_FMTLNH_MASK 0x1FFF ++ ++#define ISPCCDC_FMT_VERT_FMTSLV_MASK 0x1FFF0000 ++#define ISPCCDC_FMT_VERT_FMTLNV_MASK 0x1FFF ++ ++ ++#define ISPCCDC_VP_OUT_HORZ_ST_SHIFT 0 ++#define ISPCCDC_VP_OUT_HORZ_NUM_SHIFT 4 ++#define ISPCCDC_VP_OUT_VERT_NUM_SHIFT 17 ++ ++#define ISPRSZ_PID_PREV_SHIFT 0 ++#define ISPRSZ_PID_CID_SHIFT 8 ++#define ISPRSZ_PID_TID_SHIFT 16 ++ ++ ++#define ISPRSZ_PCR_ENABLE 0x5 ++#define ISPRSZ_PCR_BUSY (1 << 1) ++ ++#define ISPRSZ_CNT_HRSZ_SHIFT 0 ++#define ISPRSZ_CNT_HRSZ_MASK 0x3FF ++#define ISPRSZ_CNT_VRSZ_SHIFT 10 ++#define ISPRSZ_CNT_VRSZ_MASK 0xFFC00 ++#define ISPRSZ_CNT_HSTPH_SHIFT 20 ++#define ISPRSZ_CNT_HSTPH_MASK 0x700000 ++#define ISPRSZ_CNT_VSTPH_SHIFT 23 ++#define ISPRSZ_CNT_VSTPH_MASK 0x3800000 ++#define ISPRSZ_CNT_CBILIN_MASK 0x20000000 ++#define ISPRSZ_CNT_INPTYP_MASK 0x08000000 ++#define ISPRSZ_CNT_PIXFMT_MASK 0x04000000 ++#define ISPRSZ_CNT_YCPOS (1 << 26) ++#define ISPRSZ_CNT_INPTYP (1 << 27) ++#define ISPRSZ_CNT_INPSRC (1 << 28) ++#define ISPRSZ_CNT_CBILIN (1 << 29) ++ ++#define ISPRSZ_OUT_SIZE_HORZ_SHIFT 0 ++#define ISPRSZ_OUT_SIZE_HORZ_MASK 0x7FF ++#define ISPRSZ_OUT_SIZE_VERT_SHIFT 16 ++#define ISPRSZ_OUT_SIZE_VERT_MASK 0x7FF0000 ++ ++ ++#define ISPRSZ_IN_START_HORZ_ST_SHIFT 0 ++#define ISPRSZ_IN_START_HORZ_ST_MASK 0x1FFF ++#define ISPRSZ_IN_START_VERT_ST_SHIFT 16 ++#define ISPRSZ_IN_START_VERT_ST_MASK 0x1FFF0000 ++ ++ ++#define ISPRSZ_IN_SIZE_HORZ_SHIFT 0 ++#define ISPRSZ_IN_SIZE_HORZ_MASK 0x1FFF ++#define ISPRSZ_IN_SIZE_VERT_SHIFT 16 ++#define ISPRSZ_IN_SIZE_VERT_MASK 0x1FFF0000 ++ ++#define ISPRSZ_SDR_INADD_ADDR_SHIFT 0 ++#define ISPRSZ_SDR_INADD_ADDR_MASK 0xFFFFFFFF ++ ++#define ISPRSZ_SDR_INOFF_OFFSET_SHIFT 0 ++#define ISPRSZ_SDR_INOFF_OFFSET_MASK 0xFFFF ++ ++#define ISPRSZ_SDR_OUTADD_ADDR_SHIFT 0 ++#define ISPRSZ_SDR_OUTADD_ADDR_MASK 0xFFFFFFFF ++ ++ ++#define ISPRSZ_SDR_OUTOFF_OFFSET_SHIFT 0 ++#define ISPRSZ_SDR_OUTOFF_OFFSET_MASK 0xFFFF ++ ++#define ISPRSZ_HFILT10_COEF0_SHIFT 0 ++#define ISPRSZ_HFILT10_COEF0_MASK 0x3FF ++#define ISPRSZ_HFILT10_COEF1_SHIFT 16 ++#define ISPRSZ_HFILT10_COEF1_MASK 0x3FF0000 ++ ++#define ISPRSZ_HFILT32_COEF2_SHIFT 0 ++#define ISPRSZ_HFILT32_COEF2_MASK 0x3FF ++#define ISPRSZ_HFILT32_COEF3_SHIFT 16 ++#define ISPRSZ_HFILT32_COEF3_MASK 0x3FF0000 ++ ++#define ISPRSZ_HFILT54_COEF4_SHIFT 0 ++#define ISPRSZ_HFILT54_COEF4_MASK 0x3FF ++#define ISPRSZ_HFILT54_COEF5_SHIFT 16 ++#define ISPRSZ_HFILT54_COEF5_MASK 0x3FF0000 ++ ++#define ISPRSZ_HFILT76_COEFF6_SHIFT 0 ++#define ISPRSZ_HFILT76_COEFF6_MASK 0x3FF ++#define ISPRSZ_HFILT76_COEFF7_SHIFT 16 ++#define ISPRSZ_HFILT76_COEFF7_MASK 0x3FF0000 ++ ++#define ISPRSZ_HFILT98_COEFF8_SHIFT 0 ++#define ISPRSZ_HFILT98_COEFF8_MASK 0x3FF ++#define ISPRSZ_HFILT98_COEFF9_SHIFT 16 ++#define ISPRSZ_HFILT98_COEFF9_MASK 0x3FF0000 ++ ++#define ISPRSZ_HFILT1110_COEF10_SHIFT 0 ++#define ISPRSZ_HFILT1110_COEF10_MASK 0x3FF ++#define ISPRSZ_HFILT1110_COEF11_SHIFT 16 ++#define ISPRSZ_HFILT1110_COEF11_MASK 0x3FF0000 ++ ++#define ISPRSZ_HFILT1312_COEFF12_SHIFT 0 ++#define ISPRSZ_HFILT1312_COEFF12_MASK 0x3FF ++#define ISPRSZ_HFILT1312_COEFF13_SHIFT 16 ++#define ISPRSZ_HFILT1312_COEFF13_MASK 0x3FF0000 ++ ++#define ISPRSZ_HFILT1514_COEFF14_SHIFT 0 ++#define ISPRSZ_HFILT1514_COEFF14_MASK 0x3FF ++#define ISPRSZ_HFILT1514_COEFF15_SHIFT 16 ++#define ISPRSZ_HFILT1514_COEFF15_MASK 0x3FF0000 ++ ++#define ISPRSZ_HFILT1716_COEF16_SHIFT 0 ++#define ISPRSZ_HFILT1716_COEF16_MASK 0x3FF ++#define ISPRSZ_HFILT1716_COEF17_SHIFT 16 ++#define ISPRSZ_HFILT1716_COEF17_MASK 0x3FF0000 ++ ++#define ISPRSZ_HFILT1918_COEF18_SHIFT 0 ++#define ISPRSZ_HFILT1918_COEF18_MASK 0x3FF ++#define ISPRSZ_HFILT1918_COEF19_SHIFT 16 ++#define ISPRSZ_HFILT1918_COEF19_MASK 0x3FF0000 ++ ++#define ISPRSZ_HFILT2120_COEF20_SHIFT 0 ++#define ISPRSZ_HFILT2120_COEF20_MASK 0x3FF ++#define ISPRSZ_HFILT2120_COEF21_SHIFT 16 ++#define ISPRSZ_HFILT2120_COEF21_MASK 0x3FF0000 ++ ++#define ISPRSZ_HFILT2322_COEF22_SHIFT 0 ++#define ISPRSZ_HFILT2322_COEF22_MASK 0x3FF ++#define ISPRSZ_HFILT2322_COEF23_SHIFT 16 ++#define ISPRSZ_HFILT2322_COEF23_MASK 0x3FF0000 ++ ++#define ISPRSZ_HFILT2524_COEF24_SHIFT 0 ++#define ISPRSZ_HFILT2524_COEF24_MASK 0x3FF ++#define ISPRSZ_HFILT2524_COEF25_SHIFT 16 ++#define ISPRSZ_HFILT2524_COEF25_MASK 0x3FF0000 ++ ++#define ISPRSZ_HFILT2726_COEF26_SHIFT 0 ++#define ISPRSZ_HFILT2726_COEF26_MASK 0x3FF ++#define ISPRSZ_HFILT2726_COEF27_SHIFT 16 ++#define ISPRSZ_HFILT2726_COEF27_MASK 0x3FF0000 ++ ++ ++#define ISPRSZ_HFILT2928_COEF28_SHIFT 0 ++#define ISPRSZ_HFILT2928_COEF28_MASK 0x3FF ++#define ISPRSZ_HFILT2928_COEF29_SHIFT 16 ++#define ISPRSZ_HFILT2928_COEF29_MASK 0x3FF0000 ++ ++ ++#define ISPRSZ_HFILT3130_COEF30_SHIFT 0 ++#define ISPRSZ_HFILT3130_COEF30_MASK 0x3FF ++#define ISPRSZ_HFILT3130_COEF31_SHIFT 16 ++#define ISPRSZ_HFILT3130_COEF31_MASK 0x3FF0000 ++ ++ ++#define ISPRSZ_VFILT10_COEF0_SHIFT 0 ++#define ISPRSZ_VFILT10_COEF0_MASK 0x3FF ++#define ISPRSZ_VFILT10_COEF1_SHIFT 16 ++#define ISPRSZ_VFILT10_COEF1_MASK 0x3FF0000 ++ ++#define ISPRSZ_VFILT32_COEF2_SHIFT 0 ++#define ISPRSZ_VFILT32_COEF2_MASK 0x3FF ++#define ISPRSZ_VFILT32_COEF3_SHIFT 16 ++#define ISPRSZ_VFILT32_COEF3_MASK 0x3FF0000 ++ ++ ++#define ISPRSZ_VFILT54_COEF4_SHIFT 0 ++#define ISPRSZ_VFILT54_COEF4_MASK 0x3FF ++#define ISPRSZ_VFILT54_COEF5_SHIFT 16 ++#define ISPRSZ_VFILT54_COEF5_MASK 0x3FF0000 ++ ++#define ISPRSZ_VFILT76_COEFF6_SHIFT 0 ++#define ISPRSZ_VFILT76_COEFF6_MASK 0x3FF ++#define ISPRSZ_VFILT76_COEFF7_SHIFT 16 ++#define ISPRSZ_VFILT76_COEFF7_MASK 0x3FF0000 ++ ++#define ISPRSZ_VFILT98_COEFF8_SHIFT 0 ++#define ISPRSZ_VFILT98_COEFF8_MASK 0x3FF ++#define ISPRSZ_VFILT98_COEFF9_SHIFT 16 ++#define ISPRSZ_VFILT98_COEFF9_MASK 0x3FF0000 ++ ++#define ISPRSZ_VFILT1110_COEF10_SHIFT 0 ++#define ISPRSZ_VFILT1110_COEF10_MASK 0x3FF ++#define ISPRSZ_VFILT1110_COEF11_SHIFT 16 ++#define ISPRSZ_VFILT1110_COEF11_MASK 0x3FF0000 ++ ++#define ISPRSZ_VFILT1312_COEFF12_SHIFT 0 ++#define ISPRSZ_VFILT1312_COEFF12_MASK 0x3FF ++#define ISPRSZ_VFILT1312_COEFF13_SHIFT 16 ++#define ISPRSZ_VFILT1312_COEFF13_MASK 0x3FF0000 ++ ++#define ISPRSZ_VFILT1514_COEFF14_SHIFT 0 ++#define ISPRSZ_VFILT1514_COEFF14_MASK 0x3FF ++#define ISPRSZ_VFILT1514_COEFF15_SHIFT 16 ++#define ISPRSZ_VFILT1514_COEFF15_MASK 0x3FF0000 ++ ++#define ISPRSZ_VFILT1716_COEF16_SHIFT 0 ++#define ISPRSZ_VFILT1716_COEF16_MASK 0x3FF ++#define ISPRSZ_VFILT1716_COEF17_SHIFT 16 ++#define ISPRSZ_VFILT1716_COEF17_MASK 0x3FF0000 ++ ++#define ISPRSZ_VFILT1918_COEF18_SHIFT 0 ++#define ISPRSZ_VFILT1918_COEF18_MASK 0x3FF ++#define ISPRSZ_VFILT1918_COEF19_SHIFT 16 ++#define ISPRSZ_VFILT1918_COEF19_MASK 0x3FF0000 ++ ++#define ISPRSZ_VFILT2120_COEF20_SHIFT 0 ++#define ISPRSZ_VFILT2120_COEF20_MASK 0x3FF ++#define ISPRSZ_VFILT2120_COEF21_SHIFT 16 ++#define ISPRSZ_VFILT2120_COEF21_MASK 0x3FF0000 ++ ++#define ISPRSZ_VFILT2322_COEF22_SHIFT 0 ++#define ISPRSZ_VFILT2322_COEF22_MASK 0x3FF ++#define ISPRSZ_VFILT2322_COEF23_SHIFT 16 ++#define ISPRSZ_VFILT2322_COEF23_MASK 0x3FF0000 ++ ++#define ISPRSZ_VFILT2524_COEF24_SHIFT 0 ++#define ISPRSZ_VFILT2524_COEF24_MASK 0x3FF ++#define ISPRSZ_VFILT2524_COEF25_SHIFT 16 ++#define ISPRSZ_VFILT2524_COEF25_MASK 0x3FF0000 ++ ++#define ISPRSZ_VFILT2726_COEF26_SHIFT 0 ++#define ISPRSZ_VFILT2726_COEF26_MASK 0x3FF ++#define ISPRSZ_VFILT2726_COEF27_SHIFT 16 ++#define ISPRSZ_VFILT2726_COEF27_MASK 0x3FF0000 ++ ++#define ISPRSZ_VFILT2928_COEF28_SHIFT 0 ++#define ISPRSZ_VFILT2928_COEF28_MASK 0x3FF ++#define ISPRSZ_VFILT2928_COEF29_SHIFT 16 ++#define ISPRSZ_VFILT2928_COEF29_MASK 0x3FF0000 ++ ++#define ISPRSZ_VFILT3130_COEF30_SHIFT 0 ++#define ISPRSZ_VFILT3130_COEF30_MASK 0x3FF ++#define ISPRSZ_VFILT3130_COEF31_SHIFT 16 ++#define ISPRSZ_VFILT3130_COEF31_MASK 0x3FF0000 ++ ++#define ISPRSZ_YENH_CORE_SHIFT 0 ++#define ISPRSZ_YENH_CORE_MASK 0xFF ++#define ISPRSZ_YENH_SLOP_SHIFT 8 ++#define ISPRSZ_YENH_SLOP_MASK 0xF00 ++#define ISPRSZ_YENH_GAIN_SHIFT 12 ++#define ISPRSZ_YENH_GAIN_MASK 0xF000 ++#define ISPRSZ_YENH_ALGO_SHIFT 16 ++#define ISPRSZ_YENH_ALGO_MASK 0x30000 ++ ++#define ISPH3A_PCR_AEW_ALAW_EN_SHIFT 1 ++#define ISPH3A_PCR_AF_MED_TH_SHIFT 3 ++#define ISPH3A_PCR_AF_RGBPOS_SHIFT 11 ++#define ISPH3A_PCR_AEW_AVE2LMT_SHIFT 22 ++#define ISPH3A_PCR_AEW_AVE2LMT_MASK 0xFFC00000 ++ ++#define ISPH3A_AEWWIN1_WINHC_SHIFT 0 ++#define ISPH3A_AEWWIN1_WINHC_MASK 0x3F ++#define ISPH3A_AEWWIN1_WINVC_SHIFT 6 ++#define ISPH3A_AEWWIN1_WINVC_MASK 0x1FC0 ++#define ISPH3A_AEWWIN1_WINW_SHIFT 13 ++#define ISPH3A_AEWWIN1_WINW_MASK 0xFE000 ++#define ISPH3A_AEWWIN1_WINH_SHIFT 24 ++#define ISPH3A_AEWWIN1_WINH_MASK 0x7F000000 ++ ++#define ISPH3A_AEWINSTART_WINSH_SHIFT 0 ++#define ISPH3A_AEWINSTART_WINSH_MASK 0x0FFF ++#define ISPH3A_AEWINSTART_WINSV_SHIFT 16 ++#define ISPH3A_AEWINSTART_WINSV_MASK 0x0FFF0000 ++ ++#define ISPH3A_AEWINBLK_WINH_SHIFT 0 ++#define ISPH3A_AEWINBLK_WINH_MASK 0x7F ++#define ISPH3A_AEWINBLK_WINSV_SHIFT 16 ++#define ISPH3A_AEWINBLK_WINSV_MASK 0x0FFF0000 ++ ++#define ISPH3A_AEWSUBWIN_AEWINCH_SHIFT 0 ++#define ISPH3A_AEWSUBWIN_AEWINCH_MASK 0x0F ++#define ISPH3A_AEWSUBWIN_AEWINCV_SHIFT 8 ++#define ISPH3A_AEWSUBWIN_AEWINCV_MASK 0x0F00 ++ ++#define ISPHIST_PCR_ENABLE_SHIFT 0 ++#define ISPHIST_PCR_ENABLE_MASK 0x01 ++#define ISPHIST_PCR_BUSY_SHIFT 1 ++#define ISPHIST_PCR_BUSY_MASK 0x02 ++ ++#define ISPHIST_CNT_DATASIZE_SHIFT 8 ++#define ISPHIST_CNT_DATASIZE_MASK 0x0100 ++#define ISPHIST_CNT_CLEAR_SHIFT 7 ++#define ISPHIST_CNT_CLEAR_MASK 0x080 ++#define ISPHIST_CNT_CFA_SHIFT 6 ++#define ISPHIST_CNT_CFA_MASK 0x040 ++#define ISPHIST_CNT_BINS_SHIFT 4 ++#define ISPHIST_CNT_BINS_MASK 0x030 ++#define ISPHIST_CNT_SOURCE_SHIFT 3 ++#define ISPHIST_CNT_SOURCE_MASK 0x08 ++#define ISPHIST_CNT_SHIFT_SHIFT 0 ++#define ISPHIST_CNT_SHIFT_MASK 0x07 ++ ++#define ISPHIST_WB_GAIN_WG00_SHIFT 24 ++#define ISPHIST_WB_GAIN_WG00_MASK 0xFF000000 ++#define ISPHIST_WB_GAIN_WG01_SHIFT 16 ++#define ISPHIST_WB_GAIN_WG01_MASK 0xFF0000 ++#define ISPHIST_WB_GAIN_WG02_SHIFT 8 ++#define ISPHIST_WB_GAIN_WG02_MASK 0xFF00 ++#define ISPHIST_WB_GAIN_WG03_SHIFT 0 ++#define ISPHIST_WB_GAIN_WG03_MASK 0xFF ++ ++#define ISPHIST_REGHORIZ_HSTART_SHIFT 16 /*REGION 0 to 3 HORZ and VERT */ ++#define ISPHIST_REGHORIZ_HSTART_MASK 0x3FFF0000 ++#define ISPHIST_REGHORIZ_HEND_SHIFT 0 ++#define ISPHIST_REGHORIZ_HEND_MASK 0x3FFF ++#define ISPHIST_REGVERT_VSTART_SHIFT 16 ++#define ISPHIST_REGVERT_VSTART_MASK 0x3FFF0000 ++#define ISPHIST_REGVERT_VEND_SHIFT 0 ++#define ISPHIST_REGVERT_VEND_MASK 0x3FFF ++ ++#define ISPHIST_REGHORIZ_MASK 0x3FFF3FFF ++#define ISPHIST_REGVERT_MASK 0x3FFF3FFF ++ ++#define ISPHIST_ADDR_SHIFT 0 ++#define ISPHIST_ADDR_MASK 0x3FF ++ ++#define ISPHIST_DATA_SHIFT 0 ++#define ISPHIST_DATA_MASK 0xFFFFF ++ ++#define ISPHIST_RADD_SHIFT 0 ++#define ISPHIST_RADD_MASK 0xFFFFFFFF ++ ++#define ISPHIST_RADD_OFF_SHIFT 0 ++#define ISPHIST_RADD_OFF_MASK 0xFFFF ++ ++#define ISPHIST_HV_INFO_HSIZE_SHIFT 16 ++#define ISPHIST_HV_INFO_HSIZE_MASK 0x3FFF0000 ++#define ISPHIST_HV_INFO_VSIZE_SHIFT 0 ++#define ISPHIST_HV_INFO_VSIZE_MASK 0x3FFF ++ ++#define ISPHIST_HV_INFO_MASK 0x3FFF3FFF ++ ++ ++#define ISPCCDC_LSC_GAIN_MODE_N_MASK 0x700 ++#define ISPCCDC_LSC_GAIN_MODE_N_SHIFT 8 ++#define ISPCCDC_LSC_GAIN_MODE_M_MASK 0x3800 ++#define ISPCCDC_LSC_GAIN_MODE_M_SHIFT 12 ++#define ISPCCDC_LSC_GAIN_FORMAT_MASK 0xE ++#define ISPCCDC_LSC_GAIN_FORMAT_SHIFT 1 ++#define ISPCCDC_LSC_AFTER_REFORMATTER_MASK (1<<6) ++ ++ ++#define ISPCCDC_LSC_INITIAL_X_MASK 0x3F ++#define ISPCCDC_LSC_INITIAL_X_SHIFT 0 ++#define ISPCCDC_LSC_INITIAL_Y_MASK 0x3F0000 ++#define ISPCCDC_LSC_INITIAL_Y_SHIFT 16 ++ ++ ++#define ISPMMU_REVISION_REV_MINOR_MASK 0xF ++#define ISPMMU_REVISION_REV_MAJOR_SHIFT 0x4 ++ ++#define IRQENABLE_MULTIHITFAULT (1<<4) ++#define IRQENABLE_TWFAULT (1<<3) ++#define IRQENABLE_EMUMISS (1<<2) ++#define IRQENABLE_TRANSLNFAULT (1<<1) ++#define IRQENABLE_TLBMISS (1) ++ ++#define ISPMMU_MMUCNTL_MMU_EN (1<<1) ++#define ISPMMU_MMUCNTL_TWL_EN (1<<2) ++#define ISPMMU_MMUCNTL_EMUTLBUPDATE (1<<3) ++#define ISPMMU_AUTOIDLE 0x1 ++#define ISPMMU_SIdlemode_Forceidle 0 ++#define ISPMMU_SIdlemode_Noidle 1 ++#define ISPMMU_SIdlemode_Smartidle 2 ++#define ISPMMU_SIdlemode_Shift 3 ++ ++#define ISPCSI1_AUTOIDLE 0x1 ++#define ISPCSI1_MIdleMode_Shift 12 ++#define ISPCSI1_MIdleMode_ForceStandBy 0x0 ++#define ISPCSI1_MIdleMode_NoStandBy 0x1 ++#define ISPCSI1_MIdleMode_SmartStandBy 0x2 ++ ++#endif /* __ISPREG_H__ */ +Index: git/drivers/media/video/isp/ispresizer.c +=================================================================== +--- /dev/null 1970-01-01 00:00:00.000000000 +0000 ++++ git/drivers/media/video/isp/ispresizer.c 2009-02-12 11:44:14.000000000 -0600 +@@ -0,0 +1,854 @@ ++/* ++ * drivers/media/video/ispresizer.c ++ * ++ * Driver Library for Resizer module in TI's OMAP3430 Camera ISP ++ * ++ * Copyright (C)2008 Texas Instruments, Inc. ++ * ++ * This package 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 PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR ++ * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED ++ * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. ++ * ++ * Resizer module for ISP driver on OMAP3430. It implements ++ * the Resizer module APIs defined in ispresizer.h. ++ */ ++ ++#include <linux/errno.h> ++#include <linux/types.h> ++#include <linux/delay.h> ++#include <asm/io.h> ++#include <linux/module.h> ++ ++#include "isp.h" ++#include "ispreg.h" ++#include "ispresizer.h" ++ ++/* ++ * Resizer Constants ++ */ ++#define MAX_IN_WIDTH_MEMORY_MODE 4095 ++ ++#define MAX_IN_WIDTH_ONTHEFLY_MODE 1280 ++#define MAX_IN_WIDTH_ONTHEFLY_MODE_ES2 4095 ++#define MAX_IN_HEIGHT 4095 ++#define MINIMUM_RESIZE_VALUE 64 ++#define MAXIMUM_RESIZE_VALUE 1024 ++#define MID_RESIZE_VALUE 512 ++ ++#define MAX_7TAP_HRSZ_OUTWIDTH 1280 ++#define MAX_7TAP_VRSZ_OUTWIDTH 640 ++ ++#define MAX_7TAP_HRSZ_OUTWIDTH_ES2 3300 ++#define MAX_7TAP_VRSZ_OUTWIDTH_ES2 1650 ++ ++#define DEFAULTSTPIXEL 0 ++#define DEFAULTSTPHASE 1 ++#define DEFAULTHSTPIXEL4TAPMODE 3 ++#define FOURPHASE 4 ++#define EIGHTPHASE 8 ++#define RESIZECONSTANT 256 ++#define SHIFTER4TAPMODE 0 ++#define SHIFTER7TAPMODE 1 ++#define DEFAULTOFFSET 7 ++#define OFFSETVERT4TAPMODE 4 ++#define OPWDALIGNCONSTANT 0xFFFFFFF0 ++ ++/* Default configuration of resizer,filter coefficients,yenh for camera isp*/ ++static struct isprsz_yenh ispreszdefaultyenh = {0, 0, 0, 0}; ++static struct isprsz_coef ispreszdefcoef = { ++{ ++ 0x0000, 0x0100, 0x0000, 0x0000, ++ 0x03FA, 0x00F6, 0x0010, 0x0000, ++ 0x03F9, 0x00DB, 0x002C, 0x0000, ++ 0x03FB, 0x00B3, 0x0053, 0x03FF, ++ 0x03FD, 0x0082, 0x0084, 0x03FD, ++ 0x03FF, 0x0053, 0x00B3, 0x03FB, ++ 0x0000, 0x002C, 0x00DB, 0x03F9, ++ 0x0000, 0x0010, 0x00F6, 0x03FA ++ }, ++ { ++ 0x0000, 0x0100, 0x0000, 0x0000, ++ 0x03FA, 0x00F6, 0x0010, 0x0000, ++ 0x03F9, 0x00DB, 0x002C, 0x0000, ++ 0x03FB, 0x00B3, 0x0053, 0x03FF, ++ 0x03FD, 0x0082, 0x0084, 0x03FD, ++ 0x03FF, 0x0053, 0x00B3, 0x03FB, ++ 0x0000, 0x002C, 0x00DB, 0x03F9, ++ 0x0000, 0x0010, 0x00F6, 0x03FA ++ }, ++ { ++ 0x0004, 0x0023, 0x005A, 0x0058, ++ 0x0023, 0x0004, 0x0000, 0x0002, ++ 0x0018, 0x004d, 0x0060, 0x0031, ++ 0x0008, 0x0000, 0x0001, 0x000f, ++ 0x003f, 0x0062, 0x003f, 0x000f, ++ 0x0001, 0x0000, 0x0008, 0x0031, ++ 0x0060, 0x004d, 0x0018, 0x0002 ++ }, ++ { ++ 0x0004, 0x0023, 0x005A, 0x0058, ++ 0x0023, 0x0004, 0x0000, 0x0002, ++ 0x0018, 0x004d, 0x0060, 0x0031, ++ 0x0008, 0x0000, 0x0001, 0x000f, ++ 0x003f, 0x0062, 0x003f, 0x000f, ++ 0x0001, 0x0000, 0x0008, 0x0031, ++ 0x0060, 0x004d, 0x0018, 0x0002 ++ } ++ }; ++ ++/* ++ * Structure for the resizer module to store its own information. ++ */ ++static struct isp_res { ++ u8 res_inuse; ++ u8 h_startphase; ++ u8 v_startphase; ++ u16 h_resz; ++ u16 v_resz; ++ u32 outputwidth; ++ u32 outputheight; ++ u32 inputwidth; ++ u32 inputheight; ++ u8 algo; ++ u32 ipht_crop; ++ u32 ipwd_crop; ++ u32 cropwidth; ++ u32 cropheight; ++ enum ispresizer_input resinput; ++ struct isprsz_coef coeflist; ++ struct semaphore semlock; ++} ispres_obj; ++ ++/* Structure for saving/restoring resizer module registers*/ ++static struct isp_reg isprsz_reg_list[] = { ++ {ISPRSZ_CNT, 0x0000}, ++ {ISPRSZ_OUT_SIZE, 0x0000}, ++ {ISPRSZ_IN_START, 0x0000}, ++ {ISPRSZ_IN_SIZE, 0x0000}, ++ {ISPRSZ_SDR_INADD, 0x0000}, ++ {ISPRSZ_SDR_INOFF, 0x0000}, ++ {ISPRSZ_SDR_OUTADD, 0x0000}, ++ {ISPRSZ_SDR_OUTOFF, 0x0000}, ++ {ISPRSZ_HFILT10, 0x0000}, ++ {ISPRSZ_HFILT32, 0x0000}, ++ {ISPRSZ_HFILT54, 0x0000}, ++ {ISPRSZ_HFILT76, 0x0000}, ++ {ISPRSZ_HFILT98, 0x0000}, ++ {ISPRSZ_HFILT1110, 0x0000}, ++ {ISPRSZ_HFILT1312, 0x0000}, ++ {ISPRSZ_HFILT1514, 0x0000}, ++ {ISPRSZ_HFILT1716, 0x0000}, ++ {ISPRSZ_HFILT1918, 0x0000}, ++ {ISPRSZ_HFILT2120, 0x0000}, ++ {ISPRSZ_HFILT2322, 0x0000}, ++ {ISPRSZ_HFILT2524, 0x0000}, ++ {ISPRSZ_HFILT2726, 0x0000}, ++ {ISPRSZ_HFILT2928, 0x0000}, ++ {ISPRSZ_HFILT3130, 0x0000}, ++ {ISPRSZ_VFILT10, 0x0000}, ++ {ISPRSZ_VFILT32, 0x0000}, ++ {ISPRSZ_VFILT54, 0x0000}, ++ {ISPRSZ_VFILT76, 0x0000}, ++ {ISPRSZ_VFILT98, 0x0000}, ++ {ISPRSZ_VFILT1110, 0x0000}, ++ {ISPRSZ_VFILT1312, 0x0000}, ++ {ISPRSZ_VFILT1514, 0x0000}, ++ {ISPRSZ_VFILT1716, 0x0000}, ++ {ISPRSZ_VFILT1918, 0x0000}, ++ {ISPRSZ_VFILT2120, 0x0000}, ++ {ISPRSZ_VFILT2322, 0x0000}, ++ {ISPRSZ_VFILT2524, 0x0000}, ++ {ISPRSZ_VFILT2726, 0x0000}, ++ {ISPRSZ_VFILT2928, 0x0000}, ++ {ISPRSZ_VFILT3130, 0x0000}, ++ {ISPRSZ_YENH, 0x0000}, ++ {ISP_TOK_TERM, 0x0000} ++}; ++ ++void ispresizer_config_shadow_registers() ++{ ++ return; ++} ++EXPORT_SYMBOL(ispresizer_config_shadow_registers); ++ ++void ispresizer_trycrop(u32 left, u32 top, u32 width, u32 height, u32 ow, ++ u32 oh) ++{ ++ ispres_obj.cropwidth = width + 6; ++ ispres_obj.cropheight = height + 6; ++ ispresizer_try_size(&ispres_obj.cropwidth, &ispres_obj.cropheight, &ow, ++ &oh); ++ ispres_obj.ipht_crop = top; ++ ispres_obj.ipwd_crop = left; ++} ++EXPORT_SYMBOL(ispresizer_trycrop); ++ ++void ispresizer_applycrop() ++{ ++ ispresizer_config_size(ispres_obj.cropwidth, ispres_obj.cropheight, ++ ispres_obj.outputwidth, ++ ispres_obj.outputheight); ++ return; ++} ++ ++ ++/* ++ * Reserve the Resizer module. ++ * Only one user at a time. ++ */ ++int ispresizer_request() ++{ ++ down(&(ispres_obj.semlock)); ++ if (!(ispres_obj.res_inuse)) { ++ ispres_obj.res_inuse = 1; ++ up(&(ispres_obj.semlock)); ++ /* Turn on Resizer module Clocks.*/ ++ omap_writel(omap_readl(ISP_CTRL) | ISPCTRL_SBL_WR0_RAM_EN | ++ ISPCTRL_RSZ_CLK_EN, ISP_CTRL); ++ return 0; ++ } else { ++ up(&(ispres_obj.semlock)); ++ printk(KERN_ERR "ISP_ERR : Resizer Module Busy\n"); ++ return -EBUSY; ++ } ++} ++EXPORT_SYMBOL(ispresizer_request); ++ ++/* ++ * Makes Resizer module free. ++ */ ++int ispresizer_free() ++{ ++ down(&(ispres_obj.semlock)); ++ if (ispres_obj.res_inuse) { ++ ispres_obj.res_inuse = 0; ++ up(&(ispres_obj.semlock)); ++ omap_writel(omap_readl(ISP_CTRL) & ~(ISPCTRL_RSZ_CLK_EN | ++ ISPCTRL_SBL_WR0_RAM_EN), ISP_CTRL); ++ return 0; ++ } else { ++ up(&(ispres_obj.semlock)); ++ DPRINTK_ISPRESZ("ISP_ERR : Resizer Module already freed\n"); ++ return -EINVAL; ++ } ++} ++EXPORT_SYMBOL(ispresizer_free); ++ ++/* ++ * Sets up the default resizer configuration according to the arguments. ++ * input : Indicates the module that gives the image to resizer ++ */ ++int ++ispresizer_config_datapath(enum ispresizer_input input) ++{ ++ u32 cnt = 0; ++ DPRINTK_ISPRESZ("ispresizer_config_datapath()+\n"); ++ ispres_obj.resinput = input; ++ switch (input) { ++ case RSZ_OTFLY_YUV: ++ cnt &= ~ISPRSZ_CNT_INPTYP; ++ cnt &= ~ISPRSZ_CNT_INPSRC; ++ /* according to TRM, inline address and inline offset must be ++ * set to 0 for OTF input mode ++ */ ++ ispresizer_set_inaddr(0); ++ ispresizer_config_inlineoffset(0); ++ break; ++ case RSZ_MEM_YUV: ++ cnt |= ISPRSZ_CNT_INPSRC; ++ cnt &= ~ISPRSZ_CNT_INPTYP; ++ break; ++ case RSZ_MEM_COL8: ++ cnt |= ISPRSZ_CNT_INPSRC; ++ cnt |= ISPRSZ_CNT_INPTYP; ++ break; ++ default: ++ printk(KERN_ERR "ISP_ERR : Wrong Input\n"); ++ return -EINVAL; ++ } ++ omap_writel(omap_readl(ISPRSZ_CNT) | cnt, ISPRSZ_CNT); ++ /*Set up default parameters ++ */ ++ ispresizer_config_ycpos(0); ++ ispresizer_config_filter_coef(&ispreszdefcoef); ++ ispresizer_enable_cbilin(0); ++ ispresizer_config_luma_enhance(&ispreszdefaultyenh); ++ DPRINTK_ISPRESZ("ispresizer_config_datapath()-\n"); ++ return 0; ++} ++EXPORT_SYMBOL(ispresizer_config_datapath); ++ ++/* ++ * Calculates the horizontal and vertical resize ratio,number of pixels to ++ * be cropped in the resizer module and checks the validity of various ++ * parameters.This function internally calls trysize_calculation,which does ++ * the actual calculations and populates required members of isp_res struct ++ * Formula used for calculation is:- ++ * 8-phase 4-tap mode :- ++ * inputwidth = (32*sph + (ow - 1)*hrsz + 16) >> 8 + 7 ++ * inputheight = (32*spv + (oh - 1)*vrsz + 16) >> 8 + 4 ++ * endpahse for width = ( ( 32*sph + (ow - 1)*hrsz +16 ) >> 5 )% 8 ++ * endphase for height = ( ( 32*sph + (oh - 1)*hrsz +16 ) >> 5 )% 8 ++ * 4-phase 7-tap mode :- ++ * inputwidth = (64*sph + (ow - 1)*hrsz + 32) >> 8 + 7 ++ * inputheight = (64*spv + (oh - 1)*vrsz + 32) >> 8 + 7 ++ * endpahse for width = ( ( 64*sph + (ow - 1)*hrsz +32 ) >> 6 )% 4 ++ * endphase for height = ( ( 64*sph + (oh - 1)*hrsz +32 ) >> 6 )% 4 ++ * where ++ * sph = Start phase horizontal ++ * spv = Start phase vertical ++ * ow = Output width ++ * oh = Output height ++ * hrsz = Horizontal resize value ++ * vrsz = Vertical resize value ++ * Fills up the output/input widht/height,horizontal/vertical resize ratio, ++ * horizontal/vertical crop variables in the isp_res structure . ++ * input_w: input width for the resizer in number of pixels per line ++ * input_h: input height for the resizer in number of lines ++ * output_w: output width from the resizer in number of pixels per line ++ * resizer when writing to memory needs this to be multiple of 16 ++ * output_h: output height for the resizer in number of lines, must be even ++*/ ++int ispresizer_try_size(u32 *input_width, u32 *input_height, u32 *output_w, ++ u32 *output_h) ++{ ++ u32 rsz, rsz_7, rsz_4; ++ u32 sph; ++ u32 input_w, input_h; ++ u32 output; ++ int max_in_otf, max_out_7tap; ++ input_w = *input_width; ++ input_h = *input_height; ++ ++ /* ++ * This has to be done inorder to make sure that the try size does not ++ * end up with input height/width greater than what the preview will ++ * output. ++ */ ++ input_w = input_w - 6; ++ input_h = input_h - 6; ++ ++ if (input_h > MAX_IN_HEIGHT) ++ return -EINVAL; ++ ++/// if (is_sil_rev_equal_to(OMAP3430_REV_ES1_0)) { ++/// max_in_otf = MAX_IN_WIDTH_ONTHEFLY_MODE; ++// max_out_7tap = MAX_7TAP_VRSZ_OUTWIDTH; ++/// } else { ++ max_in_otf = MAX_IN_WIDTH_ONTHEFLY_MODE_ES2; ++ max_out_7tap = MAX_7TAP_VRSZ_OUTWIDTH_ES2; ++/// } ++ ++ if (ispres_obj.resinput == RSZ_OTFLY_YUV) { ++ if (input_w > max_in_otf) ++ return -EINVAL; ++ } else { ++ if (input_w > MAX_IN_WIDTH_MEMORY_MODE) ++ return -EINVAL; ++ } ++ ++ ++ *(output_h) = *(output_h) & 0xFFFFFFFE; ++ output = *(output_h); ++ sph = DEFAULTSTPHASE; ++ ++ /* For height */ ++ rsz_7 = ((input_h - 7) * 256) / (output - 1); ++ rsz_4 = ((input_h - 4) * 256) / (output - 1); ++ ++ rsz = (input_h * 256) / output; ++ ++ if (rsz <= MID_RESIZE_VALUE) { ++ rsz = rsz_4; ++ if (rsz < MINIMUM_RESIZE_VALUE) { ++ rsz = MINIMUM_RESIZE_VALUE; ++ output = (((input_h - 4) * 256) / rsz) + 1; ++ printk(KERN_ERR "\t ISP_ERR: rsz was less than min -" ++ " new op_h is = %d\n", output); ++ } ++ } else { ++ rsz = rsz_7; ++ if (*(output_w) > max_out_7tap) ++ *(output_w) = max_out_7tap; ++ if (rsz > MAXIMUM_RESIZE_VALUE) { ++ rsz = MAXIMUM_RESIZE_VALUE; ++ output = (((input_h - 7) * 256) / rsz) + 1; ++ printk("\t ISP_ERR: rsz was more than max - new op_h" ++ " is %d\n", output); ++ } ++ } ++ ++ /* Recalculate input */ ++ if (rsz > MID_RESIZE_VALUE) ++ input_h = (((64 * sph) + ((output - 1) * rsz) + 32) / 256) + 7; ++ else ++ input_h = (((32 * sph) + ((output - 1) * rsz) + 16) / 256) + 4; ++ ++ ispres_obj.outputheight = output; ++ ispres_obj.v_resz = rsz; ++ ispres_obj.inputheight = input_h; ++ ispres_obj.ipht_crop = DEFAULTSTPIXEL; ++ ispres_obj.v_startphase = sph; ++ ++ ++ *(output_w) = *(output_w) & 0xFFFFFFF0; ++ output = *(output_w); ++ sph = DEFAULTSTPHASE; ++ ++ /* For Width */ ++ rsz_7 = ((input_w - 7) * 256) / (output - 1); ++ rsz_4 = ((input_w - 4) * 256) / (output - 1); ++ ++ rsz = (input_w * 256) / output; ++ if (rsz > MID_RESIZE_VALUE) { ++ rsz = rsz_7; ++ if (rsz > MAXIMUM_RESIZE_VALUE) { ++ rsz = MAXIMUM_RESIZE_VALUE; ++ output = (((input_w - 7) * 256) / rsz) + 1; ++ printk("\t ISP_ERR: rsz was greater than max - new" ++ " op_w is %d\n", output); ++ } ++ } else { ++ rsz = rsz_4; ++ if (rsz < MINIMUM_RESIZE_VALUE) { ++ rsz = MINIMUM_RESIZE_VALUE; ++ output = (((input_w - 4) * 256) / rsz) + 1; ++ printk("\t ISP_ERR: rsz was less than min - new op_w" ++ " is %d\n", output); ++ } ++ } ++ ++ /* Recalculate input based on TRM equations */ ++ if (rsz > MID_RESIZE_VALUE) ++ input_w = (((64 * sph) + ((output - 1) * rsz) + 32) / 256) + 7; ++ else ++ input_w = (((32 * sph) + ((output - 1) * rsz) + 16) / 256) + 7; ++ ++ ispres_obj.outputwidth = output; ++ ispres_obj.h_resz = rsz; ++ ispres_obj.inputwidth = input_w; ++ ispres_obj.ipwd_crop = DEFAULTSTPIXEL; ++ ispres_obj.h_startphase = sph; ++ ++ *input_height = input_h; ++ *input_width = input_w; ++ return 0; ++} ++EXPORT_SYMBOL(ispresizer_try_size); ++ ++/* ++ * Configures the appropriate values stored in the isp_res structure in ++ * the resizer registers ++ * input_w : input width for the resizer in number of pixels per line ++ * input_h : input height for the resizer in number of lines ++ * output_w : output width from the resizer in number of pixels per line ++ * output_h : output height for the resizer in number of lines ++ */ ++int ++ispresizer_config_size(u32 input_w, u32 input_h, u32 output_w, u32 output_h) ++{ ++ int i, j; ++ u32 res; ++ DPRINTK_ISPRESZ("ispresizer_config_size()+, input_w = %d,input_h =" ++ " %d, output_w = %d, output_h" ++ " = %d,hresz = %d,vresz = %d," ++ " hcrop = %d, vcrop = %d," ++ " hstph = %d, vstph = %d\n", ++ ispres_obj.inputwidth, ++ ispres_obj.inputheight, ++ ispres_obj.outputwidth, ++ ispres_obj.outputheight, ++ ispres_obj.h_resz, ++ ispres_obj.v_resz, ++ ispres_obj.ipwd_crop, ++ ispres_obj.ipht_crop, ++ ispres_obj.h_startphase, ++ ispres_obj.v_startphase); ++ if ((output_w != ispres_obj.outputwidth) ++ || (output_h != ispres_obj.outputheight)) { ++ printk(KERN_ERR "Output parameters passed do not match the" ++ " values calculated by the" ++ " trysize passed w %d, h %d" ++ " \n", output_w , output_h); ++ return -EINVAL; ++ } ++ /* Set horizontal and vertical starting phase */ ++ res = omap_readl(ISPRSZ_CNT) & (~(ISPRSZ_CNT_HSTPH_MASK | ++ ISPRSZ_CNT_VSTPH_MASK)); ++ omap_writel(res | (ispres_obj.h_startphase << ISPRSZ_CNT_HSTPH_SHIFT) ++ | (ispres_obj.v_startphase << ISPRSZ_CNT_VSTPH_SHIFT) ++ , ISPRSZ_CNT); ++ /* Set horizontal and vertical start pixel */ ++ omap_writel(((ispres_obj.ipwd_crop * 2) << ++ ISPRSZ_IN_START_HORZ_ST_SHIFT) | ++ (ispres_obj.ipht_crop << ++ ISPRSZ_IN_START_VERT_ST_SHIFT), ++ ISPRSZ_IN_START); ++ ++ ++ /*Set input width and height*/ ++ omap_writel((ispres_obj.inputwidth << ISPRSZ_IN_SIZE_HORZ_SHIFT) | ++ (ispres_obj.inputheight << ++ ISPRSZ_IN_SIZE_VERT_SHIFT), ++ ISPRSZ_IN_SIZE); ++ /*Set output width and height*/ ++ if (!ispres_obj.algo) ++ omap_writel((output_w << ISPRSZ_OUT_SIZE_HORZ_SHIFT) | ++ (output_h << ++ ISPRSZ_OUT_SIZE_VERT_SHIFT), ++ ISPRSZ_OUT_SIZE); ++ else ++ omap_writel(((output_w - 4) << ISPRSZ_OUT_SIZE_HORZ_SHIFT) | ++ (output_h << ++ ISPRSZ_OUT_SIZE_VERT_SHIFT), ++ ISPRSZ_OUT_SIZE); ++ ++ ++ /*Set horizontal and vertical resize ratios*/ ++ res = omap_readl(ISPRSZ_CNT) & (~(ISPRSZ_CNT_HRSZ_MASK | ++ ISPRSZ_CNT_VRSZ_MASK)); ++ omap_writel(res | ((ispres_obj.h_resz - 1) << ISPRSZ_CNT_HRSZ_SHIFT) ++ | ((ispres_obj.v_resz - 1) << ISPRSZ_CNT_VRSZ_SHIFT) ++ , ISPRSZ_CNT); ++ /*Set the horizontal/vertical filter coefficients depending on the ++ * resize values ++ */ ++ if (ispres_obj.h_resz <= MID_RESIZE_VALUE) { ++ j = 0; ++ for (i = 0; i < 16; i++) { ++ omap_writel((ispres_obj.coeflist. ++ h_filter_coef_4tap[j] << ++ ISPRSZ_HFILT10_COEF0_SHIFT) | ++ (ispres_obj.coeflist.h_filter_coef_4tap[j+1] ++ << ISPRSZ_HFILT10_COEF1_SHIFT), ++ ISPRSZ_HFILT10 + (i * 0x04)); ++ j += 2; ++ } ++ } else { ++ j = 0; ++ for (i = 0; i < 16; i++) { ++ if ((i + 1) % 4 == 0) { ++ omap_writel((ispres_obj.coeflist. ++ h_filter_coef_7tap[j] << ++ ISPRSZ_HFILT10_COEF0_SHIFT) , ++ ISPRSZ_HFILT10 + (i * 0x04)); ++ j += 1; ++ } else { ++ omap_writel((ispres_obj.coeflist. ++ h_filter_coef_7tap[j] << ++ ISPRSZ_HFILT10_COEF0_SHIFT) | ++ (ispres_obj.coeflist. ++ h_filter_coef_7tap[j+1] << ++ ISPRSZ_HFILT10_COEF1_SHIFT), ++ ISPRSZ_HFILT10 + (i * 0x04)); ++ j += 2; ++ } ++ } ++ } ++ if (ispres_obj.v_resz <= MID_RESIZE_VALUE) { ++ j = 0; ++ for (i = 0; i < 16; i++) { ++ omap_writel((ispres_obj.coeflist. ++ v_filter_coef_4tap[j] << ++ ISPRSZ_VFILT10_COEF0_SHIFT) | ++ (ispres_obj.coeflist.v_filter_coef_4tap[j+1] ++ << ISPRSZ_VFILT10_COEF1_SHIFT), ++ ISPRSZ_VFILT10 + (i * 0x04)); ++ j += 2; ++ } ++ } else { ++ j = 0; ++ for (i = 0; i < 16; i++) { ++ if ((i + 1) % 4 == 0) { ++ omap_writel((ispres_obj.coeflist. ++ v_filter_coef_7tap[j] << ++ ISPRSZ_VFILT10_COEF0_SHIFT) , ++ ISPRSZ_VFILT10 + (i * 0x04)); ++ j += 1; ++ } else { ++ omap_writel((ispres_obj.coeflist. ++ v_filter_coef_7tap[j] << ++ ISPRSZ_VFILT10_COEF0_SHIFT) | ++ (ispres_obj.coeflist. ++ v_filter_coef_7tap[j+1] << ++ ISPRSZ_VFILT10_COEF1_SHIFT), ++ ISPRSZ_VFILT10 + (i * 0x04)); ++ j += 2; ++ } ++ } ++ } ++ ++ /* Configure the outline offset to e outputwidth*2*/ ++ ispresizer_config_outlineoffset(output_w*2); ++ DPRINTK_ISPRESZ("ispresizer_config_size()-\n"); ++ return 0; ++} ++EXPORT_SYMBOL(ispresizer_config_size); ++ ++/* ++ * Enables the Resizer module. ++ * Client should configure all the sub modules in Resizer before this. ++ * enable : 1- Enables the resizer module. ++ */ ++void ++ispresizer_enable(u8 enable) ++{ ++ DPRINTK_ISPRESZ("+ispresizer_enable()+\n"); ++ if (enable) ++ omap_writel((omap_readl(ISPRSZ_PCR)) | ++ ISPRSZ_PCR_ENABLE, ISPRSZ_PCR); ++ else { ++ omap_writel((omap_readl(ISPRSZ_PCR)) & ++ ~ISPRSZ_PCR_ENABLE, ISPRSZ_PCR); ++ } ++ DPRINTK_ISPRESZ("+ispresizer_enable()-\n"); ++} ++EXPORT_SYMBOL(ispresizer_enable); ++ ++int ispresizer_busy(void) ++{ ++ return (omap_readl(ISPRSZ_PCR) & ISPPRV_PCR_BUSY); ++} ++EXPORT_SYMBOL(ispresizer_busy); ++ ++/* ++ * Sets the horizontal and vertical start phase. ++ * This API just updates the isp_res struct.Actual register write happens in ++ * ispresizer_config_size. ++ * hstartphase : horizontal start phase(0-7) ++ * vstartphase : vertical startphase(0-7) ++ */ ++void ispresizer_config_startphase(u8 hstartphase, u8 vstartphase) ++{ ++ DPRINTK_ISPRESZ("ispresizer_config_startphase()+\n"); ++ ispres_obj.h_startphase = hstartphase; ++ ispres_obj.v_startphase = vstartphase; ++ DPRINTK_ISPRESZ("ispresizer_config_startphase()-\n"); ++} ++EXPORT_SYMBOL(ispresizer_config_startphase); ++ ++/* ++ * Sets whether the output should be in YC or CY format. ++ * yc :0 - YC format ++ * 1 - CY format ++ */ ++void ispresizer_config_ycpos(u8 yc) ++{ ++ DPRINTK_ISPRESZ("ispresizer_config_ycpos()+\n"); ++ if (yc) ++ omap_writel((omap_readl(ISPRSZ_CNT)) | ++ (ISPRSZ_CNT_YCPOS), ISPRSZ_CNT); ++ else ++ omap_writel((omap_readl(ISPRSZ_CNT)) & ++ (~ISPRSZ_CNT_YCPOS), ISPRSZ_CNT); ++ DPRINTK_ISPRESZ("ispresizer_config_ycpos()-\n"); ++} ++EXPORT_SYMBOL(ispresizer_config_ycpos); ++ ++/* ++ * Sets the chrominance algorithm ++ * cbilin :0 - chrominance uses same processing as luminance ++ * 1 - bilinear interpolation processing ++ */ ++void ++ispresizer_enable_cbilin(u8 enable) ++{ ++ DPRINTK_ISPRESZ("ispresizer_enable_cbilin()+\n"); ++ if (enable) ++ omap_writel((omap_readl(ISPRSZ_CNT)) | ++ (ISPRSZ_CNT_CBILIN), ISPRSZ_CNT); ++ else ++ omap_writel((omap_readl(ISPRSZ_CNT)) & ++ (~ISPRSZ_CNT_CBILIN) , ISPRSZ_CNT); ++ DPRINTK_ISPRESZ("ispresizer_enable_cbilin()-\n"); ++} ++EXPORT_SYMBOL(ispresizer_enable_cbilin); ++ ++/* ++ * Configures luminance enhancer parameters. ++ * yenh :structure containing desired values for core,slope,gain and ++ * algo parameters ++ */ ++void ++ispresizer_config_luma_enhance(struct isprsz_yenh *yenh) ++{ ++ DPRINTK_ISPRESZ("ispresizer_config_luma_enhance()+\n"); ++ ispres_obj.algo = yenh->algo; ++ omap_writel((yenh->algo << ISPRSZ_YENH_ALGO_SHIFT) | ++ (yenh->gain << ISPRSZ_YENH_GAIN_SHIFT) | ++ (yenh->slope << ISPRSZ_YENH_SLOP_SHIFT) | ++ (yenh->coreoffset << ISPRSZ_YENH_CORE_SHIFT), ++ ISPRSZ_YENH); ++ DPRINTK_ISPRESZ("ispresizer_config_luma_enhance()-\n"); ++} ++EXPORT_SYMBOL(ispresizer_config_luma_enhance); ++ ++/* ++ * Sets the filter coefficients for both 4-tap and 7-tap mode. ++ * This API just updates the isp_res struct.Actual register write happens in ++ * ispresizer_config_size. ++ * coef :structure containing horizontal and vertical filter ++ * coefficients for both 4-tap and 7-tap mode ++ */ ++void ispresizer_config_filter_coef(struct isprsz_coef *coef) ++{ ++ int i; ++ DPRINTK_ISPRESZ("ispresizer_config_filter_coef()+\n"); ++ for (i = 0; i < 32; i++) { ++ ispres_obj.coeflist.h_filter_coef_4tap[i] = ++ coef->h_filter_coef_4tap[i]; ++ ispres_obj.coeflist.v_filter_coef_4tap[i] = ++ coef->v_filter_coef_4tap[i]; ++ } ++ for (i = 0; i < 28; i++) { ++ ispres_obj.coeflist.h_filter_coef_7tap[i] = ++ coef->h_filter_coef_7tap[i]; ++ ispres_obj.coeflist.v_filter_coef_7tap[i] = ++ coef->v_filter_coef_7tap[i]; ++ } ++ DPRINTK_ISPRESZ("ispresizer_config_filter_coef()-\n"); ++} ++EXPORT_SYMBOL(ispresizer_config_filter_coef); ++ ++/* ++ * Configures the Read address line offset. ++ * offset : Line Offset for the input image. ++ */ ++int ispresizer_config_inlineoffset(u32 offset) ++{ ++ DPRINTK_ISPRESZ("ispresizer_config_inlineoffset()+\n"); ++ if (offset%32) ++ return -EINVAL; ++ omap_writel(offset << ISPRSZ_SDR_INOFF_OFFSET_SHIFT, ISPRSZ_SDR_INOFF); ++ DPRINTK_ISPRESZ("ispresizer_config_inlineoffset()-\n"); ++ return 0; ++} ++EXPORT_SYMBOL(ispresizer_config_inlineoffset); ++ ++/* ++ * Configures the memory address from which the input frame is to be read. ++ * addr : 32bit memory address aligned on 32byte boundary. ++ */ ++int ++ispresizer_set_inaddr(u32 addr) ++{ ++ DPRINTK_ISPRESZ("ispresizer_set_inaddr()+\n"); ++ if (addr%32) ++ return -EINVAL; ++ omap_writel(addr << ISPRSZ_SDR_INADD_ADDR_SHIFT, ISPRSZ_SDR_INADD); ++ DPRINTK_ISPRESZ("ispresizer_set_inaddr()-\n"); ++ return 0; ++} ++EXPORT_SYMBOL(ispresizer_set_inaddr); ++ ++/* ++ * Configures the Write address line offset. ++ * offset : Line Offset for the preview output. ++ */ ++int ispresizer_config_outlineoffset(u32 offset) ++{ ++ DPRINTK_ISPRESZ("ispresizer_config_outlineoffset()+\n"); ++ if (offset%32) ++ return -EINVAL; ++ omap_writel(offset << ISPRSZ_SDR_OUTOFF_OFFSET_SHIFT, ++ ISPRSZ_SDR_OUTOFF); ++ DPRINTK_ISPRESZ("ispresizer_config_outlineoffset()-\n"); ++ return 0; ++} ++EXPORT_SYMBOL(ispresizer_config_outlineoffset); ++ ++/* ++ * Configures the memory address to which the output frame is written. ++ * addr : 32bit memory address aligned on 32byte boundary. ++ */ ++int ispresizer_set_outaddr(u32 addr) ++{ ++ DPRINTK_ISPRESZ("ispresizer_set_outaddr()+\n"); ++ if (addr%32) ++ return -EINVAL; ++ omap_writel(addr << ISPRSZ_SDR_OUTADD_ADDR_SHIFT, ISPRSZ_SDR_OUTADD); ++ ++ DPRINTK_ISPRESZ("ispresizer_set_outaddr()-\n"); ++ return 0; ++} ++EXPORT_SYMBOL(ispresizer_set_outaddr); ++ ++/* ++ * Saves the values of the resizer module registers. ++ */ ++void ispresizer_save_context(void) ++{ ++ DPRINTK_ISPRESZ("Saving context\n"); ++ isp_save_context(isprsz_reg_list); ++} ++EXPORT_SYMBOL(ispresizer_save_context); ++ ++/* ++ * Restores the values of the resizer module registers. ++ */ ++void ispresizer_restore_context(void) ++{ ++ DPRINTK_ISPRESZ("Restoring context\n"); ++ isp_restore_context(isprsz_reg_list); ++} ++EXPORT_SYMBOL(ispresizer_restore_context); ++ ++/* ++ * Prints the values of the Resizer Module registers ++ */ ++void ispresizer_print_status() ++{ ++#ifdef OMAP_ISPRESZ_DEBUG ++ DPRINTK_ISPRESZ("###ISP_CTRL inresizer =0x%x\n", omap_readl(ISP_CTRL)); ++ ++ DPRINTK_ISPRESZ("###ISP_IRQ0ENABLE in resizer =0x%x\n", ++ omap_readl(ISP_IRQ0ENABLE)); ++ DPRINTK_ISPRESZ("###ISP_IRQ0STATUS in resizer =0x%x\n", ++ omap_readl(ISP_IRQ0STATUS)); ++ DPRINTK_ISPRESZ("###RSZ PCR =0x%x\n", omap_readl(ISPRSZ_PCR)); ++ DPRINTK_ISPRESZ("###RSZ CNT =0x%x\n", omap_readl(ISPRSZ_CNT)); ++ DPRINTK_ISPRESZ("###RSZ OUT SIZE =0x%x\n", ++ omap_readl(ISPRSZ_OUT_SIZE)); ++ DPRINTK_ISPRESZ("###RSZ IN START =0x%x\n", ++ omap_readl(ISPRSZ_IN_START)); ++ DPRINTK_ISPRESZ("###RSZ IN SIZE =0x%x\n", omap_readl(ISPRSZ_IN_SIZE)); ++ DPRINTK_ISPRESZ("###RSZ SDR INADD =0x%x\n", ++ omap_readl(ISPRSZ_SDR_INADD)); ++ DPRINTK_ISPRESZ("###RSZ SDR INOFF =0x%x\n", ++ omap_readl(ISPRSZ_SDR_INOFF)); ++ DPRINTK_ISPRESZ("###RSZ SDR OUTADD =0x%x\n", ++ omap_readl(ISPRSZ_SDR_OUTADD)); ++ DPRINTK_ISPRESZ("###RSZ SDR OTOFF =0x%x\n", ++ omap_readl(ISPRSZ_SDR_OUTOFF)); ++ DPRINTK_ISPRESZ("###RSZ YENH =0x%x\n", omap_readl(ISPRSZ_YENH)); ++#endif ++} ++EXPORT_SYMBOL(ispresizer_print_status); ++ ++/* ++ * Module Initialisation. ++ */ ++static int __init ++isp_resizer_init(void) ++{ ++ /*Nothing to do other than mutex init*/ ++ init_MUTEX(&(ispres_obj.semlock)); ++ return 0; ++} ++ ++static void ++isp_resizer_cleanup(void) ++{ ++ /*Nothing to do*/ ++} ++ ++module_init(isp_resizer_init); ++module_exit(isp_resizer_cleanup); ++ ++MODULE_AUTHOR("Texas Instruments"); ++MODULE_DESCRIPTION("ISP Resizer Library"); ++MODULE_LICENSE("GPL"); +Index: git/drivers/media/video/isp/ispresizer.h +=================================================================== +--- /dev/null 1970-01-01 00:00:00.000000000 +0000 ++++ git/drivers/media/video/isp/ispresizer.h 2009-02-12 10:29:26.000000000 -0600 +@@ -0,0 +1,184 @@ ++/* ++ * drivers/media/video/ispresizer.h ++ * ++ * Driver include file for Resizer module in TI's OMAP3430 Camera ISP ++ * ++ * Copyright (C) 2008 Texas Instruments, Inc. ++ * ++ * This package 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 PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR ++ * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED ++ * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. ++ */ ++ ++#ifndef OMAP_ISP_RESIZER_H ++#define OMAP_ISP_RESIZER_H ++ ++/************************************************************************ ++The client is supposed to call resizer API in the following sequence: ++ - request() ++ - config_datatpath() ++ - optionally config/enable sub modules ++ - try/config size ++ - setup callback ++ - setup in/out memory offsets and ptrs ++ - enable() ++ ... ++ - disable() ++ - free() ++*************************************************************************/ ++ ++void ispresizer_config_shadow_registers(void); ++ ++/* ++ * Reserve the resizer module and turns on the clocks ++ * Only one user at a time. ++ */ ++int ispresizer_request(void); ++ ++/* ++ * Marks Resizer module free and turns off the clocks. ++ */ ++int ispresizer_free(void); ++ ++/* ++ *Enumeration Constants for input format ++ */ ++enum ispresizer_input { ++ RSZ_OTFLY_YUV, ++ RSZ_MEM_YUV, ++ RSZ_MEM_COL8 ++}; ++ ++/* ++ * Sets up the default resizer configuration according to the arguments. ++ */ ++int ispresizer_config_datapath(enum ispresizer_input input); ++ ++/* ++ * Sets the chrominance algorithm ++ */ ++void ispresizer_enable_cbilin(u8 enable); ++ ++/* ++ * Sets whether the output should be in YC or CY format. ++ */ ++void ispresizer_config_ycpos(u8 yc); ++ ++/* ++ * Sets the horizontal and vertical start phase. ++ */ ++void ispresizer_config_startphase(u8 hstartphase, u8 vstartphase); ++ ++/* ++ * Structure for resizer filter coeffcients. ++ */ ++struct isprsz_coef{ ++ /* 8-phase/4-tap mode(.5x-4x) */ ++ u16 h_filter_coef_4tap[32]; ++ u16 v_filter_coef_4tap[32]; ++ /* 4-phase/7-tap mode(.25x-.5x) */ ++ u16 h_filter_coef_7tap[28]; ++ u16 v_filter_coef_7tap[28]; ++}; ++ ++/* ++ * Sets the filter coefficients for both 4-tap and 7-tap mode. ++ * Note this API doesn't program to hardware at all. It only make a local ++ * copy of filter arrays. The actual programming happnes when _config_size ++ * is called. ++ */ ++void ispresizer_config_filter_coef(struct isprsz_coef *coef); ++ ++/* ++ * Structure for resizer luminance enhancer parameters ++ */ ++struct isprsz_yenh{ ++ u8 algo; ++ u8 gain; ++ u8 slope; ++ u8 coreoffset; ++ }; ++ ++/* ++ * Configures luminance enhancer parameters. ++ */ ++void ispresizer_config_luma_enhance(struct isprsz_yenh *yenh); ++/* ++ * Calculates the horizontal and vertical resize ratio,number of pixels to ++ * be cropped in the resizer module and checks the validity of various ++ * parameters.We don't expose API to change RSZ_IN_START (cropping). HORZ_ST ++ * and VERT_ST are implictly set based on the expected output size and the ++ * need of small cropping on the input image. ++ * User should already config yenh/stphase before attempting any size API. ++ */ ++int ispresizer_try_size(u32 *input_w, u32 *input_h, u32 *output_w, ++ u32 *output_h); ++ ++ ++/* ++ * Applies Crop values to hardware ++ */ ++void ispresizer_applycrop(void); ++ ++/* ++ * Try size for applying crop. Updates global resizer structure. Does not ++ * update h/w ++ */ ++void ispresizer_trycrop(u32 left, u32 top, u32 width, u32 height, u32 ow, ++ u32 oh); ++ ++/* ++ * APT that programs I/O sizes, ratios, and the right filter coefficients ++ * to resizer hardware. ++ */ ++int ispresizer_config_size(u32 input_w, u32 input_h, u32 output_w, ++ u32 output_h); ++ ++/* ++ * Configures the Read address line offset. ++ */ ++int ispresizer_config_inlineoffset(u32 offset); ++ ++/* ++ * Configures the memory address from which the input frame is to be read. ++ */ ++int ispresizer_set_inaddr(u32 addr); ++ ++/* ++ * Configures the Write address line offset. ++ */ ++int ispresizer_config_outlineoffset(u32 offset); ++ ++/* ++ * Configures the memory address to which the output frame is written. ++ */ ++int ispresizer_set_outaddr(u32 addr); ++ ++/* ++ * Enables the Resizer module. ++ * ES1 only works on one-shot. ES2 allows On-The-Fly. ++ * A client should config everything else before enabling the resizer. ++ */ ++void ispresizer_enable(u8 enable); ++int ispresizer_busy(void); ++ ++/* ++ * Saves resizer context ++ */ ++void ispresizer_save_context(void); ++ ++/* ++ * Restores resizer context ++ */ ++void ispresizer_restore_context(void); ++ ++/* ++ * Prints the values of the Resizer Module registers ++ */ ++void ispresizer_print_status(void); ++ ++#endif /* OMAP_ISP_RESIZER_H */ +Index: git/drivers/media/video/isp/luma_enhance_table.h +=================================================================== +--- /dev/null 1970-01-01 00:00:00.000000000 +0000 ++++ git/drivers/media/video/isp/luma_enhance_table.h 2009-02-12 10:29:26.000000000 -0600 +@@ -0,0 +1,144 @@ ++/* ++ * drivers/media/video/isp/luma_enhance_table.h ++ * ++ * Luminance Enhancement table values for TI's OMAP3430 Camera ISP ++ * ++ * Copyright (C) 2008 Texas Instruments, Inc. ++ * ++ * This package 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 PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR ++ * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED ++ * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. ++ */ ++ ++1047552, ++1047552, ++1047552, ++1047552, ++1047552, ++1047552, ++1047552, ++1047552, ++1047552, ++1047552, ++1047552, ++1047552, ++1047552, ++1047552, ++1047552, ++1047552, ++1047552, ++1047552, ++1047552, ++1047552, ++1047552, ++1047552, ++1047552, ++1047552, ++1047552, ++1047552, ++1047552, ++1047552, ++1048575, ++1047551, ++1046527, ++1045503, ++1044479, ++1043455, ++1042431, ++1041407, ++1040383, ++1039359, ++1038335, ++1037311, ++1036287, ++1035263, ++1034239, ++1033215, ++1032191, ++1031167, ++1030143, ++1028096, ++1028096, ++1028096, ++1028096, ++1028096, ++1028096, ++1028096, ++1028096, ++1028096, ++1028096, ++1028100, ++1032196, ++1036292, ++1040388, ++1044484, ++0, ++0, ++0, ++5, ++5125, ++10245, ++15365, ++20485, ++25605, ++30720, ++30720, ++30720, ++30720, ++30720, ++30720, ++30720, ++30720, ++30720, ++30720, ++30720, ++31743, ++30719, ++29695, ++28671, ++27647, ++26623, ++25599, ++24575, ++23551, ++22527, ++21503, ++20479, ++19455, ++18431, ++17407, ++16383, ++15359, ++14335, ++13311, ++12287, ++11263, ++10239, ++9215, ++8191, ++7167, ++6143, ++5119, ++4095, ++3071, ++1024, ++1024, ++1024, ++1024, ++1024, ++1024, ++1024, ++1024, ++1024, ++1024, ++1024, ++1024, ++1024, ++1024, ++1024, ++1024, ++1024 +Index: git/drivers/media/video/isp/omap_previewer.c +=================================================================== +--- /dev/null 1970-01-01 00:00:00.000000000 +0000 ++++ git/drivers/media/video/isp/omap_previewer.c 2009-02-12 10:29:18.000000000 -0600 +@@ -0,0 +1,820 @@ ++/* ++ * drivers/media/video/isp/omap_previewer.c ++ * ++ * Wrapper for Preview module in TI's OMAP3430 ISP ++ * ++ * Copyright (C) 2008 Texas Instruments, Inc. ++ * ++ * This package 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 PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR ++ * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED ++ * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. ++ */ ++ ++#include <linux/mutex.h> ++#include <linux/cdev.h> ++#include <linux/device.h> ++#include <linux/delay.h> ++#include <linux/fs.h> ++#include <linux/mm.h> ++#include <linux/module.h> ++#include <linux/platform_device.h> ++#include <media/v4l2-dev.h> ++#include <asm/cacheflush.h> ++#include <asm/uaccess.h> ++#include <asm/io.h> ++#include <asm/arch/io.h> ++#include "isp.h" ++#include "ispmmu.h" ++#include "ispreg.h" ++#include "omap_previewer.h" ++ ++#define OMAP_PREV_NAME "omap-previewer" ++ ++static int prev_major = -1; ++static struct device *prev_dev; ++static struct class *prev_class; ++static struct prev_device *prevdevice; ++static struct platform_driver omap_previewer_driver; ++ ++static u32 prev_bufsize; ++ ++/** ++ * prev_calculate_crop - Calculate crop size according to device parameters ++ * @device: Structure containing ISP preview wrapper global information ++ * @crop: Structure containing crop size ++ * ++ * This function is used to calculate frame size reduction depending on ++ * the features enabled by the application. ++ **/ ++static void prev_calculate_crop(struct prev_device *device, ++ struct prev_cropsize *crop) ++{ ++ dev_dbg(prev_dev, "prev_calculate_crop E\n"); ++ ++ if (!device || !crop) { ++ dev_err(prev_dev, "\nErron in argument"); ++ return; ++ } ++ ++ isppreview_try_size(device->params->size_params.hsize, ++ device->params->size_params.vsize, ++ &crop->hcrop, &crop->vcrop); ++ crop->hcrop &= PREV_16PIX_ALIGN_MASK; ++ dev_dbg(prev_dev, "prev_calculate_crop L\n"); ++} ++ ++/** ++ * prev_get_status - Get status of ISP preview module ++ * @status: Structure containing the busy state. ++ * ++ * Checks if the ISP preview module is busy. ++ * ++ * Returns 0 if successful, or -EINVAL if the status parameter is invalid. ++ **/ ++static int prev_get_status(struct prev_status *status) ++{ ++ if (!status) { ++ dev_err(prev_dev, "get_status: invalid parameter\n"); ++ return -EINVAL; ++ } ++ status->hw_busy = (char)isppreview_busy(); ++ return 0; ++} ++ ++/** ++ * prev_hw_setup - Stores the desired configuration in the proper HW registers ++ * @config: Structure containing the desired configuration for ISP preview ++ * module. ++ * ++ * Reads the structure sent, and modifies the desired registers. ++ * ++ * Always returns 0. ++ **/ ++static int prev_hw_setup(struct prev_params *config) ++{ ++ dev_dbg(prev_dev, "prev_hw_setup E\n"); ++ ++ if (config->features & PREV_AVERAGER) ++ isppreview_config_averager(config->average); ++ else ++ isppreview_config_averager(0); ++ ++ if (config->features & PREV_INVERSE_ALAW) ++ isppreview_enable_invalaw(1); ++ else ++ isppreview_enable_invalaw(0); ++ ++ if (config->features & PREV_HORZ_MEDIAN_FILTER) { ++ isppreview_config_hmed(config->hmf_params); ++ isppreview_enable_hmed(1); ++ } else ++ isppreview_enable_hmed(0); ++ ++ if (config->features & PREV_DARK_FRAME_SUBTRACT) { ++ isppreview_set_darkaddr(config->drkf_params.addr); ++ isppreview_config_darklineoffset(config->drkf_params.offset); ++ isppreview_enable_drkframe(1); ++ } else ++ isppreview_enable_drkframe(0); ++ ++ if (config->features & PREV_LENS_SHADING) { ++ isppreview_config_drkf_shadcomp(config->lens_shading_shift); ++ isppreview_enable_shadcomp(1); ++ } else ++ isppreview_enable_shadcomp(0); ++ ++ dev_dbg(prev_dev, "prev_hw_setup L\n"); ++ return 0; ++} ++ ++/** ++ * prev_validate_params - Validate configuration parameters for Preview Wrapper ++ * @params: Structure containing configuration parameters ++ * ++ * Validate configuration parameters for Preview Wrapper ++ * ++ * Returns 0 if successful, or -EINVAL if a parameter value is invalid. ++ **/ ++static int prev_validate_params(struct prev_params *params) ++{ ++ if (!params) { ++ dev_err(prev_dev, "validate_params: error in argument"); ++ goto err_einval; ++ } ++ ++ if ((params->features & PREV_AVERAGER) == PREV_AVERAGER) { ++ if ((params->average != NO_AVE) ++ && (params->average != AVE_2_PIX) ++ && (params->average != AVE_4_PIX) ++ && (params->average != AVE_8_PIX)) { ++ dev_err(prev_dev, "validate_params: wrong pix " ++ "average\n"); ++ goto err_einval; ++ } else if (((params->average == AVE_2_PIX) ++ && (params->size_params.hsize % 2)) ++ || ((params->average == AVE_4_PIX) ++ && (params->size_params.hsize % 4)) ++ || ((params->average == AVE_8_PIX) ++ && (params->size_params.hsize % 8))) { ++ dev_err(prev_dev, "validate_params: " ++ "wrong pix average for input size\n"); ++ goto err_einval; ++ } ++ } ++ ++ if ((params->size_params.pixsize != PREV_INWIDTH_8BIT) ++ && (params->size_params.pixsize ++ != PREV_INWIDTH_10BIT)) { ++ dev_err(prev_dev, "validate_params: wrong pixsize\n"); ++ goto err_einval; ++ } ++ ++ if (params->size_params.hsize > MAX_IMAGE_WIDTH ++ || params->size_params.hsize < 0) { ++ dev_err(prev_dev, "validate_params: wrong hsize\n"); ++ goto err_einval; ++ } ++ ++ if ((params->pix_fmt != YCPOS_YCrYCb) ++ && (YCPOS_YCbYCr != params->pix_fmt) ++ && (YCPOS_CbYCrY != params->pix_fmt) ++ && (YCPOS_CrYCbY != params->pix_fmt)) { ++ dev_err(prev_dev, "validate_params: wrong pix_fmt"); ++ goto err_einval; ++ } ++ ++ if ((params->features & PREV_DARK_FRAME_SUBTRACT) ++ && (params->features ++ & PREV_DARK_FRAME_CAPTURE)) { ++ dev_err(prev_dev, "validate_params: DARK FRAME CAPTURE and " ++ "SUBSTRACT cannot be enabled " ++ "at same time\n"); ++ goto err_einval; ++ } ++ ++ if (params->features & PREV_DARK_FRAME_SUBTRACT) ++ if (!params->drkf_params.addr ++ || (params->drkf_params.offset % 32)) { ++ dev_err(prev_dev, "validate_params: dark frame " ++ "address\n"); ++ goto err_einval; ++ } ++ ++ if (params->features & PREV_LENS_SHADING) ++ if ((params->lens_shading_shift > 7) ++ || !params->drkf_params.addr ++ || (params->drkf_params.offset % 32)) { ++ dev_err(prev_dev, "validate_params: lens shading " ++ "shift\n"); ++ goto err_einval; ++ } ++ ++ if ((params->size_params.in_pitch <= 0) ++ || (params->size_params.in_pitch % 32)) { ++ params->size_params.in_pitch = ++ (params->size_params.hsize * 2) & 0xFFE0; ++ dev_err(prev_dev, "\nError in in_pitch; new value = %d", ++ params->size_params.in_pitch); ++ } ++ ++ return 0; ++err_einval: ++ return -EINVAL; ++} ++ ++/** ++ * preview_isr - Callback from ISP driver for ISP Preview Interrupt ++ * @status: ISP IRQ0STATUS register value ++ * @arg1: Structure containing ISP preview wrapper global information ++ * @arg2: Currently not used ++ **/ ++static void preview_isr(unsigned long status, isp_vbq_callback_ptr arg1, ++ void *arg2) ++{ ++ struct prev_device *device = (struct prev_device *)arg1; ++ ++ if ((status & PREV_DONE) != PREV_DONE) ++ return; ++ ++ if (device) ++ complete(&device->wfc); ++} ++ ++/** ++ * prev_do_preview - Performs the Preview process ++ * @device: Structure containing ISP preview wrapper global information ++ * @arg: Currently not used ++ * ++ * Returns 0 if successful, or -EINVAL if the sent parameters are invalid. ++ **/ ++static int prev_do_preview(struct prev_device *device, int *arg) ++{ ++ int bpp, size; ++ int ret = 0; ++ u32 out_hsize, out_vsize, out_line_offset; ++ ++ dev_dbg(prev_dev, "prev_do_preview E\n"); ++ ++ if (!device) { ++ dev_err(prev_dev, "preview: invalid parameters\n"); ++ return -EINVAL; ++ } ++ ++ if (device->params->size_params.pixsize == PREV_INWIDTH_8BIT) ++ bpp = 1; ++ else ++ bpp = 2; ++ ++ size = device->params->size_params.hsize * ++ device->params->size_params.vsize * bpp; ++ ++ ret = isppreview_set_inaddr(device->isp_addr_read); ++ if (ret) ++ goto out; ++ ++ ret = isppreview_set_outaddr(device->isp_addr_read); ++ if (ret) ++ goto out; ++ ++ isppreview_try_size(device->params->size_params.hsize, ++ device->params->size_params.vsize, ++ &out_hsize, &out_vsize); ++ ++ ret = isppreview_config_inlineoffset(device->params->size_params.hsize ++ * bpp); ++ if (ret) ++ goto out; ++ ++ out_line_offset = (out_hsize * bpp) & PREV_32BYTES_ALIGN_MASK; ++ ++ ret = isppreview_config_outlineoffset(out_line_offset); ++ if (ret) ++ goto out; ++ ++ ret = isppreview_config_size(device->params->size_params.hsize, ++ device->params->size_params.vsize, ++ out_hsize, out_vsize); ++ if (ret) ++ goto out; ++ ++ isppreview_config_datapath(PRV_RAW_MEM, PREVIEW_MEM); ++ ++ ret = isp_set_callback(CBK_PREV_DONE, preview_isr, (void *)device, ++ (void *)NULL); ++ if (ret) { ++ dev_err(prev_dev, "ERROR while setting Previewer callback!\n"); ++ goto out; ++ } ++ isppreview_enable(1); ++ ++ wait_for_completion_interruptible(&device->wfc); ++ ++ if (device->isp_addr_read) { ++ ispmmu_unmap(device->isp_addr_read); ++ device->isp_addr_read = 0; ++ } ++ ++ ret = isp_unset_callback(CBK_PREV_DONE); ++ ++ dev_dbg(prev_dev, "prev_do_preview L\n"); ++out: ++ return ret; ++} ++ ++/** ++ * previewer_vbq_release - Videobuffer queue release ++ * @q: Structure containing the videobuffer queue. ++ * @vb: Structure containing the videobuffer used for previewer processing. ++ **/ ++static void previewer_vbq_release(struct videobuf_queue *q, ++ struct videobuf_buffer *vb) ++{ ++ struct prev_fh *fh = q->priv_data; ++ struct prev_device *device = fh->device; ++ ++ ispmmu_unmap(device->isp_addr_read); ++ device->isp_addr_read = 0; ++ spin_lock(&device->vbq_lock); ++ vb->state = VIDEOBUF_NEEDS_INIT; ++ spin_unlock(&device->vbq_lock); ++ dev_dbg(prev_dev, "previewer_vbq_release\n"); ++} ++ ++/** ++ * previewer_vbq_setup - Sets up the videobuffer size and validates count. ++ * @q: Structure containing the videobuffer queue. ++ * @cnt: Number of buffers requested ++ * @size: Size in bytes of the buffer used for previewing ++ * ++ * Always returns 0. ++ **/ ++static int previewer_vbq_setup(struct videobuf_queue *q, ++ unsigned int *cnt, ++ unsigned int *size) ++{ ++ struct prev_fh *fh = q->priv_data; ++ struct prev_device *device = fh->device; ++ u32 bpp = 1; ++ ++ spin_lock(&device->vbq_lock); ++ if (*cnt <= 0) ++ *cnt = VIDEO_MAX_FRAME; ++ ++ if (*cnt > VIDEO_MAX_FRAME) ++ *cnt = VIDEO_MAX_FRAME; ++ ++ if (!device->params->size_params.hsize || ++ !device->params->size_params.vsize) { ++ dev_err(prev_dev, "Can't setup buffer size\n"); ++ spin_unlock(&device->vbq_lock); ++ return -EINVAL; ++ } ++ ++ if (device->params->size_params.pixsize == PREV_INWIDTH_10BIT) ++ bpp = 2; ++ *size = prev_bufsize = bpp * device->params->size_params.hsize ++ * device->params->size_params.vsize; ++ spin_unlock(&device->vbq_lock); ++ dev_dbg(prev_dev, "previewer_vbq_setup\n"); ++ return 0; ++} ++ ++/** ++ * previewer_vbq_prepare - Videobuffer is prepared and mmapped. ++ * @q: Structure containing the videobuffer queue. ++ * @vb: Structure containing the videobuffer used for previewer processing. ++ * @field: Type of field to set in videobuffer device. ++ * ++ * Returns 0 if successful, or -EINVAL if buffer couldn't get allocated, or ++ * -EIO if the ISP MMU mapping fails ++ **/ ++static int previewer_vbq_prepare(struct videobuf_queue *q, ++ struct videobuf_buffer *vb, ++ enum v4l2_field field) ++{ ++ struct prev_fh *fh = q->priv_data; ++ struct prev_device *device = fh->device; ++ int err = -EINVAL; ++ unsigned int isp_addr; ++ struct videobuf_dmabuf *dma = videobuf_to_dma(vb); ++ ++ dev_dbg(prev_dev, "previewer_vbq_prepare E\n"); ++ spin_lock(&device->vbq_lock); ++ if (vb->baddr) { ++ vb->size = prev_bufsize; ++ vb->bsize = prev_bufsize; ++ } else { ++ spin_unlock(&device->vbq_lock); ++ dev_err(prev_dev, "No user buffer allocated\n"); ++ goto out; ++ } ++ ++ vb->width = device->params->size_params.hsize; ++ vb->height = device->params->size_params.vsize; ++ vb->field = field; ++ spin_unlock(&device->vbq_lock); ++ ++ if (vb->state == VIDEOBUF_NEEDS_INIT) { ++ err = videobuf_iolock(q, vb, NULL); ++ if (!err) { ++ isp_addr = ispmmu_map_sg(dma->sglist, dma->sglen); ++ if (!isp_addr) ++ err = -EIO; ++ else ++ device->isp_addr_read = isp_addr; ++ } ++ } ++ ++ if (!err) { ++ vb->state = VIDEOBUF_PREPARED; ++ flush_cache_user_range(NULL, vb->baddr, ++ (vb->baddr + vb->bsize)); ++ } else ++ previewer_vbq_release(q, vb); ++ ++ dev_dbg(prev_dev, "previewer_vbq_prepare L\n"); ++out: ++ return err; ++} ++ ++static void previewer_vbq_queue(struct videobuf_queue *q, ++ struct videobuf_buffer *vb) ++{ ++ return; ++} ++ ++/** ++ * previewer_open - Initializes and opens the Preview Wrapper ++ * @inode: Inode structure associated with the Preview Wrapper ++ * @filp: File structure associated with the Preview Wrapper ++ * ++ * Returns 0 if successful, -EACCES if its unable to initialize default config, ++ * -EBUSY if its already opened or the ISP module is not available, or -ENOMEM ++ * if its unable to allocate the device in kernel space memory. ++ **/ ++static int previewer_open(struct inode *inode, struct file *filp) ++{ ++ int ret = 0; ++ struct prev_device *device = prevdevice; ++ struct prev_params *config = isppreview_get_config(); ++ struct prev_fh *fh; ++ ++ if (config == NULL) { ++ dev_err(prev_dev, "Unable to initialize default config " ++ "from isppreviewer\n\n"); ++ return -EACCES; ++ } ++ ++ if (device->opened || (filp->f_flags & O_NONBLOCK)) { ++ dev_err(prev_dev, "previewer_open: device is already " ++ "opened\n"); ++ return -EBUSY; ++ } ++ ++ fh = kzalloc(sizeof(struct prev_fh), GFP_KERNEL); ++ if (NULL == fh) ++ return -ENOMEM; ++ ++ isp_get(); ++ ret = isppreview_request(); ++ if (ret) { ++ isp_put(); ++ dev_err(prev_dev, "Can't acquire isppreview\n"); ++ return ret; ++ } ++ ++ device->params = config; ++ device->opened = 1; ++ ++ filp->private_data = fh; ++ fh->type = V4L2_BUF_TYPE_VIDEO_CAPTURE; ++ fh->device = device; ++ ++ videobuf_queue_pci_init(&fh->vbq, &device->vbq_ops, NULL, ++ &device->vbq_lock, fh->type, ++ V4L2_FIELD_NONE, ++ sizeof(struct videobuf_buffer), fh); ++ ++ init_completion(&device->wfc); ++ device->wfc.done = 0; ++ mutex_init(&device->prevwrap_mutex); ++ ++ return 0; ++} ++ ++/** ++ * previewer_release - Releases Preview Wrapper and frees up allocated memory ++ * @inode: Inode structure associated with the Preview Wrapper ++ * @filp: File structure associated with the Preview Wrapper ++ * ++ * Always returns 0. ++ **/ ++static int previewer_release(struct inode *inode, struct file *filp) ++{ ++ struct prev_fh *fh = filp->private_data; ++ struct prev_device *device = fh->device; ++ struct videobuf_queue *q = &fh->vbq; ++ ++ device->opened = 0; ++ device->params = NULL; ++ isppreview_free(); ++ isp_put(); ++ videobuf_mmap_free(q); ++ prev_bufsize = 0; ++ filp->private_data = NULL; ++ kfree(fh); ++ ++ dev_dbg(prev_dev, "previewer_release\n"); ++ return 0; ++} ++ ++/** ++ * previewer_mmap - Memory maps the Preview Wrapper module. ++ * @file: File structure associated with the Preview Wrapper ++ * @vma: Virtual memory area structure. ++ * ++ * Returns 0 if successful, or returned value by the videobuf_mmap_mapper() ++ * function. ++ **/ ++static int previewer_mmap(struct file *file, struct vm_area_struct *vma) ++{ ++ struct prev_fh *fh = file->private_data; ++ dev_dbg(prev_dev, "previewer_mmap\n"); ++ ++ return videobuf_mmap_mapper(&fh->vbq, vma); ++} ++ ++/** ++ * previewer_ioctl - I/O control function for Preview Wrapper ++ * @inode: Inode structure associated with the Preview Wrapper. ++ * @file: File structure associated with the Preview Wrapper. ++ * @cmd: Type of command to execute. ++ * @arg: Argument to send to requested command. ++ * ++ * Returns 0 if successful, -1 if bad command passed or access is denied, ++ * -EFAULT if copy_from_user() or copy_to_user() fails, -EINVAL if parameter ++ * validation fails or parameter structure is not present ++ **/ ++static int previewer_ioctl(struct inode *inode, struct file *file, ++ unsigned int cmd, unsigned long arg) ++{ ++ int ret = 0; ++ struct prev_params params; ++ struct prev_fh *fh = file->private_data; ++ struct prev_device *device = fh->device; ++ ++ dev_dbg(prev_dev, "Entering previewer_ioctl()\n"); ++ ++ if ((_IOC_TYPE(cmd) != PREV_IOC_BASE) ++ || (_IOC_NR(cmd) > PREV_IOC_MAXNR)) { ++ dev_err(prev_dev, "Bad command Value \n"); ++ goto err_minusone; ++ } ++ ++ if (_IOC_DIR(cmd) & _IOC_READ) ++ ret = !access_ok(VERIFY_WRITE, (void *)arg, _IOC_SIZE(cmd)); ++ else if (_IOC_DIR(cmd) & _IOC_WRITE) ++ ret = !access_ok(VERIFY_READ, (void *)arg, _IOC_SIZE(cmd)); ++ if (ret) { ++ dev_err(prev_dev, "access denied\n"); ++ goto err_minusone; ++ } ++ ++ switch (cmd) { ++ case PREV_REQBUF: ++ if (mutex_lock_interruptible(&device->prevwrap_mutex)) ++ goto err_eintr; ++ ret = videobuf_reqbufs(&fh->vbq, (void *)arg); ++ mutex_unlock(&device->prevwrap_mutex); ++ break; ++ ++ case PREV_QUERYBUF: ++ if (mutex_lock_interruptible(&device->prevwrap_mutex)) ++ goto err_eintr; ++ ret = videobuf_querybuf(&fh->vbq, (void *)arg); ++ mutex_unlock(&device->prevwrap_mutex); ++ break; ++ ++ case PREV_QUEUEBUF: ++ if (mutex_lock_interruptible(&device->prevwrap_mutex)) ++ goto err_eintr; ++ ret = videobuf_qbuf(&fh->vbq, (void *)arg); ++ mutex_unlock(&device->prevwrap_mutex); ++ break; ++ ++ case PREV_SET_PARAM: ++ if (mutex_lock_interruptible(&device->prevwrap_mutex)) ++ goto err_eintr; ++ if (copy_from_user(¶ms, (struct prev_params *)arg, ++ sizeof(struct prev_params))) { ++ mutex_unlock(&device->prevwrap_mutex); ++ return -EFAULT; ++ } ++ ret = prev_validate_params(¶ms); ++ if (ret < 0) { ++ dev_err(prev_dev, "Error validating parameters!\n"); ++ mutex_unlock(&device->prevwrap_mutex); ++ goto out; ++ } ++ if (device->params) ++ memcpy(device->params, ¶ms, ++ sizeof(struct prev_params)); ++ else { ++ mutex_unlock(&device->prevwrap_mutex); ++ return -EINVAL; ++ } ++ ++ ret = prev_hw_setup(device->params); ++ mutex_unlock(&device->prevwrap_mutex); ++ break; ++ ++ case PREV_GET_PARAM: ++ if (copy_to_user((struct prev_params *)arg, device->params, ++ sizeof(struct prev_params))) ++ ret = -EFAULT; ++ break; ++ ++ case PREV_GET_STATUS: ++ ret = prev_get_status((struct prev_status *)arg); ++ break; ++ ++ case PREV_PREVIEW: ++ if (mutex_lock_interruptible(&device->prevwrap_mutex)) ++ goto err_eintr; ++ ret = prev_do_preview(device, (int *)arg); ++ mutex_unlock(&device->prevwrap_mutex); ++ break; ++ ++ case PREV_GET_CROPSIZE: ++ { ++ struct prev_cropsize outputsize; ++ prev_calculate_crop(device, &outputsize); ++ if (copy_to_user((struct prev_cropsize *)arg, &outputsize, ++ sizeof(struct prev_cropsize))) ++ ret = -EFAULT; ++ } ++ break; ++ ++ default: ++ dev_err(prev_dev, "previewer_ioctl: Invalid Command Value\n"); ++ ret = -EINVAL; ++ } ++out: ++ return ret; ++err_minusone: ++ return -1; ++err_eintr: ++ return -EINTR; ++} ++ ++/** ++ * previewer_platform_release - Acts when Reference count is zero ++ * @device: Structure containing ISP preview wrapper global information ++ * ++ * This is called when the reference count goes to zero ++ **/ ++static void previewer_platform_release(struct device *device) ++{ ++ dev_dbg(prev_dev, "previewer_platform_release()\n"); ++} ++ ++static struct file_operations prev_fops = { ++ .owner = THIS_MODULE, ++ .open = previewer_open, ++ .release = previewer_release, ++ .mmap = previewer_mmap, ++ .ioctl = previewer_ioctl, ++}; ++ ++static struct platform_device omap_previewer_device = { ++ .name = OMAP_PREV_NAME, ++ .id = -1, ++ .dev = { ++ .release = previewer_platform_release, ++ } ++}; ++ ++/** ++ * previewer_probe - Checks for device presence ++ * @pdev: Structure containing details of the current device. ++ * ++ * Always returns 0 ++ **/ ++static int __init previewer_probe(struct platform_device *pdev) ++{ ++ return 0; ++} ++ ++/** ++ * previewer_remove - Handles the removal of the driver ++ * @pdev: Structure containing details of the current device. ++ * ++ * Always returns 0. ++ **/ ++static int previewer_remove(struct platform_device *pdev) ++{ ++ dev_dbg(prev_dev, "previewer_remove()\n"); ++ ++ platform_device_unregister(&omap_previewer_device); ++ platform_driver_unregister(&omap_previewer_driver); ++ unregister_chrdev(prev_major, OMAP_PREV_NAME); ++ return 0; ++} ++ ++static struct platform_driver omap_previewer_driver = { ++ .probe = previewer_probe, ++ .remove = previewer_remove, ++ .driver = { ++ .owner = THIS_MODULE, ++ .name = OMAP_PREV_NAME, ++ }, ++}; ++ ++/** ++ * omap_previewer_init - Initialization of Preview Wrapper ++ * ++ * Returns 0 if successful, -ENOMEM if could not allocate memory, -ENODEV if ++ * could not register the wrapper as a character device, or other errors if the ++ * device or driver can't register. ++ **/ ++static int __init omap_previewer_init(void) ++{ ++ int ret; ++ struct prev_device *device; ++ ++ device = kzalloc(sizeof(struct prev_device), GFP_KERNEL); ++ if (!device) { ++ dev_err(prev_dev, OMAP_PREV_NAME ": could not allocate" ++ " memory\n"); ++ return -ENOMEM; ++ } ++ prev_major = register_chrdev(0, OMAP_PREV_NAME, &prev_fops); ++ ++ if (prev_major < 0) { ++ dev_err(prev_dev, OMAP_PREV_NAME ": initialization " ++ "failed. could not register character " ++ "device\n"); ++ return -ENODEV; ++ } ++ ++ ret = platform_driver_register(&omap_previewer_driver); ++ if (ret) { ++ dev_err(prev_dev, OMAP_PREV_NAME ++ ": failed to register platform driver!\n"); ++ goto fail2; ++ } ++ ret = platform_device_register(&omap_previewer_device); ++ if (ret) { ++ dev_err(prev_dev, OMAP_PREV_NAME ++ ": failed to register platform device!\n"); ++ goto fail3; ++ } ++ ++ prev_class = class_create(THIS_MODULE, OMAP_PREV_NAME); ++ if (!prev_class) ++ goto fail4; ++ ++ prev_dev = device_create(prev_class, prev_dev, (MKDEV(prev_major, 0)), ++ OMAP_PREV_NAME); ++ dev_dbg(prev_dev, OMAP_PREV_NAME ": Registered Previewer Wrapper\n"); ++ device->opened = 0; ++ ++ device->vbq_ops.buf_setup = previewer_vbq_setup; ++ device->vbq_ops.buf_prepare = previewer_vbq_prepare; ++ device->vbq_ops.buf_release = previewer_vbq_release; ++ device->vbq_ops.buf_queue = previewer_vbq_queue; ++ spin_lock_init(&device->vbq_lock); ++ ++ prevdevice = device; ++ return 0; ++ ++fail4: ++ platform_device_unregister(&omap_previewer_device); ++fail3: ++ platform_driver_unregister(&omap_previewer_driver); ++fail2: ++ unregister_chrdev(prev_major, OMAP_PREV_NAME); ++ ++ return ret; ++} ++ ++/** ++ * omap_previewer_exit - Close of Preview Wrapper ++ **/ ++static void __exit omap_previewer_exit(void) ++{ ++ previewer_remove(&omap_previewer_device); ++ kfree(prevdevice); ++ prev_major = -1; ++} ++ ++module_init(omap_previewer_init); ++module_exit(omap_previewer_exit); ++ ++MODULE_AUTHOR("Texas Instruments"); ++MODULE_DESCRIPTION("OMAP ISP Previewer"); ++MODULE_LICENSE("GPL"); +Index: git/drivers/media/video/isp/omap_previewer.h +=================================================================== +--- /dev/null 1970-01-01 00:00:00.000000000 +0000 ++++ git/drivers/media/video/isp/omap_previewer.h 2009-02-12 10:29:26.000000000 -0600 +@@ -0,0 +1,136 @@ ++/* ++ * drivers/media/video/isp/omap_previewer.h ++ * ++ * Include file for Preview module wrapper in TI's OMAP3430 ISP ++ * ++ * Copyright (C) 2008 Texas Instruments, Inc. ++ * ++ * This package 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 PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR ++ * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED ++ * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. ++ */ ++ ++#include "isppreview.h" ++ ++#ifndef OMAP_ISP_PREVIEW_WRAP_H ++#define OMAP_ISP_PREVIEW_WRAP_H ++ ++#define PREV_IOC_BASE 'P' ++#define PREV_REQBUF _IOWR(PREV_IOC_BASE, 1,\ ++ struct v4l2_requestbuffers) ++#define PREV_QUERYBUF _IOWR(PREV_IOC_BASE, 2,\ ++ struct v4l2_buffer) ++#define PREV_SET_PARAM _IOW(PREV_IOC_BASE, 3,\ ++ struct prev_params) ++#define PREV_GET_PARAM _IOWR(PREV_IOC_BASE, 4,\ ++ struct prev_params) ++#define PREV_PREVIEW _IOR(PREV_IOC_BASE, 5, int) ++#define PREV_GET_STATUS _IOR(PREV_IOC_BASE, 6, char) ++#define PREV_GET_CROPSIZE _IOR(PREV_IOC_BASE, 7,\ ++ struct prev_cropsize) ++#define PREV_QUEUEBUF _IOWR(PREV_IOC_BASE, 8,\ ++ struct v4l2_buffer) ++#define PREV_IOC_MAXNR 8 ++ ++#define LUMA_TABLE_SIZE 128 ++#define GAMMA_TABLE_SIZE 1024 ++#define CFA_COEFF_TABLE_SIZE 576 ++#define NOISE_FILTER_TABLE_SIZE 256 ++ ++#define MAX_IMAGE_WIDTH 3300 ++ ++#define PREV_INWIDTH_8BIT 0 /* pixel width of 8 bitS */ ++#define PREV_INWIDTH_10BIT 1 /* pixel width of 10 bits */ ++ ++#define PREV_32BYTES_ALIGN_MASK 0xFFFFFFE0 ++#define PREV_16PIX_ALIGN_MASK 0xFFFFFFF0 ++ ++/* list of structures */ ++ ++/* structure for RGB2RGB blending parameters */ ++struct prev_rgbblending { ++ short blending[RGB_MAX][RGB_MAX]; /* color correlation 3x3 ++ * matrix. ++ */ ++ short offset[RGB_MAX]; /* color correlation offsets */ ++}; ++ ++/* structure for CFA coefficients */ ++struct prev_cfa_coeffs { ++ char hthreshold, vthreshold; /* horizontal an vertical ++ * threshold. ++ */ ++ int coeffs[CFA_COEFF_TABLE_SIZE]; /* cfa coefficients */ ++}; ++/* structure for Gamma Coefficients */ ++struct prev_gamma_coeffs { ++ unsigned char red[GAMMA_TABLE_SIZE]; /* table of gamma correction ++ * values for red color. ++ */ ++ unsigned char green[GAMMA_TABLE_SIZE]; /* table of gamma correction ++ * values for green color. ++ */ ++ unsigned char blue[GAMMA_TABLE_SIZE]; /* table of gamma correction ++ * values for blue color. ++ */ ++}; ++/* Structure for Noise Filter Coefficients */ ++struct prev_noiseflt_coeffs { ++ unsigned char noise[NOISE_FILTER_TABLE_SIZE]; /* noise filter ++ * table. ++ */ ++ unsigned char strength; /* to find out ++ * weighted average. ++ */ ++}; ++ ++/* Structure for Chroma Suppression */ ++struct prev_chroma_spr { ++ unsigned char hpfy; /* whether to use high passed ++ * version of Y or normal Y ++ */ ++ char threshold; /* threshold for chroma ++ * suppress. ++ */ ++ unsigned char gain; /* chroma suppression gain */ ++}; ++ ++/* structure to know status of the hardware */ ++struct prev_status { ++ char hw_busy; ++}; ++/* structure to knwo crop size */ ++struct prev_cropsize { ++ int hcrop; ++ int vcrop; ++}; ++ ++ ++/* device structure keeps track of global information */ ++struct prev_device { ++ struct prev_params *params; ++ unsigned char opened; /* state of the device */ ++ ++ struct completion wfc; ++ struct mutex prevwrap_mutex; ++ ++ spinlock_t vbq_lock; /* spinlock for videobuf ++ * queues. ++ */ ++ struct videobuf_queue_ops vbq_ops; /* videobuf queue operations */ ++ ++ dma_addr_t isp_addr_read; /* Input/Output address */ ++ ++}; ++ ++/* per-filehandle data structure */ ++struct prev_fh { ++ enum v4l2_buf_type type; ++ struct videobuf_queue vbq; ++ struct prev_device *device; ++}; ++#endif +Index: git/drivers/media/video/isp/omap_resizer.c +=================================================================== +--- /dev/null 1970-01-01 00:00:00.000000000 +0000 ++++ git/drivers/media/video/isp/omap_resizer.c 2009-02-12 14:48:11.000000000 -0600 +@@ -0,0 +1,1812 @@ ++/* ++ * drivers/media/video/isp/omap_resizer.c ++ * ++ * Wrapper for Resizer module in TI's OMAP3430 ISP ++ * ++ * Copyright (C) 2007 Texas Instruments, Inc. ++ * ++ * This package 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 PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR ++ * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED ++ * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. ++ */ ++ ++#include <linux/mutex.h> ++#include <linux/cdev.h> ++#include <linux/delay.h> ++#include <linux/device.h> ++#include <linux/fs.h> ++#include <linux/mm.h> ++#include <linux/module.h> ++#include <linux/platform_device.h> ++#include <linux/time.h> ++#include <media/v4l2-dev.h> ++#include <asm/cacheflush.h> ++#include <asm/uaccess.h> ++#include <asm/io.h> ++#include <mach/io.h> ++#include <asm/scatterlist.h> ++#include <linux/pci.h> ++#include "isp.h" ++#include "ispmmu.h" ++#include "ispreg.h" ++#include "ispresizer.h" ++#include <linux/omap_resizer.h> ++ ++#define OMAP_REZR_NAME "omap-resizer" ++ ++/* Defines and Constants*/ ++#define MAX_CHANNELS 16 ++#define MAX_IMAGE_WIDTH 2047 ++#define MAX_IMAGE_WIDTH_HIGH 2047 ++#define ALIGNMENT 16 ++#define CHANNEL_BUSY 1 ++#define CHANNEL_FREE 0 ++#define PIXEL_EVEN 2 ++#define RATIO_MULTIPLIER 256 ++/* Bit position Macro */ ++/* macro for bit set and clear */ ++#define BITSET(variable, bit) (variable) | (1 << bit) ++#define BITRESET(variable, bit) (variable) & ~(0x00000001 << (bit)) ++#define SET_BIT_INPUTRAM 28 ++#define SET_BIT_CBLIN 29 ++#define SET_BIT_INPTYP 27 ++#define SET_BIT_YCPOS 26 ++#define INPUT_RAM 1 ++#define UP_RSZ_RATIO 64 ++#define DOWN_RSZ_RATIO 512 ++#define UP_RSZ_RATIO1 513 ++#define DOWN_RSZ_RATIO1 1024 ++#define RSZ_IN_SIZE_VERT_SHIFT 16 ++#define MAX_HORZ_PIXEL_8BIT 31 ++#define MAX_HORZ_PIXEL_16BIT 15 ++#define NUM_PHASES 8 ++#define NUM_TAPS 4 ++#define NUM_D2PH 4 /* for downsampling * 2+x ~ 4x, ++ * number of phases ++ */ ++#define NUM_D2TAPS 7 /* for downsampling * 2+x ~ 4x, ++ * number of taps ++ */ ++#define ALIGN32 32 ++#define MAX_COEF_COUNTER 16 ++#define COEFF_ADDRESS_OFFSET 0x04 ++ ++#define RSZ_DEF_REQ_EXP 0xE /* Default read operation expand ++ * for the Resizer driver; value ++ * taken from Davinci. ++ */ ++/* ++ * These magic numbers are copied from video-buf layer, ++ * since they gets set in to the same layer. To support ++ * contiguous memory and to remove max buffer size constraint from ++ * application, we implemented replication of some video-buf functions ++ * so magic numbers also. ++ */ ++#define MAGIC_BUFFER 0x20070728 ++#define MAGIC_DMABUF 0x19721112 ++#define MAGIC_SG_MEM 0x17890714 ++#define MAGIC_CHECK(is,should) if (unlikely((is) != (should))) \ ++ { printk(KERN_ERR "magic mismatch: %x (expected %x)\n",is,should); BUG(); } ++ ++/* Global structure which contains information about number of channels ++ and protection variables */ ++struct device_params { ++ ++ struct mutex reszwrap_mutex; /* Semaphore for array */ ++ struct completion compl_isr; /* Completion for interrupt */ ++ struct videobuf_queue_ops vbq_ops; /* videobuf queue operations */ ++}; ++ ++/* Register mapped structure which contains the every register ++ information */ ++struct resizer_config { ++ u32 rsz_pcr; /* pcr register mapping ++ * variable. ++ */ ++ u32 rsz_in_start; /* in_start register mapping ++ * variable. ++ */ ++ u32 rsz_in_size; /* in_size register mapping ++ * variable. ++ */ ++ u32 rsz_out_size; /* out_size register mapping ++ * variable. ++ */ ++ u32 rsz_cnt; /* rsz_cnt register mapping ++ * variable. ++ */ ++ u32 rsz_sdr_inadd; /* sdr_inadd register mapping ++ * variable. ++ */ ++ u32 rsz_sdr_inoff; /* sdr_inoff register mapping ++ * variable. ++ */ ++ u32 rsz_sdr_outadd; /* sdr_outadd register mapping ++ * variable. ++ */ ++ u32 rsz_sdr_outoff; /* sdr_outbuff register ++ * mapping variable. ++ */ ++ u32 rsz_coeff_horz[16]; /* horizontal coefficients ++ * mapping array. ++ */ ++ u32 rsz_coeff_vert[16]; /* vertical coefficients ++ * mapping array. ++ */ ++ u32 rsz_yehn; /* yehn(luma)register mapping ++ * variable. ++ */ ++ u32 sdr_req_exp; /* Configuration for Non ++ * real time read expand ++ */ ++}; ++struct rsz_mult { ++ s32 in_hsize; /* input frame horizontal ++ * size. ++ */ ++ s32 in_vsize; /* input frame vertical size. ++ */ ++ s32 out_hsize; /* output frame horizontal ++ * size. ++ */ ++ s32 out_vsize; /* output frame vertical ++ * size. ++ */ ++ s32 in_pitch; /* offset between two rows of ++ * input frame. ++ */ ++ s32 out_pitch; /* offset between two rows of ++ * output frame. ++ */ ++ s32 end_hsize; ++ s32 end_vsize; ++ s32 num_htap; /* 0 = 7tap; 1 = 4tap */ ++ s32 num_vtap; /* 0 = 7tap; 1 = 4tap */ ++ s32 active; ++ s32 inptyp; ++ s32 vrsz; ++ s32 hrsz; ++ s32 hstph; /* for specifying horizontal ++ * starting phase. ++ */ ++ s32 vstph; ++ s32 pix_fmt; /* # defined, UYVY or YUYV. */ ++ s32 cbilin; /* # defined, filter with luma ++ * or bi-linear. ++ */ ++ u16 tap4filt_coeffs[32]; /* horizontal filter ++ * coefficients. ++ */ ++ u16 tap7filt_coeffs[32]; /* vertical filter ++ * coefficients. ++ */ ++}; ++/* Channel specific structure contains information regarding ++ the every channel */ ++struct channel_config { ++ struct resizer_config register_config; /* Instance of register set ++ * mapping structure ++ */ ++ int status; /* Specifies whether the ++ * channel is busy or not ++ */ ++ struct mutex chanprotection_mutex; /* Pointer to channel ++ * specific protection ++ */ ++ int buf_address[VIDEO_MAX_FRAME]; ++ enum config_done config_state; ++ u8 input_buf_index, output_buf_index; ++ ++}; ++ ++/* per-filehandle data structure */ ++struct rsz_fh { ++ struct rsz_params *params; ++ struct channel_config *config; /* Pointer to channel ++ * configuration. ++ */ ++ enum v4l2_buf_type type; ++ struct videobuf_queue vbq; ++ struct device_params *device; ++ dma_addr_t isp_addr_read; /* Input/Output address */ ++ dma_addr_t isp_addr_write; /* Input/Output address */ ++ struct rsz_mult *multipass; /* Multipass to support ++ * resizing ration outside ++ * of 0.25x to 4x ++ */ ++ spinlock_t vbq_lock; /* spinlock for videobuf ++ * queues. ++ */ ++ u32 rsz_bufsize; /* channel specific buffersize ++ */ ++}; ++ ++static struct device_params *device_config; ++static struct device *rsz_device; ++static int rsz_major = -1; ++/* functions declaration */ ++static void rsz_hardware_setup(struct channel_config *rsz_conf_chan); ++static int rsz_set_params(struct rsz_mult *multipass, struct rsz_params *, ++ struct channel_config *); ++static int rsz_get_params(struct rsz_params *, struct channel_config *); ++static void rsz_copy_data(struct rsz_mult *multipass, ++ struct rsz_params *params); ++static void rsz_isr(unsigned long status, isp_vbq_callback_ptr arg1, ++ void *arg2); ++static void rsz_calculate_crop(struct channel_config *rsz_conf_chan, ++ struct rsz_cropsize *cropsize); ++static int rsz_set_multipass(struct rsz_mult *multipass, ++ struct channel_config *rsz_conf_chan); ++static int rsz_set_ratio(struct rsz_mult *multipass, ++ struct channel_config *rsz_conf_chan); ++static void rsz_config_ratio(struct rsz_mult *multipass, ++ struct channel_config *rsz_conf_chan); ++ ++/* ++ * resizer_busy - Enables the Resizer driver ++ */ ++static int inline resizer_busy(void) ++{ ++ return (omap_readl(ISPRSZ_PCR) & ISPPRV_PCR_BUSY); ++} ++ ++static void inline rsz_set_exp(unsigned int exp) ++{ ++ omap_writel(((exp & 0x3FF) << 10), ISPSBL_REG_BASE+0xF8); ++} ++/** ++ * rsz_hardware_setup - Sets hardware configuration registers ++ * @rsz_conf_chan: Structure containing channel configuration ++ * ++ * Set hardware configuration registers ++ **/ ++static void rsz_hardware_setup(struct channel_config *rsz_conf_chan) ++{ ++ int coeffcounter; ++ int coeffoffset = 0; ++ ++ omap_writel(rsz_conf_chan->register_config.rsz_cnt, ISPRSZ_CNT); ++ ++ omap_writel(rsz_conf_chan->register_config.rsz_in_start, ++ ISPRSZ_IN_START); ++ omap_writel(rsz_conf_chan->register_config.rsz_in_size, ++ ISPRSZ_IN_SIZE); ++ ++ omap_writel(rsz_conf_chan->register_config.rsz_out_size, ++ ISPRSZ_OUT_SIZE); ++ omap_writel(rsz_conf_chan->register_config.rsz_sdr_inadd, ++ ISPRSZ_SDR_INADD); ++ omap_writel(rsz_conf_chan->register_config.rsz_sdr_inoff, ++ ISPRSZ_SDR_INOFF); ++ omap_writel(rsz_conf_chan->register_config.rsz_sdr_outadd, ++ ISPRSZ_SDR_OUTADD); ++ omap_writel(rsz_conf_chan->register_config.rsz_sdr_outoff, ++ ISPRSZ_SDR_OUTOFF); ++ omap_writel(rsz_conf_chan->register_config.rsz_yehn, ISPRSZ_YENH); ++ ++ for (coeffcounter = 0; coeffcounter < MAX_COEF_COUNTER; ++ coeffcounter++) { ++ omap_writel(rsz_conf_chan->register_config. ++ rsz_coeff_horz[coeffcounter], ++ ISPRSZ_HFILT10 + coeffoffset); ++ ++ omap_writel(rsz_conf_chan->register_config. ++ rsz_coeff_vert[coeffcounter], ++ ISPRSZ_VFILT10 + coeffoffset); ++ coeffoffset = coeffoffset + COEFF_ADDRESS_OFFSET; ++ } ++ /* Configure the read expand register */ ++ rsz_set_exp(rsz_conf_chan->register_config.sdr_req_exp); ++} ++ ++/** ++ * rsz_start - Enables Resizer Wrapper ++ * @arg: Currently not used. ++ * @fh: File structure containing ISP resizer information specific to ++ * channel opened. ++ * ++ * Submits a resizing task specified by the rsz_resize structure. The call can ++ * either be blocked until the task is completed or returned immediately based ++ * on the value of the blocking argument in the rsz_resize structure. If it is ++ * blocking, the status of the task can be checked by calling ioctl ++ * RSZ_G_STATUS. Only one task can be outstanding for each logical channel. ++ * ++ * Returns 0 if successful, or -EINVAL if could not set callback for RSZR IRQ ++ * event or the state of the channel is not configured. ++ **/ ++int rsz_start(int *arg, struct rsz_fh *fh) ++{ ++ struct channel_config *rsz_conf_chan = fh->config; ++ struct rsz_mult *multipass = fh->multipass; ++ struct videobuf_queue *q = &fh->vbq; ++ struct videobuf_buffer *buf; ++ int ret; ++ ++ if (rsz_conf_chan->config_state) { ++ dev_err(rsz_device, "State not configured \n"); ++ goto err_einval; ++ } ++ if(!rsz_conf_chan->register_config.rsz_sdr_inadd || ++ !rsz_conf_chan->register_config.rsz_sdr_outadd) { ++ dev_err(rsz_device, "address is null\n"); ++ goto err_einval; ++ } ++ ++ rsz_conf_chan->status = CHANNEL_BUSY; ++ rsz_hardware_setup(rsz_conf_chan); ++ if (isp_set_callback(CBK_RESZ_DONE, rsz_isr, (void *) NULL, ++ (void *)NULL)) { ++ dev_err(rsz_device, "No callback for RSZR\n"); ++ goto err_einval; ++ } ++mult: ++ device_config->compl_isr.done = 0; ++ ispresizer_enable(1); ++ ret = wait_for_completion_interruptible(&device_config->compl_isr); ++ if (ret != 0) { ++ dev_dbg(rsz_device, "Unexpected exit from " ++ "wait_for_completion_interruptible\n"); ++ wait_for_completion(&device_config->compl_isr); ++ } ++ ++ if (multipass->active) { ++ rsz_set_multipass(multipass, rsz_conf_chan); ++ goto mult; ++ } ++ ++ rsz_conf_chan->status = CHANNEL_FREE; ++ rsz_conf_chan->register_config.rsz_sdr_outadd = 0; ++ rsz_conf_chan->register_config.rsz_sdr_inadd = 0; ++ ++ isp_unset_callback(CBK_RESZ_DONE); ++ ++ /* Empty the Videobuf queue which was filled during the qbuf */ ++ buf = q->bufs[rsz_conf_chan->input_buf_index]; ++ buf->state = VIDEOBUF_IDLE; ++ list_del(&buf->stream); ++ if (rsz_conf_chan->input_buf_index != rsz_conf_chan->output_buf_index) { ++ buf = q->bufs[rsz_conf_chan->output_buf_index]; ++ buf->state = VIDEOBUF_IDLE; ++ list_del(&buf->stream); ++ } ++ ++ return 0; ++err_einval: ++ return -EINVAL; ++} ++ ++/** ++ * rsz_set_multipass - Set resizer multipass ++ * @fh: File structure containing ISP resizer information specific to ++ * channel opened. ++ * @rsz_conf_chan: Structure containing channel configuration ++ * ++ * Returns always 0 ++ **/ ++static int rsz_set_multipass(struct rsz_mult *multipass, ++ struct channel_config *rsz_conf_chan) ++{ ++ multipass->in_hsize = multipass->out_hsize; ++ multipass->in_vsize = multipass->out_vsize; ++ multipass->out_hsize = multipass->end_hsize; ++ multipass->out_vsize = multipass->end_vsize; ++ ++ multipass->out_pitch = (multipass->inptyp ? multipass->out_hsize ++ : (multipass->out_hsize * 2)); ++ multipass->in_pitch = (multipass->inptyp ? multipass->in_hsize ++ : (multipass->in_hsize * 2)); ++ ++ rsz_set_ratio(multipass, rsz_conf_chan); ++ rsz_config_ratio(multipass, rsz_conf_chan); ++ rsz_hardware_setup(rsz_conf_chan); ++ return 0; ++} ++ ++/** ++ * rsz_copy_data - Copy data ++ * @fh: File structure containing ISP resizer information specific to ++ * channel opened. ++ * @params: Structure containing the Resizer Wrapper parameters ++ * ++ * Copy data ++ **/ ++static void rsz_copy_data(struct rsz_mult *multipass, struct rsz_params *params) ++{ ++ int i; ++ multipass->in_hsize = params->in_hsize; ++ multipass->in_vsize = params->in_vsize; ++ multipass->out_hsize = params->out_hsize; ++ multipass->out_vsize = params->out_vsize; ++ multipass->end_hsize = params->out_hsize; ++ multipass->end_vsize = params->out_vsize; ++ multipass->in_pitch = params->in_pitch; ++ multipass->out_pitch = params->out_pitch; ++ multipass->hstph = params->hstph; ++ multipass->vstph = params->vstph; ++ multipass->inptyp = params->inptyp; ++ multipass->pix_fmt = params->pix_fmt; ++ multipass->cbilin = params->cbilin; ++ ++ for (i = 0; i < 32; i++) { ++ multipass->tap4filt_coeffs[i] = params->tap4filt_coeffs[i]; ++ multipass->tap7filt_coeffs[i] = params->tap7filt_coeffs[i]; ++ } ++} ++ ++/** ++ * rsz_set_params - Set parameters for resizer wrapper ++ * @fh: File structure containing ISP resizer information specific to ++ * channel opened. ++ * @params: Structure containing the Resizer Wrapper parameters ++ * @rsz_conf_chan: Structure containing channel configuration ++ * ++ * Used to set the parameters of the Resizer hardware, including input and ++ * output image size, horizontal and vertical poly-phase filter coefficients, ++ * luma enchancement filter coefficients, etc. ++ **/ ++static int rsz_set_params(struct rsz_mult *multipass, struct rsz_params *params, ++ struct channel_config *rsz_conf_chan) ++{ ++ int mul = 1; ++ if(params->yenh_params.type < 0 || params->yenh_params.type > 2) { ++ dev_err(rsz_device, "rsz_set_params:Wrong yenh type\n"); ++ return -EINVAL; ++ } ++ if(params->in_vsize <= 0 || params->in_hsize <= 0 || ++ params->out_vsize <= 0 || params->out_hsize <= 0 || ++ params->in_pitch <= 0 || params->out_pitch <= 0) { ++ dev_err(rsz_device,"rsz_set_size:invalid size params\n"); ++ return -EINVAL; ++ } ++ if((params->inptyp != RSZ_INTYPE_YCBCR422_16BIT) && ++ (params->inptyp != RSZ_INTYPE_PLANAR_8BIT)){ ++ dev_err(rsz_device, "Invalid input type\n"); ++ return -EINVAL; ++ } ++ if((params->pix_fmt != RSZ_PIX_FMT_UYVY) && ++ (params->pix_fmt != RSZ_PIX_FMT_YUYV)) { ++ dev_err(rsz_device, "Invalid pix_fmt\n"); ++ return -EINVAL; ++ } ++ if(params->inptyp == RSZ_INTYPE_YCBCR422_16BIT) ++ mul = 2; ++ else ++ mul = 1; ++ if(params->in_pitch < (params->in_hsize * mul)) { ++ dev_err(rsz_device, "pitch is incorrect\n"); ++ return -EINVAL; ++ } ++ if(params->out_pitch < (params->out_hsize * mul)) { ++ dev_err(rsz_device,"out pitch is less than out hsize\n"); ++ return -EINVAL; ++ } ++ /* Output h size should be even */ ++ if((params->out_hsize % PIXEL_EVEN) != 0) { ++ dev_err(rsz_device, "output h size should be even\n"); ++ return -EINVAL; ++ } ++ if(params->horz_starting_pixel < 0) { ++ dev_err(rsz_device, "horz start pixel cannot be less \ ++ that zero\n"); ++ return -EINVAL; ++ } ++ ++ rsz_copy_data(multipass, params); ++ if (0 != rsz_set_ratio(multipass, rsz_conf_chan)) ++ goto err_einval; ++ ++ if(params->yenh_params.type) { ++ if((multipass->num_htap && multipass->out_hsize > ++ 1280 ) || ++ (!multipass->num_htap && multipass->out_hsize > ++ 640)) ++ goto err_einval; ++ } ++ if ((multipass->in_pitch) % ALIGN32) { ++ dev_err(rsz_device, "Invalid input pitch: %d \n", ++ multipass->in_pitch); ++ goto err_einval; ++ } ++ if ((multipass->out_pitch) % ALIGN32) { ++ dev_err(rsz_device, "Invalid output pitch %d \n", ++ multipass->out_pitch); ++ goto err_einval; ++ } ++ ++ if (INPUT_RAM) ++ params->vert_starting_pixel = 0; ++ ++ rsz_conf_chan->register_config.rsz_in_start = ++ (params->vert_starting_pixel ++ << ISPRSZ_IN_SIZE_VERT_SHIFT) ++ & ISPRSZ_IN_SIZE_VERT_MASK; ++ ++ if (params->inptyp == RSZ_INTYPE_PLANAR_8BIT) { ++ if (params->horz_starting_pixel > MAX_HORZ_PIXEL_8BIT) ++ goto err_einval; ++ } ++ if (params->inptyp == RSZ_INTYPE_YCBCR422_16BIT) { ++ if (params->horz_starting_pixel > MAX_HORZ_PIXEL_16BIT) ++ goto err_einval; ++ } ++ ++ rsz_conf_chan->register_config.rsz_in_start |= ++ params->horz_starting_pixel ++ & ISPRSZ_IN_START_HORZ_ST_MASK; ++ ++ rsz_conf_chan->register_config.rsz_yehn = ++ (params->yenh_params.type ++ << ISPRSZ_YENH_ALGO_SHIFT) ++ & ISPRSZ_YENH_ALGO_MASK; ++ ++ if (params->yenh_params.type) { ++ rsz_conf_chan->register_config.rsz_yehn |= ++ params->yenh_params.core ++ & ISPRSZ_YENH_CORE_MASK; ++ ++ rsz_conf_chan->register_config.rsz_yehn |= ++ (params->yenh_params.gain ++ << ISPRSZ_YENH_GAIN_SHIFT) ++ & ISPRSZ_YENH_GAIN_MASK; ++ ++ rsz_conf_chan->register_config.rsz_yehn |= ++ (params->yenh_params.slop ++ << ISPRSZ_YENH_SLOP_SHIFT) ++ & ISPRSZ_YENH_SLOP_MASK; ++ } ++ ++ rsz_config_ratio(multipass, rsz_conf_chan); ++ /* Default value for read expand:Taken from Davinci */ ++ rsz_conf_chan->register_config.sdr_req_exp = RSZ_DEF_REQ_EXP; ++ ++ rsz_conf_chan->config_state = STATE_CONFIGURED; ++ ++ return 0; ++err_einval: ++ return -EINVAL; ++} ++ ++/** ++ * rsz_set_ratio - Set ratio ++ * @fh: File structure containing ISP resizer information specific to ++ * channel opened. ++ * @rsz_conf_chan: Structure containing channel configuration ++ * ++ * Returns 0 if successful, -EINVAL if invalid output size, upscaling ratio is ++ * being requested, or other ratio configuration value is out of bounds ++ **/ ++static int rsz_set_ratio(struct rsz_mult *multipass, ++ struct channel_config *rsz_conf_chan) ++{ ++ int alignment = 0, hrsz, vrsz; ++ rsz_conf_chan->register_config.rsz_cnt = 0; ++ if ((multipass->out_hsize > MAX_IMAGE_WIDTH) || ++ (multipass->out_vsize > MAX_IMAGE_WIDTH)) { ++ dev_err(rsz_device, "Invalid output size!"); ++ goto err_einval; ++ } ++ if (multipass->cbilin) { ++ rsz_conf_chan->register_config.rsz_cnt = ++ BITSET(rsz_conf_chan->register_config.rsz_cnt, ++ SET_BIT_CBLIN); ++ } ++ if (INPUT_RAM) { ++ rsz_conf_chan->register_config.rsz_cnt = ++ BITSET(rsz_conf_chan->register_config.rsz_cnt, ++ SET_BIT_INPUTRAM); ++ } ++ if (multipass->inptyp == RSZ_INTYPE_PLANAR_8BIT) { ++ rsz_conf_chan->register_config.rsz_cnt = ++ BITSET(rsz_conf_chan->register_config.rsz_cnt, ++ SET_BIT_INPTYP); ++ } else { ++ rsz_conf_chan->register_config.rsz_cnt = ++ BITRESET(rsz_conf_chan->register_config. ++ rsz_cnt, SET_BIT_INPTYP); ++ if (multipass->pix_fmt == RSZ_PIX_FMT_UYVY) { ++ rsz_conf_chan->register_config.rsz_cnt = ++ BITRESET(rsz_conf_chan->register_config. ++ rsz_cnt, SET_BIT_YCPOS); ++ } else if (multipass->pix_fmt == RSZ_PIX_FMT_YUYV) { ++ rsz_conf_chan->register_config.rsz_cnt = ++ BITSET(rsz_conf_chan->register_config. ++ rsz_cnt, SET_BIT_YCPOS); ++ } ++ ++ } ++ hrsz = (multipass->in_hsize * RATIO_MULTIPLIER) / multipass->out_hsize; ++ vrsz = (multipass->in_vsize * RATIO_MULTIPLIER) / multipass->out_vsize; ++ if(hrsz < 64 || hrsz > 1024 || vrsz < 64 || vrsz > 1024){ ++ dev_err(rsz_device,"Wrong Resizing Ratio\n"); ++ goto err_einval; ++ } ++ ++ vrsz = multipass->vrsz = (multipass->in_vsize - NUM_D2TAPS) * ++ RATIO_MULTIPLIER / (multipass->out_vsize - 1); ++ hrsz = multipass->hrsz = ((multipass->in_hsize - NUM_D2TAPS) * ++ RATIO_MULTIPLIER) / (multipass->out_hsize - 1); ++ ++ /* For Width */ ++ if (multipass->hrsz <= 512) { ++ hrsz = multipass->hrsz = (multipass->in_hsize - NUM_TAPS) ++ * RATIO_MULTIPLIER ++ / (multipass->out_hsize - 1); ++ if (multipass->hrsz < 64) ++ multipass->hrsz = 64; ++ if (multipass->hrsz > 512) ++ multipass->hrsz = 512; ++ if (multipass->hstph > NUM_PHASES) ++ goto err_einval; ++ multipass->num_htap = 1; ++ } else if (multipass->hrsz >= 513 && multipass->hrsz <= 1024) { ++ if (multipass->hstph > NUM_D2PH) ++ goto err_einval; ++ multipass->num_htap = 0; ++ } ++ /* For Height */ ++ if (multipass->vrsz <= 512) { ++ vrsz = multipass->vrsz = (multipass->in_vsize - NUM_TAPS) ++ * RATIO_MULTIPLIER ++ / (multipass->out_vsize - 1); ++ if (multipass->vrsz < 64) ++ multipass->vrsz = 64; ++ if (multipass->vrsz > 512) ++ multipass->vrsz = 512; ++ if (multipass->vstph > NUM_PHASES) ++ goto err_einval; ++ multipass->num_vtap = 1; ++ } else if (multipass->vrsz >= 513 && multipass->vrsz <= 1024) { ++ if (multipass->vstph > NUM_D2PH) ++ goto err_einval; ++ multipass->num_vtap = 0; ++ } ++ if(vrsz >= 64 && vrsz <= 512) { ++ if(multipass->out_hsize > 3300) { ++ dev_err(rsz_device, "wrong output hsize\n"); ++ goto err_einval; ++ } ++ } else { ++ if(multipass->out_hsize > 1650) { ++ dev_err(rsz_device, "wrong output hsize\n"); ++ goto err_einval; ++ } ++ } ++ ++ if (multipass->vrsz < 256 && ++ (multipass->in_vsize < multipass->out_vsize)) { ++ if (multipass->inptyp == RSZ_INTYPE_PLANAR_8BIT) { ++ alignment = ALIGNMENT; ++ } else if (multipass->inptyp == RSZ_INTYPE_YCBCR422_16BIT) { ++ alignment = (ALIGNMENT / 2); ++ } else { ++ dev_err(rsz_device, "Invalid input type\n"); ++ } ++ ++ if (!(((multipass->out_hsize % PIXEL_EVEN) == 0) ++ && (multipass->out_hsize % alignment) == 0)) { ++ dev_err(rsz_device, "wrong hsize\n"); ++ goto err_einval; ++ } ++ } ++ if (multipass->hrsz >= 64 && multipass->hrsz <= 1024) { ++ if (multipass->out_hsize > MAX_IMAGE_WIDTH) { ++ dev_err(rsz_device, "wrong width\n"); ++ goto err_einval; ++ } ++ multipass->active = 0; ++ ++ } else if (multipass->hrsz > 1024) { ++ if (multipass->out_hsize > MAX_IMAGE_WIDTH) { ++ dev_err(rsz_device, "wrong width\n"); ++ goto err_einval; ++ } ++ if (multipass->hstph > NUM_D2PH) ++ goto err_einval; ++ multipass->num_htap = 0; ++ multipass->out_hsize = multipass->in_hsize * 256 / 1024; ++ if (multipass->out_hsize % ALIGN32) { ++ multipass->out_hsize += ++ abs((multipass->out_hsize % ALIGN32) - ALIGN32); ++ } ++ multipass->out_pitch = ((multipass->inptyp) ? multipass->out_hsize ++ : (multipass->out_hsize * 2)); ++ multipass->hrsz = ((multipass->in_hsize - NUM_D2TAPS) ++ * RATIO_MULTIPLIER) ++ / (multipass->out_hsize - 1); ++ multipass->active = 1; ++ ++ } ++ if (multipass->vrsz > 1024) { ++ if (multipass->out_vsize > MAX_IMAGE_WIDTH_HIGH) { ++ dev_err(rsz_device, "wrong width\n"); ++ goto err_einval; ++ } ++ ++ multipass->out_vsize = multipass->in_vsize * 256 / 1024; ++ multipass->vrsz = ((multipass->in_vsize - NUM_D2TAPS) ++ * RATIO_MULTIPLIER) ++ / (multipass->out_vsize - 1); ++ multipass->active = 1; ++ multipass->num_vtap = 0; ++ } ++ rsz_conf_chan->register_config.rsz_out_size = ++ multipass->out_hsize ++ & ISPRSZ_OUT_SIZE_HORZ_MASK; ++ ++ rsz_conf_chan->register_config.rsz_out_size |= ++ (multipass->out_vsize ++ << ISPRSZ_OUT_SIZE_VERT_SHIFT) ++ & ISPRSZ_OUT_SIZE_VERT_MASK; ++ ++ rsz_conf_chan->register_config.rsz_sdr_inoff = ++ multipass->in_pitch ++ & ISPRSZ_SDR_INOFF_OFFSET_MASK; ++ ++ rsz_conf_chan->register_config.rsz_sdr_outoff = ++ multipass->out_pitch ++ & ISPRSZ_SDR_OUTOFF_OFFSET_MASK; ++ ++ if (multipass->hrsz >= 64 && multipass->hrsz <= 512) { ++ if (multipass->hstph > NUM_PHASES) ++ goto err_einval; ++ } else if (multipass->hrsz >= 64 && multipass->hrsz <= 512) { ++ if (multipass->hstph > NUM_D2PH) ++ goto err_einval; ++ } ++ ++ rsz_conf_chan->register_config.rsz_cnt |= ++ (multipass->hstph ++ << ISPRSZ_CNT_HSTPH_SHIFT) ++ & ISPRSZ_CNT_HSTPH_MASK; ++ ++ if (multipass->vrsz >= 64 && multipass->hrsz <= 512) { ++ if (multipass->vstph > NUM_PHASES) ++ goto err_einval; ++ } else if (multipass->vrsz >= 64 && multipass->vrsz <= 512) { ++ if (multipass->vstph > NUM_D2PH) ++ goto err_einval; ++ } ++ ++ rsz_conf_chan->register_config.rsz_cnt |= ++ (multipass->vstph ++ << ISPRSZ_CNT_VSTPH_SHIFT) ++ & ISPRSZ_CNT_VSTPH_MASK; ++ ++ rsz_conf_chan->register_config.rsz_cnt |= ++ (multipass->hrsz - 1) ++ & ISPRSZ_CNT_HRSZ_MASK; ++ ++ rsz_conf_chan->register_config.rsz_cnt |= ++ ((multipass->vrsz - 1) ++ << ISPRSZ_CNT_VRSZ_SHIFT) ++ & ISPRSZ_CNT_VRSZ_MASK; ++ return 0; ++err_einval: ++ return -EINVAL; ++} ++ ++/** ++ * rsz_config_ratio - Configure ratio ++ * @fh: File structure containing ISP resizer information specific to ++ * channel opened. ++ * @rsz_conf_chan: Structure containing channel configuration ++ * ++ * Configure ratio ++ **/ ++static void rsz_config_ratio(struct rsz_mult *multipass, struct channel_config *rsz_conf_chan) ++{ ++ int hsize, vsize; ++ int coeffcounter; ++ if (multipass->hrsz <= 512) { ++ hsize = ((32 * multipass->hstph + (multipass->out_hsize - 1) ++ * multipass->hrsz + 16) >> 8) + 7; ++ } else { ++ hsize = ((64 * multipass->hstph + (multipass->out_hsize - 1) ++ * multipass->hrsz + 32) >> 8) + 7; ++ } ++ if (multipass->vrsz <= 512) { ++ vsize = ((32 * multipass->vstph + (multipass->out_vsize - 1) ++ * multipass->vrsz + 16) >> 8) + 4; ++ } else { ++ vsize = ((64 * multipass->vstph + (multipass->out_vsize - 1) ++ * multipass->vrsz + 32) >> 8) + 7; ++ } ++ rsz_conf_chan->register_config.rsz_in_size = hsize; ++ ++ rsz_conf_chan->register_config.rsz_in_size |= ++ ((vsize << ISPRSZ_IN_SIZE_VERT_SHIFT) ++ & ISPRSZ_IN_SIZE_VERT_MASK); ++ ++ for (coeffcounter = 0; coeffcounter < MAX_COEF_COUNTER; ++ coeffcounter++) { ++ if (multipass->num_htap) { ++ rsz_conf_chan->register_config. ++ rsz_coeff_horz[coeffcounter] = ++ (multipass->tap4filt_coeffs[2 ++ * coeffcounter] ++ & ISPRSZ_HFILT10_COEF0_MASK); ++ rsz_conf_chan->register_config. ++ rsz_coeff_horz[coeffcounter] |= ++ ((multipass->tap4filt_coeffs[2 ++ * coeffcounter + 1] ++ << ISPRSZ_HFILT10_COEF1_SHIFT) ++ & ISPRSZ_HFILT10_COEF1_MASK); ++ } else { ++ rsz_conf_chan->register_config. ++ rsz_coeff_horz[coeffcounter] = ++ (multipass->tap7filt_coeffs[2 ++ * coeffcounter] ++ & ISPRSZ_HFILT10_COEF0_MASK); ++ ++ rsz_conf_chan->register_config. ++ rsz_coeff_horz[coeffcounter] |= ++ ((multipass->tap7filt_coeffs[2 ++ * coeffcounter + 1] ++ << ISPRSZ_HFILT10_COEF1_SHIFT) ++ & ISPRSZ_HFILT10_COEF1_MASK); ++ } ++ ++ if (multipass->num_vtap) { ++ rsz_conf_chan->register_config. ++ rsz_coeff_vert[coeffcounter] = ++ (multipass->tap4filt_coeffs[2 ++ * coeffcounter] ++ & ISPRSZ_VFILT10_COEF0_MASK); ++ ++ rsz_conf_chan->register_config. ++ rsz_coeff_vert[coeffcounter] |= ++ ((multipass->tap4filt_coeffs[2 ++ * coeffcounter + 1] ++ << ISPRSZ_VFILT10_COEF1_SHIFT) & ++ ISPRSZ_VFILT10_COEF1_MASK); ++ } else { ++ rsz_conf_chan->register_config. ++ rsz_coeff_vert[coeffcounter] = ++ (multipass->tap7filt_coeffs[2 ++ * coeffcounter] ++ & ISPRSZ_VFILT10_COEF0_MASK); ++ rsz_conf_chan->register_config. ++ rsz_coeff_vert[coeffcounter] |= ++ ((multipass->tap7filt_coeffs[2 ++ * coeffcounter + 1] ++ << ISPRSZ_VFILT10_COEF1_SHIFT) ++ & ISPRSZ_VFILT10_COEF1_MASK); ++ } ++ } ++} ++ ++/** ++ * rsz_get_params - Gets the parameter values ++ * @params: Structure containing the Resizer Wrapper parameters ++ * @rsz_conf_chan: Structure containing channel configuration ++ * ++ * Used to get the Resizer hardware settings associated with the ++ * current logical channel represented by fd. ++ **/ ++static int rsz_get_params(struct rsz_params *params, ++ struct channel_config *rsz_conf_chan) ++{ ++ int coeffcounter; ++ ++ if (rsz_conf_chan->config_state) { ++ dev_err(rsz_device, "state not configured\n"); ++ return -EINVAL; ++ } ++ ++ params->in_hsize = rsz_conf_chan->register_config.rsz_in_size ++ & ISPRSZ_IN_SIZE_HORZ_MASK; ++ params->in_vsize = (rsz_conf_chan->register_config.rsz_in_size ++ & ISPRSZ_IN_SIZE_VERT_MASK) ++ >> ISPRSZ_IN_SIZE_VERT_SHIFT; ++ ++ params->in_pitch = rsz_conf_chan->register_config.rsz_sdr_inoff ++ & ISPRSZ_SDR_INOFF_OFFSET_MASK; ++ ++ params->out_hsize = rsz_conf_chan->register_config.rsz_out_size ++ & ISPRSZ_OUT_SIZE_HORZ_MASK; ++ ++ params->out_vsize = (rsz_conf_chan->register_config.rsz_out_size ++ & ISPRSZ_OUT_SIZE_VERT_MASK) ++ >> ISPRSZ_OUT_SIZE_VERT_SHIFT; ++ ++ params->out_pitch = rsz_conf_chan->register_config.rsz_sdr_outoff ++ & ISPRSZ_SDR_OUTOFF_OFFSET_MASK; ++ ++ params->cbilin = (rsz_conf_chan->register_config.rsz_cnt ++ & SET_BIT_CBLIN) >> SET_BIT_CBLIN; ++ ++ params->inptyp = (rsz_conf_chan->register_config.rsz_cnt ++ & ISPRSZ_CNT_INPTYP_MASK) ++ >> SET_BIT_INPTYP; ++ params->horz_starting_pixel = ((rsz_conf_chan->register_config. ++ rsz_in_start ++ & ISPRSZ_IN_START_HORZ_ST_MASK)); ++ params->vert_starting_pixel = ((rsz_conf_chan->register_config. ++ rsz_in_start ++ & ISPRSZ_IN_START_VERT_ST_MASK) ++ >> ISPRSZ_IN_START_VERT_ST_SHIFT); ++ ++ params->hstph = ((rsz_conf_chan->register_config.rsz_cnt ++ & ISPRSZ_CNT_HSTPH_MASK ++ >> ISPRSZ_CNT_HSTPH_SHIFT)); ++ params->vstph = ((rsz_conf_chan->register_config.rsz_cnt ++ & ISPRSZ_CNT_VSTPH_MASK ++ >> ISPRSZ_CNT_VSTPH_SHIFT)); ++ ++ for (coeffcounter = 0; coeffcounter < MAX_COEF_COUNTER; ++ coeffcounter++) { ++ params->tap4filt_coeffs[2 * coeffcounter] = ++ rsz_conf_chan->register_config. ++ rsz_coeff_horz[coeffcounter] ++ & ISPRSZ_HFILT10_COEF0_MASK; ++ ++ params->tap4filt_coeffs[2 * coeffcounter + 1] = ++ (rsz_conf_chan->register_config. ++ rsz_coeff_horz[coeffcounter] ++ & ISPRSZ_HFILT10_COEF1_MASK) ++ >> ISPRSZ_HFILT10_COEF1_SHIFT; ++ ++ params->tap7filt_coeffs[2 * coeffcounter] = ++ rsz_conf_chan->register_config. ++ rsz_coeff_vert[coeffcounter] ++ & ISPRSZ_VFILT10_COEF0_MASK; ++ ++ params->tap7filt_coeffs[2 * coeffcounter + 1] = ++ (rsz_conf_chan->register_config. ++ rsz_coeff_vert[coeffcounter] ++ & ISPRSZ_VFILT10_COEF1_MASK) ++ >> ISPRSZ_VFILT10_COEF1_SHIFT; ++ ++ } ++ ++ params->yenh_params.type = (rsz_conf_chan->register_config.rsz_yehn ++ & ISPRSZ_YENH_ALGO_MASK) ++ >> ISPRSZ_YENH_ALGO_SHIFT; ++ ++ params->yenh_params.core = rsz_conf_chan->register_config.rsz_yehn ++ & ISPRSZ_YENH_CORE_MASK; ++ ++ params->yenh_params.gain = (rsz_conf_chan->register_config.rsz_yehn ++ & ISPRSZ_YENH_GAIN_MASK) ++ >> ISPRSZ_YENH_GAIN_SHIFT; ++ ++ params->yenh_params.slop = (rsz_conf_chan->register_config.rsz_yehn ++ & ISPRSZ_YENH_SLOP_MASK) ++ >> ISPRSZ_YENH_SLOP_SHIFT; ++ ++ params->pix_fmt = ((rsz_conf_chan->register_config.rsz_cnt ++ & ISPRSZ_CNT_PIXFMT_MASK) ++ >> SET_BIT_YCPOS); ++ ++ if (params->pix_fmt) ++ params->pix_fmt = RSZ_PIX_FMT_UYVY; ++ else ++ params->pix_fmt = RSZ_PIX_FMT_YUYV; ++ ++ return 0; ++} ++ ++/** ++ * rsz_calculate_crop - Calculate Crop values ++ * @rsz_conf_chan: Structure containing channel configuration ++ * @cropsize: Structure containing crop parameters ++ * ++ * Calculate Crop values ++ **/ ++static void rsz_calculate_crop(struct channel_config *rsz_conf_chan, ++ struct rsz_cropsize *cropsize) ++{ ++ int luma_enable; ++ ++ cropsize->hcrop = 0; ++ cropsize->vcrop = 0; ++ ++ luma_enable = (rsz_conf_chan->register_config.rsz_yehn ++ & ISPRSZ_YENH_ALGO_MASK) ++ >> ISPRSZ_YENH_ALGO_SHIFT; ++ ++ if (luma_enable) { ++ cropsize->hcrop += 2; ++ } ++} ++ ++/** ++ * rsz_vbq_release - Videobuffer queue release ++ * @q: Structure containing the videobuffer queue file handle, and device ++ * structure which contains the actual configuration. ++ * @vb: Structure containing the videobuffer used for resizer processing. ++ **/ ++static void rsz_vbq_release(struct videobuf_queue *q, ++ struct videobuf_buffer *vb) ++{ ++ struct rsz_fh *fh = q->priv_data; ++ struct videobuf_dmabuf *dma = NULL; ++ ++ dma = videobuf_to_dma(q->bufs[vb->i]); ++ videobuf_dma_unmap(q, dma); ++ videobuf_dma_free(dma); ++ ispmmu_unmap(fh->config->buf_address[vb->i]); ++ fh->config->buf_address[vb->i] = 0; ++ ++ spin_lock(&fh->vbq_lock); ++ vb->state = VIDEOBUF_NEEDS_INIT; ++ spin_unlock(&fh->vbq_lock); ++ ++} ++ ++/** ++ * rsz_vbq_setup - Sets up the videobuffer size and validates count. ++ * @q: Structure containing the videobuffer queue file handle, and device ++ * structure which contains the actual configuration. ++ * @cnt: Number of buffers requested ++ * @size: Size in bytes of the buffer used for previewing ++ * ++ * Always returns 0. ++ **/ ++static int rsz_vbq_setup(struct videobuf_queue *q, unsigned int *cnt, ++ unsigned int *size) ++{ ++ struct rsz_fh *fh = q->priv_data; ++ struct rsz_mult *multipass = fh->multipass; ++ u32 bpp = 1, insize, outsize; ++ ++ spin_lock(&fh->vbq_lock); ++ ++ if (fh->params->inptyp == RSZ_INTYPE_YCBCR422_16BIT) ++ bpp = 2; ++ if (*cnt <= 0) ++ *cnt = VIDEO_MAX_FRAME; ++ if (*cnt > VIDEO_MAX_FRAME) ++ *cnt = VIDEO_MAX_FRAME; ++ ++ outsize = multipass->out_pitch * multipass->out_vsize; ++ insize = multipass->in_pitch * multipass->in_vsize; ++ if (*cnt == 1 && (outsize > insize)) { ++ dev_err(rsz_device, "2 buffers are required for Upscaling " ++ "mode\n"); ++ goto err_einval; ++ } ++ if (!fh->params->in_hsize || !fh->params->in_vsize) { ++ dev_err(rsz_device, "Can't setup buffer size\n"); ++ goto err_einval; ++ } else { ++ if(outsize > insize) ++ *size = outsize; ++ else ++ *size = insize; ++ ++ fh->rsz_bufsize = *size; ++ } ++ spin_unlock(&fh->vbq_lock); ++ return 0; ++err_einval: ++ spin_unlock(&fh->vbq_lock); ++ return -EINVAL; ++} ++/* ++ * This function is work around for the videobuf_iolock API, ++ * For User memory allocated with ioremap (VM_IO flag) the API ++ * get_user_pages fails. ++ * ++ * To fulfill this requirement, we have completely ignored VM layer of ++ * Linux, and configuring the ISP MMU with physical address. ++ */ ++static int omap_videobuf_dma_init_user (struct videobuf_dmabuf *dma, ++ unsigned long physp) ++{ ++ struct scatterlist *sglist; ++ int len, i = 0; ++ ++ if (dma->nr_pages == 0) ++ return -EINVAL; ++ ++ len = dma->nr_pages; ++ ++ sglist = kcalloc(len, sizeof(*sglist), GFP_KERNEL); ++ if (NULL == sglist) ++ return -ENOMEM; ++ /* */ ++ for (i = 0; i < len; i++) { ++ sglist[i].offset = 0; ++ sglist[i].length = PAGE_SIZE; ++ sglist[i].dma_address = (dma_addr_t)physp; ++ physp += PAGE_SIZE; ++ } ++ dma->sglist = sglist; ++ dma->sglen = len; ++ return 0; ++ ++} ++static int omap_videobuf_dma_init(struct videobuf_dmabuf *dma, ++ int rw, unsigned long data) ++{ ++ int err = 0; ++ ++ if(dma->nr_pages == 0) ++ return -EINVAL; ++ ++ dma->pages = kmalloc(dma->nr_pages * sizeof(struct page*), ++ GFP_KERNEL); ++ if (NULL == dma->pages) ++ return -ENOMEM; ++ ++ dma->varea = (void *) data; ++ err = get_user_pages(current,current->mm, ++ data & PAGE_MASK, dma->nr_pages, ++ rw == READ, 1, /* force */ ++ dma->pages, NULL); ++ ++ if (err != dma->nr_pages) { ++ dma->nr_pages = (err >= 0) ? err : 0; ++ printk("get_user_pages: err=%d [%d]\n",err,dma->nr_pages); ++ return err < 0 ? err : -EINVAL; ++ } ++ return 0; ++} ++ ++static int omap_videobuf_iolock(struct videobuf_queue* q, ++ struct videobuf_buffer *vb, ++ unsigned long asize) ++{ ++ int err = 0; ++ unsigned long start, first, last; ++ struct videobuf_dma_sg_memory *mem = vb->priv; ++ struct videobuf_dmabuf *dma; ++ struct vm_area_struct *vma; ++ ++ BUG_ON(!mem); ++ MAGIC_CHECK(vb->magic, MAGIC_BUFFER); ++ MAGIC_CHECK(q->int_ops->magic, MAGIC_QTYPE_OPS); ++ MAGIC_CHECK(mem->magic, MAGIC_SG_MEM); ++ ++ dma = &mem->dma; ++ dma->direction = PCI_DMA_FROMDEVICE; ++ start = vb->baddr; ++ /* Calculate number of pages required */ ++ first = (start & PAGE_MASK) >> PAGE_SHIFT; ++ last = ((start+asize-1) & PAGE_MASK) >> PAGE_SHIFT; ++ dma->offset = start & ~PAGE_MASK; ++ dma->nr_pages = last-first+1; ++ ++ /* For kernel direct-mapped memory, take the easy way */ ++ if (start >= PAGE_OFFSET) { ++ unsigned long physp = 0; ++ physp = virt_to_phys((void *)start); ++ err = omap_videobuf_dma_init_user(dma, physp); ++ if (err != 0) ++ return err; ++ } else if ((vma = find_vma(current->mm, start)) && (vma->vm_flags & VM_IO) ++ && (vma->vm_pgoff)){ ++ /* This will catch, kernel-allocated, ++ mmaped-to-usermode addresses */ ++ unsigned long physp = 0; ++ physp = (vma->vm_pgoff << PAGE_SHIFT) + (start - ++ vma->vm_start); ++ err = omap_videobuf_dma_init_user(dma, physp); ++ if (err != 0) ++ return err; ++ } ++ else { ++ down_read(¤t->mm->mmap_sem); ++ asize = PAGE_ALIGN(asize); ++ err = omap_videobuf_dma_init(&mem->dma, ++ READ, start); ++ up_read(¤t->mm->mmap_sem); ++ if (0 != err) ++ return err; ++ ++ err = videobuf_dma_map(q,&mem->dma); ++ if (0 != err) ++ return err; ++ } ++ return 0; ++} ++/** ++ * rsz_vbq_prepare - Videobuffer is prepared and mmapped. ++ * @q: Structure containing the videobuffer queue file handle, and device ++ * structure which contains the actual configuration. ++ * @vb: Structure containing the videobuffer used for resizer processing. ++ * @field: Type of field to set in videobuffer device. ++ * ++ * Returns 0 if successful, or -EINVAL if buffer couldn't get allocated, or ++ * -EIO if the ISP MMU mapping fails ++ **/ ++static int rsz_vbq_prepare(struct videobuf_queue *q, ++ struct videobuf_buffer *vb, ++ enum v4l2_field field) ++{ ++ struct rsz_fh *fh = q->priv_data; ++ struct channel_config *rsz_conf_chan = fh->config; ++ int err = 0; ++ unsigned int isp_addr, insize, outsize; ++ struct videobuf_dmabuf *dma; ++ struct rsz_mult *multipass = fh->multipass; ++ spin_lock(&fh->vbq_lock); ++ dma = videobuf_to_dma(vb); ++ if (vb->baddr) { ++ if (vb->baddr != (vb->baddr & PAGE_MASK)) { ++ dev_err(rsz_device, "Buffer address should be aligned \ ++ to PAGE_SIZE\n"); ++ return -EINVAL; ++ } ++ vb->size = fh->rsz_bufsize; ++ vb->bsize = fh->rsz_bufsize; ++ } else { ++ spin_unlock(&fh->vbq_lock); ++ dev_err(rsz_device, "No user buffer allocated\n"); ++ goto out; ++ } ++ if (vb->i) { ++ vb->width = fh->params->out_hsize; ++ vb->height = fh->params->out_vsize; ++ } else { ++ vb->width = fh->params->in_hsize; ++ vb->height = fh->params->in_vsize; ++ } ++ vb->field = field; ++ spin_unlock(&fh->vbq_lock); ++ ++ outsize = multipass->out_pitch * multipass->out_vsize; ++ insize = multipass->in_pitch * multipass->in_vsize; ++ ++ if (vb->state == VIDEOBUF_NEEDS_INIT) { ++ spin_lock(&fh->vbq_lock); ++ if(vb->memory == V4L2_MEMORY_USERPTR) ++ err = omap_videobuf_iolock(q, vb, ++ vb->i?outsize:insize); ++ else ++ err = videobuf_iolock(q, vb, NULL); ++ spin_unlock(&fh->vbq_lock); ++ if(err) { ++ rsz_vbq_release(q, vb); ++ return err; ++ } ++ isp_addr = ispmmu_map_sg(dma->sglist, dma->sglen); ++ if (!isp_addr) ++ err = -EIO; ++ else { ++ if (vb->i) { ++ rsz_conf_chan->buf_address[vb->i] = isp_addr; ++ rsz_conf_chan->register_config. ++ rsz_sdr_outadd ++ = isp_addr; ++ fh->isp_addr_write = isp_addr; ++ rsz_conf_chan->output_buf_index = vb->i; ++ } else { ++ rsz_conf_chan->buf_address[vb->i] = isp_addr; ++ rsz_conf_chan->register_config. ++ rsz_sdr_inadd ++ = isp_addr; ++ rsz_conf_chan->input_buf_index = vb->i; ++ if(outsize < insize && rsz_conf_chan-> ++ register_config. ++ rsz_sdr_outadd == 0) { ++ rsz_conf_chan->register_config. ++ rsz_sdr_outadd ++ = isp_addr; ++ rsz_conf_chan-> ++ output_buf_index = ++ vb->i; ++ } ++ fh->isp_addr_read = isp_addr; ++ } ++ } ++ ++ } else { ++ if(vb->i) { ++ rsz_conf_chan->register_config. ++ rsz_sdr_outadd = rsz_conf_chan->buf_address[vb->i]; ++ fh->isp_addr_write = rsz_conf_chan->buf_address[vb->i]; ++ rsz_conf_chan->output_buf_index = vb->i; ++ } else { ++ rsz_conf_chan->register_config. ++ rsz_sdr_inadd = rsz_conf_chan->buf_address[vb->i]; ++ rsz_conf_chan->input_buf_index = vb->i; ++ if(outsize < insize && rsz_conf_chan-> ++ register_config. ++ rsz_sdr_outadd == 0) { ++ rsz_conf_chan->register_config. ++ rsz_sdr_outadd ++ = rsz_conf_chan->buf_address[vb->i]; ++ rsz_conf_chan->output_buf_index = vb->i; ++ } ++ ++ } ++ ++ } ++ if (!err) { ++ spin_lock(&fh->vbq_lock); ++ vb->state = VIDEOBUF_PREPARED; ++ spin_unlock(&fh->vbq_lock); ++ } else ++ rsz_vbq_release(q, vb); ++out: ++ return err; ++} ++ ++static void rsz_vbq_queue(struct videobuf_queue *q, struct videobuf_buffer *vb) ++{ ++ return; ++} ++ ++/** ++ * rsz_open - Initializes and opens the Resizer Wrapper ++ * @inode: Inode structure associated with the Resizer Wrapper ++ * @filp: File structure associated with the Resizer Wrapper ++ * ++ * Returns 0 if successful, -EBUSY if its already opened or the ISP module is ++ * not available, or -ENOMEM if its unable to allocate the device in kernel ++ * space memory. ++ **/ ++static int rsz_open(struct inode *inode, struct file *filp) ++{ ++ int ret = 0; ++ struct channel_config *rsz_conf_chan; ++ struct rsz_fh *fh; ++ struct device_params *device = device_config; ++ struct rsz_params *params; ++ struct rsz_mult *multipass; ++ ++ if ((filp->f_flags & O_NONBLOCK) == O_NONBLOCK) { ++ printk(KERN_DEBUG "omap-resizer: Device is opened in " ++ "non blocking mode\n"); ++ }else{ ++ printk(KERN_DEBUG "omap-resizer: Device is opened in blocking " ++ "mode\n"); ++ } ++ fh = kzalloc(sizeof(struct rsz_fh), GFP_KERNEL); ++ if (NULL == fh) ++ return -ENOMEM; ++ ++ isp_get(); ++ ++ rsz_conf_chan = kzalloc(sizeof(struct channel_config), GFP_KERNEL); ++ if (rsz_conf_chan == NULL) { ++ dev_err(rsz_device, "\n cannot allocate memory to config"); ++ ret = -ENOMEM; ++ goto err_enomem0; ++ } ++ params = kzalloc(sizeof(struct rsz_params), GFP_KERNEL); ++ if (params == NULL) { ++ dev_err(rsz_device, "\n cannot allocate memory to params"); ++ ret = -ENOMEM; ++ goto err_enomem1; ++ } ++ multipass = kzalloc(sizeof(struct rsz_mult), GFP_KERNEL); ++ if (multipass == NULL) { ++ dev_err(rsz_device, "\n cannot allocate memory to multipass"); ++ ret = -ENOMEM; ++ goto err_enomem2; ++ } ++ fh->multipass = multipass; ++ fh->params = params; ++ fh->config = rsz_conf_chan; ++ rsz_conf_chan->config_state = STATE_NOT_CONFIGURED; ++ rsz_conf_chan->status = CHANNEL_FREE; ++ filp->private_data = fh; ++ fh->type = V4L2_BUF_TYPE_VIDEO_CAPTURE; ++ fh->device = device; ++ ++ videobuf_queue_sg_init(&fh->vbq, &device->vbq_ops, NULL, ++ &fh->vbq_lock, fh->type, ++ V4L2_FIELD_NONE, ++ sizeof(struct videobuf_buffer), fh); ++ ++ spin_lock_init(&fh->vbq_lock); ++ mutex_init(&rsz_conf_chan->chanprotection_mutex); ++ return 0; ++err_enomem2: ++ kfree(params); ++err_enomem1: ++ kfree(rsz_conf_chan); ++err_enomem0: ++ kfree(fh); ++ return ret; ++} ++ ++/** ++ * rsz_release - Releases Resizer Wrapper and frees up allocated memory ++ * @inode: Inode structure associated with the Resizer Wrapper ++ * @filp: File structure associated with the Resizer Wrapper ++ * ++ * Returns 0 if successful, or -EBUSY if channel is being used. ++ **/ ++static int rsz_release(struct inode *inode, struct file *filp) ++{ ++ int i; ++ unsigned int timeout = 0; ++ struct rsz_fh *fh = filp->private_data; ++ struct channel_config *rsz_conf_chan = fh->config; ++ struct rsz_params *params = fh->params; ++ struct rsz_mult *multipass = fh->multipass; ++ struct videobuf_queue *q = &fh->vbq; ++ ++ while((rsz_conf_chan->status != CHANNEL_FREE) && (timeout < 20)) { ++ timeout++; ++ schedule(); ++ } ++ /* Free memory allocated to the buffers */ ++ for (i = 0 ; i < VIDEO_MAX_FRAME ; i ++) { ++ struct videobuf_dmabuf *dma = NULL; ++ if(!q->bufs[i]) ++ continue; ++ dma = videobuf_to_dma(q->bufs[i]); ++ videobuf_dma_unmap(q, dma); ++ videobuf_dma_free(dma); ++ } ++ ++ videobuf_mmap_free(q); ++ fh->rsz_bufsize = 0; ++ filp->private_data = NULL; ++ kfree(rsz_conf_chan); ++ kfree(params); ++ kfree(multipass); ++ kfree(fh); ++ isp_put(); ++ fh->params = NULL; ++ fh->config = NULL; ++ return 0; ++} ++ ++/** ++ * rsz_mmap - Memory maps the Resizer Wrapper module. ++ * @file: File structure associated with the Resizer Wrapper ++ * @vma: Virtual memory area structure. ++ * ++ * Returns 0 if successful, or returned value by the videobuf_mmap_mapper() ++ * function. ++ **/ ++static int rsz_mmap(struct file *file, struct vm_area_struct *vma) ++{ ++ struct rsz_fh *fh = file->private_data; ++ ++ return videobuf_mmap_mapper(&fh->vbq, vma); ++} ++ ++/** ++ * rsz_ioctl - I/O control function for Resizer Wrapper ++ * @inode: Inode structure associated with the Resizer Wrapper. ++ * @file: File structure associated with the Resizer Wrapper. ++ * @cmd: Type of command to execute. ++ * @arg: Argument to send to requested command. ++ * ++ * Returns 0 if successful, -EBUSY if channel is being used, -1 if bad command ++ * passed or access is denied, -EFAULT if copy_from_user() or copy_to_user() ++ * fails, -EINVAL if parameter validation fails or parameter structure is not ++ * present. ++ **/ ++static long rsz_unlocked_ioctl(struct file *file, unsigned int cmd, unsigned long arg) ++{ ++ int ret = 0, i; ++ struct rsz_fh *fh = file->private_data; ++ struct device_params *device = fh->device; ++ struct channel_config *rsz_conf_chan = fh->config; ++ ++ if ((_IOC_TYPE(cmd) != RSZ_IOC_BASE) ++ || (_IOC_NR(cmd) > RSZ_IOC_MAXNR)) { ++ dev_err(rsz_device, "Bad command value \n"); ++ goto err_minusone; ++ } ++ ++ if (_IOC_DIR(cmd) & _IOC_READ) ++ ret = !access_ok(VERIFY_WRITE, (void *)arg, _IOC_SIZE(cmd)); ++ else if (_IOC_DIR(cmd) & _IOC_WRITE) ++ ret = !access_ok(VERIFY_READ, (void *)arg, _IOC_SIZE(cmd)); ++ ++ if (ret) { ++ dev_err(rsz_device, "Access denied\n"); ++ goto err_minusone; ++ } ++ ++ switch (cmd) { ++ case RSZ_REQBUF: ++ { ++ struct v4l2_requestbuffers req_buf; ++ struct videobuf_queue *q = &fh->vbq; ++ if (copy_from_user(&req_buf, (struct v4l2_requestbuffers *)arg, ++ sizeof(struct v4l2_requestbuffers))) { ++ goto err_efault; ++ } ++ if (mutex_lock_interruptible(&rsz_conf_chan->chanprotection_mutex)) ++ goto err_eintr; ++ /* Free memory allocated to the buffers */ ++ for (i = 0 ; i < VIDEO_MAX_FRAME ; i ++) { ++ struct videobuf_dmabuf *dma = NULL; ++ if(!q->bufs[i]) ++ continue; ++ if(q->bufs[i]->memory != V4L2_MEMORY_MMAP) ++ continue; ++ dma = videobuf_to_dma(q->bufs[i]); ++ videobuf_dma_unmap(q, dma); ++ videobuf_dma_free(dma); ++ ++ } ++ videobuf_mmap_free(q); ++ ++ ret = videobuf_reqbufs(q, &req_buf); ++ mutex_unlock(&rsz_conf_chan->chanprotection_mutex); ++ break; ++ } ++ case RSZ_QUERYBUF: ++ { ++ struct v4l2_buffer buf; ++ if (copy_from_user(&buf, (struct v4l2_buffer *)arg, ++ sizeof(struct v4l2_buffer))) { ++ goto err_efault; ++ } ++ if (mutex_lock_interruptible(&rsz_conf_chan->chanprotection_mutex)) ++ goto err_eintr; ++ ret = videobuf_querybuf(&fh->vbq, &buf); ++ mutex_unlock(&rsz_conf_chan->chanprotection_mutex); ++ if (copy_to_user((struct v4l2_buffer *)arg, &buf, ++ sizeof(struct v4l2_buffer))) ++ ret = -EFAULT; ++ ++ break; ++ } ++ case RSZ_QUEUEBUF: ++ { ++ struct v4l2_buffer buf; ++ if (copy_from_user(&buf, (struct v4l2_buffer *)arg, ++ sizeof(struct v4l2_buffer))) { ++ goto err_efault; ++ } ++ if (mutex_lock_interruptible(&rsz_conf_chan->chanprotection_mutex)) ++ goto err_eintr; ++ ret = videobuf_qbuf(&fh->vbq, &buf); ++ mutex_unlock(&rsz_conf_chan->chanprotection_mutex); ++ break; ++ } ++ case RSZ_S_PARAM: ++ { ++ struct rsz_params *params = fh->params; ++ if (copy_from_user(params, (struct rsz_params *)arg, ++ sizeof(struct rsz_params))) { ++ goto err_efault; ++ } ++ ret = rsz_set_params(fh->multipass, fh->params, rsz_conf_chan); ++ break; ++ } ++ case RSZ_G_PARAM: ++ ret = rsz_get_params((struct rsz_params *)arg, rsz_conf_chan); ++ break; ++ ++ case RSZ_G_STATUS: ++ { ++ struct rsz_status *status; ++ status = (struct rsz_status *)arg; ++ status->chan_busy = rsz_conf_chan->status; ++ status->hw_busy = resizer_busy(); ++ status->src = INPUT_RAM; ++ break; ++ } ++ case RSZ_RESIZE: ++ if(file->f_flags & O_NONBLOCK) { ++ if(resizer_busy()) ++ return -EBUSY; ++ else { ++ if(!mutex_trylock(&device->reszwrap_mutex)) ++ return -EBUSY; ++ } ++ } ++ else { ++ if (mutex_lock_interruptible(&device->reszwrap_mutex)) ++ goto err_eintr; ++ } ++ ret = rsz_start((int *)arg, fh); ++ mutex_unlock(&device->reszwrap_mutex); ++ break; ++ ++ case RSZ_GET_CROPSIZE: ++ rsz_calculate_crop(rsz_conf_chan, (struct rsz_cropsize *)arg); ++ break; ++ ++ case RSZ_S_EXP: ++ if (mutex_lock_interruptible(&rsz_conf_chan->chanprotection_mutex)) ++ goto err_eintr; ++ rsz_conf_chan->register_config.sdr_req_exp = *((unsigned int *)arg); ++ mutex_unlock(&rsz_conf_chan->chanprotection_mutex); ++ break; ++ default: ++ dev_err(rsz_device, "resizer_ioctl: Invalid Command Value"); ++ ret = -EINVAL; ++ } ++ ++out: ++ return (long)ret; ++err_minusone: ++ ret = -1; ++ goto out; ++err_eintr: ++ ret = -EINTR; ++ goto out; ++err_efault: ++ ret = -EFAULT; ++ goto out; ++} ++ ++static struct file_operations rsz_fops = { ++ .owner = THIS_MODULE, ++ .open = rsz_open, ++ .release = rsz_release, ++ .mmap = rsz_mmap, ++ .unlocked_ioctl = rsz_unlocked_ioctl, ++}; ++ ++/** ++ * rsz_isr - Interrupt Service Routine for Resizer wrapper ++ * @status: ISP IRQ0STATUS register value ++ * @arg1: Currently not used ++ * @arg2: Currently not used ++ * ++ * Interrupt Service Routine for Resizer wrapper ++ **/ ++static void rsz_isr(unsigned long status, isp_vbq_callback_ptr arg1, void *arg2) ++{ ++ if ((status & RESZ_DONE) != RESZ_DONE) ++ return; ++ complete(&(device_config->compl_isr)); ++} ++ ++/** ++ * resizer_platform_release - Acts when Reference count is zero ++ * @device: Structure containing ISP resizer wrapper global information ++ * ++ * This is called when the reference count goes to zero. ++ **/ ++static void resizer_platform_release(struct device *device) ++{ ++} ++ ++/** ++ * resizer_probe - Checks for device presence ++ * @device: Structure containing details of the current device. ++ * ++ * Always returns 0. ++ **/ ++static int __init resizer_probe(struct platform_device *device) ++{ ++ return 0; ++} ++ ++/** ++ * resizer_remove - Handles the removal of the driver ++ * @omap_resizer_device: Structure containing details of the current device. ++ * ++ * Always returns 0. ++ **/ ++static int resizer_remove(struct platform_device *omap_resizer_device) ++{ ++ return 0; ++} ++ ++static struct class *rsz_class = NULL; ++static struct cdev c_dev; ++static dev_t dev; ++ ++static struct platform_device omap_resizer_device = { ++ .name = OMAP_REZR_NAME, ++ .id = 2, ++ .dev = { ++ .release = resizer_platform_release, ++ } ++}; ++ ++static struct platform_driver omap_resizer_driver = { ++ .probe = resizer_probe, ++ .remove = resizer_remove, ++ .driver = { ++ .bus = &platform_bus_type, ++ .name = OMAP_REZR_NAME, ++ }, ++}; ++ ++/** ++ * omap_rsz_init - Initialization of Resizer Wrapper ++ * ++ * Returns 0 if successful, -ENOMEM if could not allocate memory, -ENODEV if ++ * could not register the wrapper as a character device, or other errors if the ++ * device or driver can't register. ++ **/ ++static int __init omap_rsz_init(void) ++{ ++ int ret = 0; ++ struct device_params *device; ++ ++ device = kzalloc(sizeof(struct device_params), GFP_KERNEL); ++ if (!device) { ++ dev_err(rsz_device, OMAP_REZR_NAME ": could not allocate " ++ "memory\n"); ++ return -ENOMEM; ++ } ++ ret = alloc_chrdev_region(&dev, 0, 1, OMAP_REZR_NAME); ++ if (ret < 0) { ++ dev_err(rsz_device, OMAP_REZR_NAME ": intialization failed. " ++ "Could not allocate region " ++ "for character device\n"); ++ kfree(device); ++ return -ENODEV; ++ } ++ /* Register the driver in the kernel */ ++ /* Initialize of character device */ ++ cdev_init(&c_dev, &rsz_fops); ++ c_dev.owner = THIS_MODULE; ++ c_dev.ops = &rsz_fops; ++ /* addding character device */ ++ ret = cdev_add(&c_dev, dev, 1); ++ if (ret) { ++ dev_err(rsz_device, OMAP_REZR_NAME ": Error adding " ++ "device - %d\n", ret); ++ goto fail2; ++ } ++ rsz_major = MAJOR(dev); ++ /* register driver as a platform driver */ ++ ret = platform_driver_register(&omap_resizer_driver); ++ if (ret) { ++ dev_err(rsz_device, OMAP_REZR_NAME ++ ": failed to register platform driver!\n"); ++ goto fail3; ++ } ++ /* Register the drive as a platform device */ ++ ret = platform_device_register(&omap_resizer_device); ++ if (ret) { ++ dev_err(rsz_device, OMAP_REZR_NAME ++ ": failed to register platform device!\n"); ++ goto fail4; ++ } ++ rsz_class = class_create(THIS_MODULE, OMAP_REZR_NAME); ++ if (!rsz_class) { ++ dev_err(rsz_device, OMAP_REZR_NAME ++ ": Failed to create class!\n"); ++ goto fail5; ++ } ++ /* make entry in the devfs */ ++ rsz_device = device_create(rsz_class, rsz_device, MKDEV(rsz_major, 0), ++ NULL,OMAP_REZR_NAME); ++ dev_dbg(rsz_device, OMAP_REZR_NAME ": Registered Resizer Wrapper\n"); ++ ++ device->vbq_ops.buf_setup = rsz_vbq_setup; ++ device->vbq_ops.buf_prepare = rsz_vbq_prepare; ++ device->vbq_ops.buf_release = rsz_vbq_release; ++ device->vbq_ops.buf_queue = rsz_vbq_queue; ++ ++ init_completion(&device->compl_isr); ++ mutex_init(&device->reszwrap_mutex); ++ device_config = device; ++ return 0; ++fail5: ++ platform_device_unregister(&omap_resizer_device); ++fail4: ++ platform_driver_unregister(&omap_resizer_driver); ++fail3: ++ cdev_del(&c_dev); ++fail2: ++ unregister_chrdev_region(dev, 1); ++ kfree(device); ++ return ret; ++} ++ ++/** ++ * omap_rsz_exit - Close of Resizer Wrapper ++ **/ ++void __exit omap_rsz_exit(void) ++{ ++ device_destroy(rsz_class, dev); ++ class_destroy(rsz_class); ++ platform_device_unregister(&omap_resizer_device); ++ platform_driver_unregister(&omap_resizer_driver); ++ cdev_del(&c_dev); ++ unregister_chrdev_region(dev, 1); ++ kfree(device_config); ++} ++ ++module_init(omap_rsz_init) ++module_exit(omap_rsz_exit) ++ ++MODULE_AUTHOR("Texas Instruments"); ++MODULE_DESCRIPTION("OMAP ISP Resizer"); ++MODULE_LICENSE("GPL"); +Index: git/drivers/media/video/isp/omap_resizer.h +=================================================================== +--- /dev/null 1970-01-01 00:00:00.000000000 +0000 ++++ git/drivers/media/video/isp/omap_resizer.h 2009-02-12 10:29:26.000000000 -0600 +@@ -0,0 +1,323 @@ ++/* ++ * drivers/media/video/isp/omap_resizer.h ++ * ++ * Include file for Resizer module wrapper in TI's OMAP3430 ISP ++ * ++ * Copyright (C) 2008 Texas Instruments, Inc. ++ * ++ * This package 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 PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR ++ * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED ++ * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. ++ */ ++ ++#ifndef OMAP_ISP_RESIZER_WRAP_H ++#define OMAP_ISP_RESIZER_WRAP_H ++ ++/* ioctls definition */ ++#define RSZ_IOC_BASE 'R' ++#define RSZ_IOC_MAXNR 8 ++ ++/*Ioctl options which are to be passed while calling the ioctl*/ ++#define RSZ_REQBUF _IOWR(RSZ_IOC_BASE, 1,\ ++ struct v4l2_requestbuffers) ++#define RSZ_QUERYBUF _IOWR(RSZ_IOC_BASE, 2,\ ++ struct v4l2_buffer) ++#define RSZ_S_PARAM _IOWR(RSZ_IOC_BASE, 3,\ ++ struct rsz_params) ++#define RSZ_G_PARAM _IOWR(RSZ_IOC_BASE, 4,\ ++ struct rsz_params) ++#define RSZ_RESIZE _IOWR(RSZ_IOC_BASE, 5, int) ++#define RSZ_G_STATUS _IOWR(RSZ_IOC_BASE, 6,\ ++ struct rsz_status) ++#define RSZ_QUEUEBUF _IOWR(RSZ_IOC_BASE, 7,\ ++ struct v4l2_buffer) ++#define RSZ_GET_CROPSIZE _IOWR(RSZ_IOC_BASE, 8,\ ++ struct rsz_cropsize) ++ ++/* Defines and Constants*/ ++ ++#define MAX_CHANNELS 16 ++#define MAX_IMAGE_WIDTH 2047 ++#define MAX_IMAGE_WIDTH_HIGH 2047 ++ ++#define ALIGNMENT 16 ++#define CHANNEL_BUSY 1 ++#define CHANNEL_FREE 0 ++#define PIXEL_EVEN 2 ++#define RATIO_MULTIPLIER 256 ++ ++/* Bit position Macro */ ++/* macro for bit set and clear */ ++#define BITSET(variable, bit) (variable) | (1 << bit) ++#define BITRESET(variable, bit) (variable) & ~(0x00000001 << (bit)) ++#define SET_BIT_INPUTRAM 28 ++#define SET_BIT_CBLIN 29 ++#define SET_BIT_INPTYP 27 ++#define SET_BIT_YCPOS 26 ++#define INPUT_RAM 1 ++#define UP_RSZ_RATIO 64 ++#define DOWN_RSZ_RATIO 512 ++#define UP_RSZ_RATIO1 513 ++#define DOWN_RSZ_RATIO1 1024 ++#define RSZ_IN_SIZE_VERT_SHIFT 16 ++#define MAX_HORZ_PIXEL_8BIT 31 ++#define MAX_HORZ_PIXEL_16BIT 15 ++#define NUM_PHASES 8 ++#define NUM_TAPS 4 ++#define NUM_D2PH 4 /* for downsampling ++ * 2+x ~ 4x, number of phases ++ */ ++#define NUM_D2TAPS 7 /* for downsampling ++ * 2+x ~ 4x,number of taps ++ */ ++#define ALIGN32 32 ++#define MAX_COEF_COUNTER 16 ++#define COEFF_ADDRESS_OFFSET 0x04 ++ ++#define RSZ_INTYPE_YCBCR422_16BIT 0 ++#define RSZ_INTYPE_PLANAR_8BIT 1 ++#define RSZ_PIX_FMT_UYVY 1 /* cb:y:cr:y */ ++#define RSZ_PIX_FMT_YUYV 0 /* y:cb:y:cr */ ++ ++enum config_done { ++ STATE_CONFIGURED, /* Resizer driver configured ++ * by application. ++ */ ++ STATE_NOT_CONFIGURED /* Resizer driver not ++ * configured by application. ++ */ ++}; ++ ++/* Structure Definitions */ ++ ++/* used to luma enhancement options */ ++ ++struct rsz_yenh { ++ int type; /* represents luma enable or ++ * disable. ++ */ ++ unsigned char gain; /* represents gain. */ ++ unsigned char slop; /* represents slop. */ ++ unsigned char core; /* Represents core value. */ ++}; ++ ++/* Conatins all the parameters for resizing. This structure ++ * is used to configure resiser parameters ++ */ ++struct rsz_params { ++ int in_hsize; /* input frame horizontal ++ * size. ++ */ ++ int in_vsize; /* input frame vertical size */ ++ int in_pitch; /* offset between two rows of ++ * input frame. ++ */ ++ int inptyp; /* for determining 16 bit or ++ * 8 bit data. ++ */ ++ int vert_starting_pixel; /* for specifying vertical ++ * starting pixel in input. ++ */ ++ int horz_starting_pixel; /* for specyfing horizontal ++ * starting pixel in input. ++ */ ++ int cbilin; /* # defined, filter with luma ++ * or bi-linear interpolation. ++ */ ++ int pix_fmt; /* # defined, UYVY or YUYV */ ++ int out_hsize; /* output frame horizontal ++ * size. ++ */ ++ int out_vsize; /* output frame vertical ++ * size. ++ */ ++ int out_pitch; /* offset between two rows of ++ * output frame. ++ */ ++ int hstph; /* for specifying horizontal ++ * starting phase. ++ */ ++ int vstph; /* for specifying vertical ++ * starting phase. ++ */ ++ u16 tap4filt_coeffs[32]; /* horizontal filter ++ * coefficients. ++ */ ++ u16 tap7filt_coeffs[32]; /* vertical filter ++ * coefficients. ++ */ ++ struct rsz_yenh yenh_params; ++}; ++ ++struct rsz_mult { ++ int in_hsize; /* input frame horizontal ++ * size. ++ */ ++ int in_vsize; /* input frame vertical size. ++ */ ++ int out_hsize; /* output frame horizontal ++ * size. ++ */ ++ int out_vsize; /* output frame vertical ++ * size. ++ */ ++ int in_pitch; /* offset between two rows of ++ * input frame. ++ */ ++ int out_pitch; /* offset between two rows of ++ * output frame. ++ */ ++ int end_hsize; ++ int end_vsize; ++ int num_htap; /* 0 = 7tap; 1 = 4tap */ ++ int num_vtap; /* 0 = 7tap; 1 = 4tap */ ++ int active; ++ int inptyp; ++ int vrsz; ++ int hrsz; ++ int hstph; /* for specifying horizontal ++ * starting phase. ++ */ ++ int vstph; ++ int pix_fmt; /* # defined, UYVY or YUYV. */ ++ int cbilin; /* # defined, filter with luma ++ * or bi-linear. ++ */ ++ u16 tap4filt_coeffs[32]; /* horizontal filter ++ * coefficients. ++ */ ++ u16 tap7filt_coeffs[32]; /* vertical filter ++ * coefficients. ++ */ ++}; ++ ++/* Contains the status of hardware and channel */ ++struct rsz_status { ++ int chan_busy; /* 1: channel is busy, ++ * 0: channel is not busy ++ */ ++ int hw_busy; /* 1: hardware is busy, ++ * 0: hardware is not busy ++ */ ++ int src; /* # defined, can be either ++ * SD-RAM or CCDC/PREVIEWER ++ */ ++}; ++ ++/* Passed by application for getting crop size */ ++struct rsz_cropsize { ++ unsigned int hcrop; /* Number of pixels per line ++ * cropped in output image. ++ */ ++ ++ unsigned int vcrop; /* Number of lines cropped ++ * in output image. ++ */ ++}; ++ ++/* Register mapped structure which contains the every register ++ information */ ++struct resizer_config { ++ u32 rsz_pcr; /* pcr register mapping ++ * variable. ++ */ ++ u32 rsz_in_start; /* in_start register mapping ++ * variable. ++ */ ++ u32 rsz_in_size; /* in_size register mapping ++ * variable. ++ */ ++ u32 rsz_out_size; /* out_size register mapping ++ * variable. ++ */ ++ u32 rsz_cnt; /* rsz_cnt register mapping ++ * variable. ++ */ ++ u32 rsz_sdr_inadd; /* sdr_inadd register mapping ++ * variable. ++ */ ++ u32 rsz_sdr_inoff; /* sdr_inoff register mapping ++ * variable. ++ */ ++ u32 rsz_sdr_outadd; /* sdr_outadd register mapping ++ * variable. ++ */ ++ u32 rsz_sdr_outoff; /* sdr_outbuff register ++ * mapping variable. ++ */ ++ u32 rsz_coeff_horz[16]; /* horizontal coefficients ++ * mapping array. ++ */ ++ u32 rsz_coeff_vert[16]; /* vertical coefficients ++ * mapping array. ++ */ ++ u32 rsz_yehn; /* yehn(luma)register mapping ++ * variable. ++ */ ++}; ++ ++/* Channel specific structure contains information regarding ++ the every channel */ ++struct channel_config { ++ struct resizer_config register_config; /* Instance of register set ++ * mapping structure ++ */ ++ int status; /* Specifies whether the ++ * channel is busy or not ++ */ ++ struct mutex chanprotection_mutex; /* Pointer to channel ++ * specific protection ++ */ ++ enum config_done config_state; ++ u8 input_buf_index, output_buf_index; ++ ++}; ++ ++/* Global structure which contains information about number of channels ++ and protection variables */ ++struct device_params { ++ ++ struct mutex reszwrap_mutex; /* Semaphore for array */ ++ struct completion compl_isr; /* Completion for interrupt */ ++ struct videobuf_queue_ops vbq_ops; /* videobuf queue operations */ ++}; ++ ++/* per-filehandle data structure */ ++struct rsz_fh { ++ struct rsz_params *params; ++ struct channel_config *config; /* Pointer to channel ++ * configuration. ++ */ ++ enum v4l2_buf_type type; ++ struct videobuf_queue vbq; ++ struct device_params *device; ++ dma_addr_t isp_addr_read; /* Input/Output address */ ++ dma_addr_t isp_addr_write; /* Input/Output address */ ++ struct rsz_mult *multipass; /* Multipass to support ++ * resizing ration outside ++ * of 0.25x to 4x ++ */ ++ spinlock_t vbq_lock; /* spinlock for videobuf ++ * queues. ++ */ ++ u32 rsz_bufsize; /* channel specific buffersize ++ */ ++}; ++ ++/* functions definition */ ++void rsz_hardware_setup(struct channel_config *rsz_conf_chan); ++int rsz_set_params(struct rsz_mult *multipass, struct rsz_params *, struct channel_config *); ++int rsz_get_params(struct rsz_params *, struct channel_config *); ++void rsz_copy_data(struct rsz_mult *multipass, struct rsz_params *params); ++void rsz_isr(unsigned long status, isp_vbq_callback_ptr arg1, void *arg2); ++void rsz_calculate_crop(struct channel_config *rsz_conf_chan, ++ struct rsz_cropsize *cropsize); ++int rsz_set_multipass(struct rsz_mult *multipass, struct channel_config *rsz_conf_chan); ++int rsz_set_ratio(struct rsz_mult *multipass, struct channel_config *rsz_conf_chan); ++void rsz_config_ratio(struct rsz_mult *multipass, struct channel_config *rsz_conf_chan); ++ ++#endif +Index: git/drivers/media/video/isp/redgamma_table.h +=================================================================== +--- /dev/null 1970-01-01 00:00:00.000000000 +0000 ++++ git/drivers/media/video/isp/redgamma_table.h 2009-02-12 10:29:26.000000000 -0600 +@@ -0,0 +1,1040 @@ ++/* ++ * drivers/media/video/isp/redgamma_table.h ++ * ++ * Gamma Table values for Red for TI's OMAP3430 Camera ISP ++ * ++ * Copyright (C) 2008 Texas Instruments, Inc. ++ * ++ * This package 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 PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR ++ * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED ++ * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. ++ */ ++ ++0, ++0, ++1, ++2, ++3, ++3, ++4, ++5, ++6, ++8, ++10, ++12, ++14, ++16, ++18, ++20, ++22, ++23, ++25, ++26, ++28, ++29, ++31, ++32, ++34, ++35, ++36, ++37, ++39, ++40, ++41, ++42, ++43, ++44, ++45, ++46, ++47, ++48, ++49, ++50, ++51, ++52, ++52, ++53, ++54, ++55, ++56, ++57, ++58, ++59, ++60, ++61, ++62, ++63, ++63, ++64, ++65, ++66, ++66, ++67, ++68, ++69, ++69, ++70, ++71, ++72, ++72, ++73, ++74, ++75, ++75, ++76, ++77, ++78, ++78, ++79, ++80, ++81, ++81, ++82, ++83, ++84, ++84, ++85, ++86, ++87, ++88, ++88, ++89, ++90, ++91, ++91, ++92, ++93, ++94, ++94, ++95, ++96, ++97, ++97, ++98, ++98, ++99, ++99, ++100, ++100, ++101, ++101, ++102, ++103, ++104, ++104, ++105, ++106, ++107, ++108, ++108, ++109, ++110, ++111, ++111, ++112, ++113, ++114, ++114, ++115, ++116, ++117, ++117, ++118, ++119, ++119, ++120, ++120, ++121, ++121, ++122, ++122, ++123, ++123, ++124, ++124, ++125, ++125, ++126, ++126, ++127, ++127, ++128, ++128, ++129, ++129, ++130, ++130, ++131, ++131, ++132, ++132, ++133, ++133, ++134, ++134, ++135, ++135, ++136, ++136, ++137, ++137, ++138, ++138, ++139, ++139, ++140, ++140, ++141, ++141, ++142, ++142, ++143, ++143, ++144, ++144, ++145, ++145, ++146, ++146, ++147, ++147, ++148, ++148, ++149, ++149, ++150, ++150, ++151, ++151, ++152, ++152, ++153, ++153, ++153, ++153, ++154, ++154, ++154, ++154, ++155, ++155, ++156, ++156, ++157, ++157, ++158, ++158, ++158, ++159, ++159, ++159, ++160, ++160, ++160, ++161, ++161, ++162, ++162, ++163, ++163, ++164, ++164, ++164, ++164, ++165, ++165, ++165, ++165, ++166, ++166, ++167, ++167, ++168, ++168, ++169, ++169, ++170, ++170, ++170, ++170, ++171, ++171, ++171, ++171, ++172, ++172, ++173, ++173, ++174, ++174, ++175, ++175, ++176, ++176, ++176, ++176, ++177, ++177, ++177, ++177, ++178, ++178, ++178, ++178, ++179, ++179, ++179, ++179, ++180, ++180, ++180, ++180, ++181, ++181, ++181, ++181, ++182, ++182, ++182, ++182, ++183, ++183, ++183, ++183, ++184, ++184, ++184, ++184, ++185, ++185, ++185, ++185, ++186, ++186, ++186, ++186, ++187, ++187, ++187, ++187, ++188, ++188, ++188, ++188, ++189, ++189, ++189, ++189, ++190, ++190, ++190, ++190, ++191, ++191, ++191, ++191, ++192, ++192, ++192, ++192, ++193, ++193, ++193, ++193, ++194, ++194, ++194, ++194, ++195, ++195, ++195, ++195, ++196, ++196, ++196, ++196, ++197, ++197, ++197, ++197, ++198, ++198, ++198, ++198, ++199, ++199, ++199, ++199, ++200, ++200, ++200, ++200, ++201, ++201, ++201, ++201, ++202, ++202, ++202, ++203, ++203, ++203, ++203, ++204, ++204, ++204, ++204, ++205, ++205, ++205, ++205, ++206, ++206, ++206, ++206, ++207, ++207, ++207, ++207, ++208, ++208, ++208, ++208, ++209, ++209, ++209, ++209, ++210, ++210, ++210, ++210, ++210, ++210, ++210, ++210, ++210, ++210, ++210, ++210, ++211, ++211, ++211, ++211, ++211, ++211, ++211, ++211, ++211, ++211, ++211, ++212, ++212, ++212, ++212, ++213, ++213, ++213, ++213, ++213, ++213, ++213, ++213, ++213, ++213, ++213, ++213, ++214, ++214, ++214, ++214, ++215, ++215, ++215, ++215, ++215, ++215, ++215, ++215, ++215, ++215, ++215, ++216, ++216, ++216, ++216, ++217, ++217, ++217, ++217, ++218, ++218, ++218, ++218, ++219, ++219, ++219, ++219, ++219, ++219, ++219, ++219, ++219, ++219, ++219, ++219, ++220, ++220, ++220, ++220, ++221, ++221, ++221, ++221, ++221, ++221, ++221, ++221, ++221, ++221, ++221, ++222, ++222, ++222, ++222, ++223, ++223, ++223, ++223, ++223, ++223, ++223, ++223, ++223, ++223, ++223, ++223, ++224, ++224, ++224, ++224, ++225, ++225, ++225, ++225, ++225, ++225, ++225, ++225, ++225, ++225, ++225, ++225, ++225, ++225, ++225, ++225, ++225, ++225, ++225, ++226, ++226, ++226, ++226, ++227, ++227, ++227, ++227, ++227, ++227, ++227, ++227, ++227, ++227, ++227, ++227, ++228, ++228, ++228, ++229, ++229, ++229, ++229, ++229, ++229, ++229, ++229, ++229, ++229, ++229, ++229, ++230, ++230, ++230, ++230, ++231, ++231, ++231, ++231, ++231, ++231, ++231, ++231, ++231, ++231, ++231, ++231, ++232, ++232, ++232, ++232, ++232, ++232, ++232, ++232, ++232, ++232, ++232, ++232, ++232, ++232, ++232, ++232, ++232, ++232, ++232, ++233, ++233, ++233, ++233, ++234, ++234, ++234, ++234, ++234, ++234, ++234, ++234, ++234, ++234, ++234, ++235, ++235, ++235, ++235, ++236, ++236, ++236, ++236, ++236, ++236, ++236, ++236, ++236, ++236, ++236, ++236, ++236, ++236, ++236, ++236, ++236, ++236, ++236, ++237, ++237, ++237, ++237, ++238, ++238, ++238, ++238, ++238, ++238, ++238, ++238, ++238, ++238, ++238, ++238, ++238, ++238, ++238, ++238, ++238, ++238, ++238, ++238, ++238, ++238, ++238, ++238, ++238, ++238, ++238, ++239, ++239, ++239, ++239, ++240, ++240, ++240, ++240, ++240, ++240, ++240, ++240, ++240, ++240, ++240, ++240, ++240, ++240, ++240, ++240, ++240, ++240, ++240, ++240, ++240, ++240, ++240, ++240, ++240, ++240, ++240, ++241, ++241, ++241, ++241, ++242, ++242, ++242, ++242, ++242, ++242, ++242, ++242, ++242, ++242, ++242, ++242, ++242, ++242, ++242, ++242, ++242, ++242, ++242, ++242, ++242, ++242, ++242, ++242, ++242, ++242, ++243, ++243, ++243, ++243, ++244, ++244, ++244, ++244, ++244, ++244, ++244, ++244, ++244, ++244, ++244, ++244, ++244, ++244, ++244, ++244, ++244, ++244, ++244, ++244, ++244, ++244, ++244, ++244, ++244, ++244, ++244, ++245, ++245, ++245, ++245, ++246, ++246, ++246, ++246, ++246, ++246, ++246, ++246, ++246, ++246, ++246, ++246, ++246, ++246, ++246, ++246, ++246, ++246, ++246, ++246, ++246, ++246, ++246, ++246, ++246, ++246, ++246, ++246, ++246, ++246, ++246, ++246, ++246, ++246, ++247, ++247, ++247, ++247, ++248, ++248, ++248, ++248, ++248, ++248, ++248, ++248, ++248, ++248, ++248, ++248, ++248, ++248, ++248, ++248, ++248, ++248, ++248, ++248, ++248, ++248, ++248, ++248, ++248, ++248, ++248, ++249, ++249, ++249, ++249, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++250, ++251, ++251, ++251, ++251, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++252, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++253, ++254, ++254, ++254, ++254, ++255, ++255, ++255, ++255, ++255, ++255, ++255, ++255, ++255, ++255, ++255, ++255, ++255, ++255, ++255, ++255, ++255, ++255, ++255, ++255, ++255, ++255, ++255, ++255, ++255, ++255, ++255 +Index: git/include/linux/omap_resizer.h +=================================================================== +--- /dev/null 1970-01-01 00:00:00.000000000 +0000 ++++ git/include/linux/omap_resizer.h 2009-02-12 10:31:16.000000000 -0600 +@@ -0,0 +1,136 @@ ++/* ++ * drivers/media/video/isp/omap_resizer.h ++ * ++ * Include file for Resizer module wrapper in TI's OMAP3430 ISP ++ * ++ * Copyright (C) 2008 Texas Instruments, Inc. ++ * ++ * This package 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 PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR ++ * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED ++ * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. ++ */ ++ ++#ifndef OMAP_RESIZER_H ++#define OMAP_RESIZER_H ++ ++#include <linux/types.h> ++ ++/* ioctls definition */ ++#define RSZ_IOC_BASE 'R' ++#define RSZ_IOC_MAXNR 9 ++ ++/*Ioctl options which are to be passed while calling the ioctl*/ ++#define RSZ_REQBUF _IOWR(RSZ_IOC_BASE, 1,\ ++ struct v4l2_requestbuffers) ++#define RSZ_QUERYBUF _IOWR(RSZ_IOC_BASE, 2, struct v4l2_buffer) ++#define RSZ_S_PARAM _IOWR(RSZ_IOC_BASE, 3, struct rsz_params) ++#define RSZ_G_PARAM _IOWR(RSZ_IOC_BASE, 4, struct rsz_params) ++#define RSZ_RESIZE _IOWR(RSZ_IOC_BASE, 5, __s32) ++#define RSZ_G_STATUS _IOWR(RSZ_IOC_BASE, 6, struct rsz_status) ++#define RSZ_QUEUEBUF _IOWR(RSZ_IOC_BASE, 7, struct v4l2_buffer) ++#define RSZ_GET_CROPSIZE _IOWR(RSZ_IOC_BASE, 8, struct rsz_cropsize) ++#define RSZ_S_EXP _IOWR(RSZ_IOC_BASE, 9, __s32) ++#define RSZ_INTYPE_YCBCR422_16BIT 0 ++#define RSZ_INTYPE_PLANAR_8BIT 1 ++#define RSZ_PIX_FMT_UYVY 1 /* cb:y:cr:y */ ++#define RSZ_PIX_FMT_YUYV 0 /* y:cb:y:cr */ ++ ++enum config_done { ++ STATE_CONFIGURED, /* Resizer driver configured ++ * by application. ++ */ ++ STATE_NOT_CONFIGURED /* Resizer driver not ++ * configured by application. ++ */ ++}; ++ ++/* Structure Definitions */ ++ ++/* used to luma enhancement options */ ++ ++struct rsz_yenh { ++ __s32 type; /* represents luma enable or ++ * disable. ++ */ ++ __u8 gain; /* represents gain. */ ++ __u8 slop; /* represents slop. */ ++ __u8 core; /* Represents core value. */ ++}; ++ ++/* Conatins all the parameters for resizing. This structure ++ * is used to configure resiser parameters ++ */ ++struct rsz_params { ++ __s32 in_hsize; /* input frame horizontal ++ * size. ++ */ ++ __s32 in_vsize; /* input frame vertical size */ ++ __s32 in_pitch; /* offset between two rows of ++ * input frame. ++ */ ++ __s32 inptyp; /* for determining 16 bit or ++ * 8 bit data. ++ */ ++ __s32 vert_starting_pixel; /* for specifying vertical ++ * starting pixel in input. ++ */ ++ __s32 horz_starting_pixel; /* for specyfing horizontal ++ * starting pixel in input. ++ */ ++ __s32 cbilin; /* # defined, filter with luma ++ * or bi-linear interpolation. ++ */ ++ __s32 pix_fmt; /* # defined, UYVY or YUYV */ ++ __s32 out_hsize; /* output frame horizontal ++ * size. ++ */ ++ __s32 out_vsize; /* output frame vertical ++ * size. ++ */ ++ __s32 out_pitch; /* offset between two rows of ++ * output frame. ++ */ ++ __s32 hstph; /* for specifying horizontal ++ * starting phase. ++ */ ++ __s32 vstph; /* for specifying vertical ++ * starting phase. ++ */ ++ __u16 tap4filt_coeffs[32]; /* horizontal filter ++ * coefficients. ++ */ ++ __u16 tap7filt_coeffs[32]; /* vertical filter ++ * coefficients. ++ */ ++ struct rsz_yenh yenh_params; ++}; ++ ++/* Contains the status of hardware and channel */ ++struct rsz_status { ++ __s32 chan_busy; /* 1: channel is busy, ++ * 0: channel is not busy ++ */ ++ __s32 hw_busy; /* 1: hardware is busy, ++ * 0: hardware is not busy ++ */ ++ __s32 src; /* # defined, can be either ++ * SD-RAM or CCDC/PREVIEWER ++ */ ++}; ++ ++/* Passed by application for getting crop size */ ++struct rsz_cropsize { ++ __u32 hcrop; /* Number of pixels per line ++ * cropped in output image. ++ */ ++ ++ __u32 vcrop; /* Number of lines cropped ++ * in output image. ++ */ ++}; ++ ++#endif +Index: git/drivers/media/video/Kconfig +=================================================================== +--- git.orig/drivers/media/video/Kconfig 2009-02-12 10:24:15.000000000 -0600 ++++ git/drivers/media/video/Kconfig 2009-02-12 10:34:27.000000000 -0600 +@@ -370,6 +370,8 @@ + To compile this driver as a module, choose M here: the + module will be called tvp5150. + ++source "drivers/media/video/isp/Kconfig" ++ + config VIDEO_VPX3220 + tristate "vpx3220a, vpx3216b & vpx3214c video decoders" + depends on VIDEO_V4L1 && I2C +Index: git/drivers/media/video/isp/Kconfig +=================================================================== +--- /dev/null 1970-01-01 00:00:00.000000000 +0000 ++++ git/drivers/media/video/isp/Kconfig 2009-02-12 14:53:17.000000000 -0600 +@@ -0,0 +1,13 @@ ++config VIDEO_OMAP34XX_ISP ++ tristate "omap isp driver" ++ depends on ARCH_OMAP34XX ++ select VIDEOBUF_DMA_SG ++ ++config VIDEO_OMAP34XX_ISP_PREVIEWER ++ tristate "omap isp previewer" ++ depends on VIDEO_OMAP34XX_ISP && !ARCH_OMAP3410 ++ ++config VIDEO_OMAP34XX_ISP_RESIZER ++ tristate "omap isp resizer" ++ depends on VIDEO_OMAP34XX_ISP && !ARCH_OMAP3410 ++ +Index: git/drivers/media/video/Makefile +=================================================================== +--- git.orig/drivers/media/video/Makefile 2009-02-12 11:02:15.000000000 -0600 ++++ git/drivers/media/video/Makefile 2009-02-12 11:03:13.000000000 -0600 +@@ -18,6 +18,8 @@ + obj-$(CONFIG_VIDEO_DEV) += v4l1-compat.o + endif + ++obj-y += isp/ ++ + obj-$(CONFIG_VIDEO_TUNER) += tuner.o + + obj-$(CONFIG_VIDEO_BT848) += bt8xx/ +Index: git/drivers/media/video/isp/Makefile +=================================================================== +--- /dev/null 1970-01-01 00:00:00.000000000 +0000 ++++ git/drivers/media/video/isp/Makefile 2009-02-12 11:13:53.000000000 -0600 +@@ -0,0 +1,9 @@ ++# Makefile for OMAP3 ISP driver ++ ++obj-$(CONFIG_VIDEO_OMAP34XX_ISP) += isp.o ispccdc.o ispmmu.o ++ ++obj-$(CONFIG_VIDEO_OMAP34XX_ISP_PREVIEWER) += isppreview.o isph3a.o isphist.o \ ++ omap_previewer.o isp_af.o ++ ++obj-$(CONFIG_VIDEO_OMAP34XX_ISP_RESIZER) += ispresizer.o omap_resizer.o ++ +Index: git/drivers/media/video/isp/ispccd_lsc.dat +=================================================================== +--- /dev/null 1970-01-01 00:00:00.000000000 +0000 ++++ git/drivers/media/video/isp/ispccd_lsc.dat 2009-02-12 11:38:30.000000000 -0600 +@@ -0,0 +1,123 @@ ++0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, ++0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, ++0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, ++0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, ++0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, ++0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, ++0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, ++0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, ++0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, ++0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, ++0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, ++0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, ++0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, ++0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, ++0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, ++0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, ++0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, ++0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, ++0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, ++0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, ++0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, ++0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, ++0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, ++0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, ++0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, ++0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, ++0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, ++0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, ++0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, ++0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, ++0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, ++0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, ++0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, ++0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, ++0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, ++0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, ++0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, ++0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, ++0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, ++0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, ++0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, ++0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, ++0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, ++0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, ++0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, ++0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, ++0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, ++0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, ++0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, ++0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, ++0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, ++0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, ++0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, ++0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, ++0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, ++0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, ++0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, ++0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, ++0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, ++0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, ++0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, ++0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, ++0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, ++0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, ++0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, ++0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, ++0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, ++0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, ++0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, ++0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, ++0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, ++0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, ++0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, ++0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, ++0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, ++0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, ++0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, ++0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, ++0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, ++0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, ++0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, ++0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, ++0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, ++0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, ++0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, ++0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, ++0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, ++0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, ++0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, ++0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, ++0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, ++0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, ++0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, ++0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, ++0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, ++0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, ++0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, ++0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, ++0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, ++0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, ++0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, ++0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, ++0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, ++0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, ++0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, ++0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, ++0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, ++0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, ++0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, ++0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, ++0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, ++0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, ++0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, ++0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, ++0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, ++0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, ++0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, ++0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, ++0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, ++0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, ++0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, ++0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, ++0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68, 0x40, 0x40, 0x68, 0x68 +Index: git/include/media/videobuf-dma-sg.h +=================================================================== +--- git.orig/include/media/videobuf-dma-sg.h 2009-02-12 12:03:38.000000000 -0600 ++++ git/include/media/videobuf-dma-sg.h 2009-02-12 14:02:41.000000000 -0600 +@@ -68,6 +68,9 @@ + /* for kernel buffers */ + void *vmalloc; + ++ /* Stores the userspace pointer to vmalloc area */ ++ void *varea; ++ + /* for overlay buffers (pci-pci dma) */ + dma_addr_t bus_addr; + diff --git a/packages/linux/linux-omap-2.6.28/overo/defconfig b/packages/linux/linux-omap-2.6.28/overo/defconfig index c92e425140..0a8821e97c 100644 --- a/packages/linux/linux-omap-2.6.28/overo/defconfig +++ b/packages/linux/linux-omap-2.6.28/overo/defconfig @@ -1,7 +1,7 @@ # # Automatically generated make config: don't edit # Linux kernel version: 2.6.28-omap1 -# Wed Feb 4 12:40:38 2009 +# Mon Feb 16 13:35:13 2009 # CONFIG_ARM=y CONFIG_SYS_SUPPORTS_APM_EMULATION=y @@ -588,7 +588,7 @@ CONFIG_MTD_NAND=y # CONFIG_MTD_NAND_ECC_SMC is not set # CONFIG_MTD_NAND_MUSEUM_IDS is not set # CONFIG_MTD_NAND_GPIO is not set -# CONFIG_MTD_NAND_OMAP2 is not set +CONFIG_MTD_NAND_OMAP2=y CONFIG_MTD_NAND_IDS=y # CONFIG_MTD_NAND_DISKONCHIP is not set # CONFIG_MTD_NAND_NANDSIM is not set @@ -599,7 +599,15 @@ CONFIG_MTD_NAND_IDS=y # # UBI - Unsorted block images # -# CONFIG_MTD_UBI is not set +CONFIG_MTD_UBI=y +CONFIG_MTD_UBI_WL_THRESHOLD=4096 +CONFIG_MTD_UBI_BEB_RESERVE=1 +# CONFIG_MTD_UBI_GLUEBI is not set + +# +# UBI debugging options +# +# CONFIG_MTD_UBI_DEBUG is not set # CONFIG_PARPORT is not set CONFIG_BLK_DEV=y # CONFIG_BLK_DEV_COW_COMMON is not set @@ -616,6 +624,7 @@ CONFIG_CDROM_PKTCDVD_BUFFERS=8 # CONFIG_CDROM_PKTCDVD_WCACHE is not set # CONFIG_ATA_OVER_ETH is not set # CONFIG_MISC_DEVICES is not set +CONFIG_EEPROM_93CX6=y CONFIG_HAVE_IDE=y # CONFIG_IDE is not set @@ -696,8 +705,36 @@ CONFIG_NETDEV_10000=y # Wireless LAN # # CONFIG_WLAN_PRE80211 is not set -# CONFIG_WLAN_80211 is not set +CONFIG_WLAN_80211=y +CONFIG_LIBERTAS=m +CONFIG_LIBERTAS_USB=m +CONFIG_LIBERTAS_SDIO=m +# CONFIG_LIBERTAS_DEBUG is not set +CONFIG_LIBERTAS_THINFIRM=m +CONFIG_LIBERTAS_THINFIRM_USB=m +CONFIG_USB_ZD1201=m +CONFIG_USB_NET_RNDIS_WLAN=m +CONFIG_RTL8187=y +# CONFIG_MAC80211_HWSIM is not set +CONFIG_P54_COMMON=m +CONFIG_P54_USB=m # CONFIG_IWLWIFI_LEDS is not set +CONFIG_HOSTAP=m +CONFIG_HOSTAP_FIRMWARE=y +# CONFIG_HOSTAP_FIRMWARE_NVRAM is not set +# CONFIG_B43 is not set +# CONFIG_B43LEGACY is not set +CONFIG_ZD1211RW=m +# CONFIG_ZD1211RW_DEBUG is not set +CONFIG_RT2X00=m +CONFIG_RT2500USB=m +CONFIG_RT73USB=m +CONFIG_RT2X00_LIB_USB=m +CONFIG_RT2X00_LIB=m +CONFIG_RT2X00_LIB_FIRMWARE=y +CONFIG_RT2X00_LIB_CRYPTO=y +CONFIG_RT2X00_LIB_LEDS=y +# CONFIG_RT2X00_DEBUG is not set # # USB Network Adapters @@ -1243,8 +1280,42 @@ CONFIG_FONT_8x16=y # CONFIG_FONT_10x18 is not set # CONFIG_LOGO is not set CONFIG_SOUND=y -# CONFIG_SOUND_OSS_CORE is not set -# CONFIG_SND is not set +CONFIG_SOUND_OSS_CORE=y +CONFIG_SND=y +CONFIG_SND_TIMER=y +CONFIG_SND_PCM=y +CONFIG_SND_HWDEP=m +CONFIG_SND_RAWMIDI=m +CONFIG_SND_SEQUENCER=m +# CONFIG_SND_SEQ_DUMMY is not set +CONFIG_SND_OSSEMUL=y +CONFIG_SND_MIXER_OSS=m +CONFIG_SND_PCM_OSS=m +CONFIG_SND_PCM_OSS_PLUGINS=y +# CONFIG_SND_SEQUENCER_OSS is not set +# CONFIG_SND_DYNAMIC_MINORS is not set +CONFIG_SND_SUPPORT_OLD_API=y +CONFIG_SND_VERBOSE_PROCFS=y +# CONFIG_SND_VERBOSE_PRINTK is not set +# CONFIG_SND_DEBUG is not set +CONFIG_SND_DRIVERS=y +# CONFIG_SND_DUMMY is not set +# CONFIG_SND_VIRMIDI 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=m +CONFIG_SND_USB_CAIAQ=m +CONFIG_SND_USB_CAIAQ_INPUT=y +CONFIG_SND_SOC=y +CONFIG_SND_OMAP_SOC=y +CONFIG_SND_OMAP_SOC_MCBSP=y +CONFIG_SND_OMAP_SOC_OVERO=y +# CONFIG_SND_SOC_ALL_CODECS is not set +CONFIG_SND_SOC_TWL4030=y # CONFIG_SOUND_PRIME is not set CONFIG_HID_SUPPORT=y CONFIG_HID=y @@ -1601,14 +1672,25 @@ CONFIG_EXT2_FS=y # CONFIG_EXT2_FS_XIP is not set CONFIG_EXT3_FS=y # CONFIG_EXT3_FS_XATTR is not set -# CONFIG_EXT4_FS is not set +CONFIG_EXT4_FS=m +# CONFIG_EXT4DEV_COMPAT is not set +CONFIG_EXT4_FS_XATTR=y +# CONFIG_EXT4_FS_POSIX_ACL is not set +# CONFIG_EXT4_FS_SECURITY is not set CONFIG_JBD=y # CONFIG_JBD_DEBUG is not set +CONFIG_JBD2=m +# CONFIG_JBD2_DEBUG is not set +CONFIG_FS_MBCACHE=m # CONFIG_REISERFS_FS is not set # CONFIG_JFS_FS is not set CONFIG_FS_POSIX_ACL=y CONFIG_FILE_LOCKING=y -# CONFIG_XFS_FS is not set +CONFIG_XFS_FS=m +# CONFIG_XFS_QUOTA is not set +# CONFIG_XFS_POSIX_ACL is not set +# CONFIG_XFS_RT is not set +# CONFIG_XFS_DEBUG is not set # CONFIG_OCFS2_FS is not set CONFIG_DNOTIFY=y CONFIG_INOTIFY=y @@ -1681,6 +1763,12 @@ CONFIG_JFFS2_RUBIN=y CONFIG_JFFS2_CMODE_PRIORITY=y # CONFIG_JFFS2_CMODE_SIZE is not set # CONFIG_JFFS2_CMODE_FAVOURLZO is not set +CONFIG_UBIFS_FS=y +CONFIG_UBIFS_FS_XATTR=y +CONFIG_UBIFS_FS_ADVANCED_COMPR=y +CONFIG_UBIFS_FS_LZO=y +CONFIG_UBIFS_FS_ZLIB=y +# CONFIG_UBIFS_FS_DEBUG is not set # CONFIG_CRAMFS is not set # CONFIG_VXFS_FS is not set # CONFIG_MINIX_FS is not set @@ -1937,8 +2025,8 @@ CONFIG_CRYPTO_TWOFISH_COMMON=m # # Compression # -CONFIG_CRYPTO_DEFLATE=m -# CONFIG_CRYPTO_LZO is not set +CONFIG_CRYPTO_DEFLATE=y +CONFIG_CRYPTO_LZO=y # # Random Number Generation @@ -1951,7 +2039,7 @@ CONFIG_CRYPTO_HW=y # CONFIG_BITREVERSE=y CONFIG_CRC_CCITT=y -CONFIG_CRC16=m +CONFIG_CRC16=y CONFIG_CRC_T10DIF=y CONFIG_CRC_ITU_T=y CONFIG_CRC32=y diff --git a/packages/linux/linux-omap-2.6.28/overo/overo-ehci.patch b/packages/linux/linux-omap-2.6.28/overo/overo-ehci.patch new file mode 100644 index 0000000000..ff81d98095 --- /dev/null +++ b/packages/linux/linux-omap-2.6.28/overo/overo-ehci.patch @@ -0,0 +1,113 @@ +diff --git a/arch/arm/mach-omap2/usb-ehci.c b/arch/arm/mach-omap2/usb-ehci.c +index 489439d..2c6305b 100644 +--- a/arch/arm/mach-omap2/usb-ehci.c ++++ b/arch/arm/mach-omap2/usb-ehci.c +@@ -152,9 +152,7 @@ static void setup_ehci_io_mux(void) + void __init usb_ehci_init(void) + { + #if defined(CONFIG_USB_EHCI_HCD) || defined(CONFIG_USB_EHCI_HCD_MODULE) +- /* Setup Pin IO MUX for EHCI */ +- if (cpu_is_omap34xx()) +- setup_ehci_io_mux(); ++ /* TODO: Setup Pin IO MUX for EHCI - moved this temporarily to U-boot */ + + if (platform_device_register(&ehci_device) < 0) { + printk(KERN_ERR "Unable to register HS-USB (EHCI) device\n"); + +diff --git a/drivers/usb/host/ehci-omap.c b/drivers/usb/host/ehci-omap.c +index 1b3266c..8472996 100644 +--- a/drivers/usb/host/ehci-omap.c ++++ b/drivers/usb/host/ehci-omap.c +@@ -48,16 +48,26 @@ + * to get the PHY state machine in working state + */ + #define EXTERNAL_PHY_RESET ++#ifdef CONFIG_MACH_OVERO ++#define EXT_PHY_RESET_GPIO_PORT2 (183) ++#else + #define EXT_PHY_RESET_GPIO_PORT1 (57) + #define EXT_PHY_RESET_GPIO_PORT2 (61) ++#endif + #define EXT_PHY_RESET_DELAY (10) + ++#define PHY_STP_PULLUP_ENABLE (0x10) ++#define PHY_STP_PULLUP_DISABLE (0x90) ++ ++ + /* ISSUE2: + * USBHOST supports External charge pump PHYs only + * Use the VBUS from Port1 to power VBUS of Port2 externally + * So use Port2 as the working ULPI port + */ ++#ifndef CONFIG_MACH_OVERO + #define VBUS_INTERNAL_CHARGEPUMP_HACK ++#endif + + #endif /* CONFIG_OMAP_EHCI_PHY_MODE */ + +@@ -225,14 +235,43 @@ static int omap_start_ehc(struct platform_device *dev, struct usb_hcd *hcd) + + #ifdef EXTERNAL_PHY_RESET + /* Refer: ISSUE1 */ ++#ifndef CONFIG_MACH_OVERO + gpio_request(EXT_PHY_RESET_GPIO_PORT1, "USB1 PHY reset"); + gpio_direction_output(EXT_PHY_RESET_GPIO_PORT1, 0); ++#endif + gpio_request(EXT_PHY_RESET_GPIO_PORT2, "USB2 PHY reset"); + gpio_direction_output(EXT_PHY_RESET_GPIO_PORT2, 0); ++ gpio_set_value(EXT_PHY_RESET_GPIO_PORT2, 0); + /* Hold the PHY in RESET for enough time till DIR is high */ + udelay(EXT_PHY_RESET_DELAY); + #endif + ++ /* ++ * The PHY register 0x7 - Interface Control register is ++ * configured to disable the integrated STP pull-up resistor ++ * used for interface protection. ++ * ++ * May not need to be here. ++ */ ++ omap_writel((0x7 << EHCI_INSNREG05_ULPI_REGADD_SHIFT) |/* interface reg */ ++ (2 << EHCI_INSNREG05_ULPI_OPSEL_SHIFT) |/* Write */ ++ (1 << EHCI_INSNREG05_ULPI_PORTSEL_SHIFT) |/* Port1 */ ++ (1 << EHCI_INSNREG05_ULPI_CONTROL_SHIFT) |/* Start */ ++ (PHY_STP_PULLUP_DISABLE), ++ EHCI_INSNREG05_ULPI); ++ ++ while (!(omap_readl(EHCI_INSNREG05_ULPI) & (1<<EHCI_INSNREG05_ULPI_CONTROL_SHIFT))); ++ ++ /* Force PHY to HS */ ++ omap_writel((0x4 << EHCI_INSNREG05_ULPI_REGADD_SHIFT) |/* function ctrl */ ++ (2 << EHCI_INSNREG05_ULPI_OPSEL_SHIFT) |/* Write */ ++ (1 << EHCI_INSNREG05_ULPI_PORTSEL_SHIFT) |/* Port1 */ ++ (1 << EHCI_INSNREG05_ULPI_CONTROL_SHIFT) |/* Start */ ++ (0x40), ++ EHCI_INSNREG05_ULPI); ++ ++ while (!(omap_readl(EHCI_INSNREG05_ULPI) & (1<<EHCI_INSNREG05_ULPI_CONTROL_SHIFT))); ++ + /* Configure TLL for 60Mhz clk for ULPI */ + ehci_clocks->usbtll_fck_clk = clk_get(&dev->dev, USBHOST_TLL_FCLK); + if (IS_ERR(ehci_clocks->usbtll_fck_clk)) +@@ -307,7 +346,9 @@ static int omap_start_ehc(struct platform_device *dev, struct usb_hcd *hcd) + * Hold the PHY in RESET for enough time till PHY is settled and ready + */ + udelay(EXT_PHY_RESET_DELAY); ++#ifndef CONFIG_MACH_OVERO + gpio_set_value(EXT_PHY_RESET_GPIO_PORT1, 1); ++#endif + gpio_set_value(EXT_PHY_RESET_GPIO_PORT2, 1); + #endif + +@@ -393,7 +434,9 @@ static void omap_stop_ehc(struct platform_device *dev, struct usb_hcd *hcd) + + + #ifdef EXTERNAL_PHY_RESET ++#ifndef CONFIG_MACH_OVERO + gpio_free(EXT_PHY_RESET_GPIO_PORT1); ++#endif + gpio_free(EXT_PHY_RESET_GPIO_PORT2); + #endif + +-- +1.6.0.4.790.gaa14a diff --git a/packages/linux/linux-omap_2.6.28.bb b/packages/linux/linux-omap_2.6.28.bb index 21eb2cf6fb..ff1c5d2521 100644 --- a/packages/linux/linux-omap_2.6.28.bb +++ b/packages/linux/linux-omap_2.6.28.bb @@ -7,11 +7,12 @@ COMPATIBLE_MACHINE = "omap5912osk|omap1710h3|omap2430sdp|omap2420h4|beagleboard| DEFAULT_PREFERENCE = "-1" DEFAULT_PREFERENCE_beagleboard = "1" +DEFAULT_PREFERENCE_overo = "1" SRCREV = "79d042a081d3e467c735bb0d9569ed6296f85a3c" PV = "2.6.28" -PR = "r12" +PR = "r13" SRC_URI = "git://git.kernel.org/pub/scm/linux/kernel/git/tmlind/linux-omap-2.6.git;branch=omap-2.6.28;protocol=git \ file://defconfig" @@ -47,18 +48,23 @@ SRC_URI_append = " \ file://0013-DSS-OMAPFB-remove-extra-spaces.patch;patch=1 \ file://0014-DSS-fix-clk_get_usecount.patch;patch=1 \ file://0001-ASoC-Add-support-for-OMAP3-EVM.patch;patch=1 \ - file://0001-This-merges-Steve-Kipisz-USB-EHCI-support.-He-star.patch;patch=1 \ file://0001-board-omap3beagle-set-i2c-3-to-100kHz.patch;patch=1 \ + file://add-resizer-driver.patch;patch=1 \ " SRC_URI_append_beagleboard = " file://logo_linux_clut224.ppm \ + file://0001-This-merges-Steve-Kipisz-USB-EHCI-support.-He-star.patch;patch=1 \ " SRC_URI_append_omap3evm = " \ file://evm-mcspi-ts.diff;patch=1 \ " +SRC_URI_append_overo = " \ + file://overo-ehci.patch;patch=1 \ +" + S = "${WORKDIR}/git" diff --git a/packages/linux/linux-orion/defconfig b/packages/linux/linux-orion/defconfig index e2ce06256e..84ddcf0e7e 100644 --- a/packages/linux/linux-orion/defconfig +++ b/packages/linux/linux-orion/defconfig @@ -1,7 +1,7 @@ # # Automatically generated make config: don't edit -# Linux kernel version: 2.6.27.10 -# Fri Jan 23 22:58:28 2009 +# Linux kernel version: 2.6.28.4 +# Tue Feb 10 18:45:26 2009 # CONFIG_ARM=y CONFIG_SYS_SUPPORTS_APM_EMULATION=y @@ -22,8 +22,6 @@ CONFIG_RWSEM_GENERIC_SPINLOCK=y # CONFIG_ARCH_HAS_ILOG2_U64 is not set CONFIG_GENERIC_HWEIGHT=y CONFIG_GENERIC_CALIBRATE_DELAY=y -CONFIG_ARCH_SUPPORTS_AOUT=y -CONFIG_ZONE_DMA=y CONFIG_GENERIC_HARDIRQS_NO__DO_IRQ=y CONFIG_VECTORS_BASE=0xffff0000 CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" @@ -78,7 +76,9 @@ CONFIG_SIGNALFD=y CONFIG_TIMERFD=y CONFIG_EVENTFD=y CONFIG_SHMEM=y +CONFIG_AIO=y CONFIG_VM_EVENT_COUNTERS=y +CONFIG_PCI_QUIRKS=y CONFIG_SLAB=y # CONFIG_SLUB is not set # CONFIG_SLOB is not set @@ -86,15 +86,8 @@ CONFIG_SLAB=y # CONFIG_MARKERS is not set CONFIG_HAVE_OPROFILE=y # CONFIG_KPROBES is not set -# CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS is not set -# CONFIG_HAVE_IOREMAP_PROT is not set CONFIG_HAVE_KPROBES=y CONFIG_HAVE_KRETPROBES=y -# CONFIG_HAVE_ARCH_TRACEHOOK is not set -# CONFIG_HAVE_DMA_ATTRS is not set -# CONFIG_USE_GENERIC_SMP_HELPERS is not set -# CONFIG_HAVE_CLK is not set -CONFIG_PROC_PAGE_MONITOR=y CONFIG_HAVE_GENERIC_DMA_COHERENT=y CONFIG_SLABINFO=y CONFIG_RT_MUTEXES=y @@ -127,6 +120,7 @@ CONFIG_DEFAULT_CFQ=y # CONFIG_DEFAULT_NOOP is not set CONFIG_DEFAULT_IOSCHED="cfq" CONFIG_CLASSIC_RCU=y +# CONFIG_FREEZER is not set # # System Type @@ -167,7 +161,7 @@ CONFIG_ARCH_ORION5X=y # CONFIG_ARCH_LH7A40X is not set # CONFIG_ARCH_DAVINCI is not set # CONFIG_ARCH_OMAP is not set -# CONFIG_ARCH_MSM7X00A is not set +# CONFIG_ARCH_MSM is not set # # Orion Implementations @@ -177,15 +171,19 @@ CONFIG_ARCH_ORION5X=y CONFIG_MACH_KUROBOX_PRO=y CONFIG_MACH_DNS323=y CONFIG_MACH_TS209=y +# CONFIG_MACH_TERASTATION_PRO2 is not set CONFIG_MACH_LINKSTATION_PRO=y +# CONFIG_MACH_LINKSTATION_MINI is not set CONFIG_MACH_TS409=y # CONFIG_MACH_WRT350N_V2 is not set # CONFIG_MACH_TS78XX is not set CONFIG_MACH_MV2120=y +# CONFIG_MACH_EDMINI_V2 is not set # CONFIG_MACH_MSS2 is not set # CONFIG_MACH_WNR854T is not set # CONFIG_MACH_RD88F5181L_GE is not set # CONFIG_MACH_RD88F5181L_FXO is not set +# CONFIG_MACH_RD88F6183AP_GE is not set # # Boot options @@ -235,26 +233,30 @@ CONFIG_TICK_ONESHOT=y CONFIG_NO_HZ=y CONFIG_HIGH_RES_TIMERS=y CONFIG_GENERIC_CLOCKEVENTS_BUILD=y +CONFIG_VMSPLIT_3G=y +# CONFIG_VMSPLIT_2G is not set +# CONFIG_VMSPLIT_1G is not set +CONFIG_PAGE_OFFSET=0xC0000000 CONFIG_PREEMPT=y CONFIG_HZ=100 CONFIG_AEABI=y # CONFIG_OABI_COMPAT is not set CONFIG_ARCH_FLATMEM_HAS_HOLES=y -# CONFIG_ARCH_DISCONTIGMEM_ENABLE is not set +# CONFIG_ARCH_SPARSEMEM_DEFAULT is not set +# CONFIG_ARCH_SELECT_MEMORY_MODEL is not set CONFIG_SELECT_MEMORY_MODEL=y CONFIG_FLATMEM_MANUAL=y # CONFIG_DISCONTIGMEM_MANUAL is not set # CONFIG_SPARSEMEM_MANUAL is not set CONFIG_FLATMEM=y CONFIG_FLAT_NODE_MEM_MAP=y -# CONFIG_SPARSEMEM_STATIC is not set -# CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set CONFIG_PAGEFLAGS_EXTENDED=y CONFIG_SPLIT_PTLOCK_CPUS=4096 # CONFIG_RESOURCES_64BIT is not set -CONFIG_ZONE_DMA_FLAG=1 -CONFIG_BOUNCE=y +# CONFIG_PHYS_ADDR_T_64BIT is not set +CONFIG_ZONE_DMA_FLAG=0 CONFIG_VIRT_TO_BUS=y +CONFIG_UNEVICTABLE_LRU=y CONFIG_ALIGNMENT_TRAP=y # @@ -262,11 +264,16 @@ CONFIG_ALIGNMENT_TRAP=y # CONFIG_ZBOOT_ROM_TEXT=0x0 CONFIG_ZBOOT_ROM_BSS=0x0 -CONFIG_CMDLINE="" +CONFIG_CMDLINE=" debug " # CONFIG_XIP_KERNEL is not set # CONFIG_KEXEC is not set # +# CPU Power Management +# +# CONFIG_CPU_IDLE is not set + +# # Floating point emulation # @@ -279,6 +286,8 @@ CONFIG_VFP=y # Userspace binary formats # CONFIG_BINFMT_ELF=y +# CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set +CONFIG_HAVE_AOUT=y # CONFIG_BINFMT_AOUT is not set # CONFIG_BINFMT_MISC is not set @@ -357,6 +366,7 @@ CONFIG_IPV6_TUNNEL=m # CONFIG_TIPC is not set # CONFIG_ATM is not set # CONFIG_BRIDGE is not set +# CONFIG_NET_DSA is not set # CONFIG_VLAN_8021Q is not set # CONFIG_DECNET is not set CONFIG_LLC=m @@ -443,12 +453,11 @@ CONFIG_BT_HCIBPA10X=m CONFIG_BT_HCIBFUSB=m CONFIG_BT_HCIVHCI=m # CONFIG_AF_RXRPC is not set - -# -# Wireless -# +# CONFIG_PHONET is not set +CONFIG_WIRELESS=y CONFIG_CFG80211=m CONFIG_NL80211=y +CONFIG_WIRELESS_OLD_REGULATORY=y CONFIG_WIRELESS_EXT=y CONFIG_WIRELESS_EXT_SYSFS=y CONFIG_MAC80211=m @@ -457,7 +466,9 @@ CONFIG_MAC80211=m # Rate control algorithm selection # CONFIG_MAC80211_RC_PID=y +# CONFIG_MAC80211_RC_MINSTREL is not set CONFIG_MAC80211_RC_DEFAULT_PID=y +# CONFIG_MAC80211_RC_DEFAULT_MINSTREL is not set CONFIG_MAC80211_RC_DEFAULT="pid" # CONFIG_MAC80211_MESH is not set # CONFIG_MAC80211_LEDS is not set @@ -566,6 +577,7 @@ CONFIG_MTD_NAND=y CONFIG_MTD_NAND_VERIFY_WRITE=y # CONFIG_MTD_NAND_ECC_SMC is not set # CONFIG_MTD_NAND_MUSEUM_IDS is not set +# CONFIG_MTD_NAND_GPIO is not set CONFIG_MTD_NAND_IDS=y # CONFIG_MTD_NAND_DISKONCHIP is not set # CONFIG_MTD_NAND_CAFE is not set @@ -738,6 +750,7 @@ CONFIG_SATA_MV=y # CONFIG_PATA_SCH is not set CONFIG_MD=y CONFIG_BLK_DEV_MD=y +CONFIG_MD_AUTODETECT=y # CONFIG_MD_LINEAR is not set CONFIG_MD_RAID0=m CONFIG_MD_RAID1=m @@ -775,8 +788,25 @@ CONFIG_NETDEVICES=y # CONFIG_TUN is not set # CONFIG_VETH is not set # CONFIG_ARCNET is not set +CONFIG_PHYLIB=y + +# +# MII PHY device drivers +# +# 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_ICPLUS_PHY is not set +# CONFIG_REALTEK_PHY is not set +# CONFIG_FIXED_PHY is not set +# CONFIG_MDIO_BITBANG is not set # CONFIG_NET_ETHERNET is not set -CONFIG_MII=y +CONFIG_MII=m CONFIG_NETDEV_1000=y # CONFIG_ACENIC is not set # CONFIG_DL2K is not set @@ -798,6 +828,7 @@ CONFIG_MV643XX_ETH=y # CONFIG_QLA3XXX is not set # CONFIG_ATL1 is not set # CONFIG_ATL1E is not set +# CONFIG_JME is not set # CONFIG_NETDEV_10000 is not set # CONFIG_TR is not set @@ -809,6 +840,7 @@ CONFIG_WLAN_80211=y # CONFIG_IPW2100 is not set # CONFIG_IPW2200 is not set # CONFIG_LIBERTAS is not set +# CONFIG_LIBERTAS_THINFIRM is not set # CONFIG_HERMES is not set # CONFIG_ATMEL is not set # CONFIG_PRISM54 is not set @@ -833,14 +865,15 @@ CONFIG_P54_USB=m CONFIG_ZD1211RW=m CONFIG_ZD1211RW_DEBUG=y CONFIG_RT2X00=m -CONFIG_RT2X00_LIB=m -CONFIG_RT2X00_LIB_USB=m -CONFIG_RT2X00_LIB_FIRMWARE=y # CONFIG_RT2400PCI is not set # CONFIG_RT2500PCI is not set # CONFIG_RT61PCI is not set CONFIG_RT2500USB=m CONFIG_RT73USB=m +CONFIG_RT2X00_LIB_USB=m +CONFIG_RT2X00_LIB=m +CONFIG_RT2X00_LIB_FIRMWARE=y +CONFIG_RT2X00_LIB_CRYPTO=y # CONFIG_RT2X00_DEBUG is not set # @@ -854,6 +887,7 @@ CONFIG_USB_USBNET=m CONFIG_USB_NET_AX8817X=m CONFIG_USB_NET_CDCETHER=m CONFIG_USB_NET_DM9601=m +# CONFIG_USB_NET_SMSC95XX is not set CONFIG_USB_NET_GL620A=m CONFIG_USB_NET_NET1080=m CONFIG_USB_NET_PLUSB=m @@ -922,7 +956,6 @@ CONFIG_INPUT_TOUCHSCREEN=y # CONFIG_TOUCHSCREEN_PENMOUNT is not set # CONFIG_TOUCHSCREEN_TOUCHRIGHT is not set # CONFIG_TOUCHSCREEN_TOUCHWIN is not set -# CONFIG_TOUCHSCREEN_UCB1400 is not set CONFIG_TOUCHSCREEN_USB_COMPOSITE=m CONFIG_TOUCHSCREEN_USB_EGALAX=y CONFIG_TOUCHSCREEN_USB_PANJIT=y @@ -1060,12 +1093,14 @@ CONFIG_I2C_DEBUG_ALGO=y # CONFIG_W1 is not set # CONFIG_POWER_SUPPLY is not set # CONFIG_HWMON is not set +# CONFIG_THERMAL is not set +# CONFIG_THERMAL_HWMON is not set # CONFIG_WATCHDOG is not set +CONFIG_SSB_POSSIBLE=y # # Sonics Silicon Backplane # -CONFIG_SSB_POSSIBLE=y # CONFIG_SSB is not set # @@ -1075,8 +1110,9 @@ CONFIG_SSB_POSSIBLE=y # CONFIG_MFD_SM501 is not set # CONFIG_HTC_PASIC3 is not set # CONFIG_MFD_TMIO is not set -# CONFIG_MFD_T7L66XB is not set -# CONFIG_MFD_TC6387XB is not set +# CONFIG_PMIC_DA903X is not set +# CONFIG_MFD_WM8400 is not set +# CONFIG_MFD_WM8350_I2C is not set # # Multimedia devices @@ -1085,15 +1121,120 @@ CONFIG_SSB_POSSIBLE=y # # Multimedia core support # -# CONFIG_VIDEO_DEV is not set +CONFIG_VIDEO_DEV=m +CONFIG_VIDEO_V4L2_COMMON=m +CONFIG_VIDEO_ALLOW_V4L1=y +CONFIG_VIDEO_V4L1_COMPAT=y # CONFIG_DVB_CORE is not set -# CONFIG_VIDEO_MEDIA is not set +CONFIG_VIDEO_MEDIA=m # # Multimedia drivers # +# CONFIG_MEDIA_ATTACH is not set +CONFIG_MEDIA_TUNER=m +# CONFIG_MEDIA_TUNER_CUSTOMIZE is not set +CONFIG_MEDIA_TUNER_SIMPLE=m +CONFIG_MEDIA_TUNER_TDA8290=m +CONFIG_MEDIA_TUNER_TDA9887=m +CONFIG_MEDIA_TUNER_TEA5761=m +CONFIG_MEDIA_TUNER_TEA5767=m +CONFIG_MEDIA_TUNER_MT20XX=m +CONFIG_MEDIA_TUNER_XC2028=m +CONFIG_MEDIA_TUNER_XC5000=m +CONFIG_VIDEO_V4L2=m +CONFIG_VIDEO_V4L1=m +CONFIG_VIDEOBUF_GEN=m +CONFIG_VIDEOBUF_VMALLOC=m +CONFIG_VIDEO_IR=m +CONFIG_VIDEO_TVEEPROM=m +CONFIG_VIDEO_TUNER=m +CONFIG_VIDEO_CAPTURE_DRIVERS=y +# CONFIG_VIDEO_ADV_DEBUG is not set +# CONFIG_VIDEO_FIXED_MINOR_RANGES is not set +CONFIG_VIDEO_HELPER_CHIPS_AUTO=y +CONFIG_VIDEO_IR_I2C=m +CONFIG_VIDEO_MSP3400=m +CONFIG_VIDEO_CS53L32A=m +CONFIG_VIDEO_WM8775=m +CONFIG_VIDEO_SAA711X=m +CONFIG_VIDEO_TVP5150=m +CONFIG_VIDEO_CX25840=m +CONFIG_VIDEO_CX2341X=m +# CONFIG_VIDEO_VIVI is not set +# CONFIG_VIDEO_BT848 is not set +# CONFIG_VIDEO_CPIA is not set +# CONFIG_VIDEO_CPIA2 is not set +# CONFIG_VIDEO_SAA5246A is not set +# CONFIG_VIDEO_SAA5249 is not set +# CONFIG_VIDEO_STRADIS is not set +# CONFIG_VIDEO_SAA7134 is not set +# CONFIG_VIDEO_MXB is not set +# CONFIG_VIDEO_HEXIUM_ORION is not set +# CONFIG_VIDEO_HEXIUM_GEMINI is not set +# CONFIG_VIDEO_CX88 is not set +# CONFIG_VIDEO_IVTV is not set +# CONFIG_VIDEO_CAFE_CCIC is not set +# CONFIG_SOC_CAMERA is not set +CONFIG_V4L_USB_DRIVERS=y +CONFIG_USB_VIDEO_CLASS=m +CONFIG_USB_VIDEO_CLASS_INPUT_EVDEV=y +CONFIG_USB_GSPCA=m +CONFIG_USB_M5602=m +CONFIG_USB_GSPCA_CONEX=m +CONFIG_USB_GSPCA_ETOMS=m +CONFIG_USB_GSPCA_FINEPIX=m +CONFIG_USB_GSPCA_MARS=m +CONFIG_USB_GSPCA_OV519=m +CONFIG_USB_GSPCA_PAC207=m +CONFIG_USB_GSPCA_PAC7311=m +CONFIG_USB_GSPCA_SONIXB=m +CONFIG_USB_GSPCA_SONIXJ=m +CONFIG_USB_GSPCA_SPCA500=m +CONFIG_USB_GSPCA_SPCA501=m +CONFIG_USB_GSPCA_SPCA505=m +CONFIG_USB_GSPCA_SPCA506=m +CONFIG_USB_GSPCA_SPCA508=m +CONFIG_USB_GSPCA_SPCA561=m +CONFIG_USB_GSPCA_STK014=m +CONFIG_USB_GSPCA_SUNPLUS=m +CONFIG_USB_GSPCA_T613=m +CONFIG_USB_GSPCA_TV8532=m +CONFIG_USB_GSPCA_VC032X=m +CONFIG_USB_GSPCA_ZC3XX=m +CONFIG_VIDEO_PVRUSB2=m +CONFIG_VIDEO_PVRUSB2_SYSFS=y +# CONFIG_VIDEO_PVRUSB2_DEBUGIFC is not set +CONFIG_VIDEO_EM28XX=m +CONFIG_VIDEO_EM28XX_ALSA=m +CONFIG_VIDEO_USBVISION=m +CONFIG_VIDEO_USBVIDEO=m +CONFIG_USB_VICAM=m +CONFIG_USB_IBMCAM=m +CONFIG_USB_KONICAWC=m +CONFIG_USB_QUICKCAM_MESSENGER=m +CONFIG_USB_ET61X251=m +CONFIG_VIDEO_OVCAMCHIP=m +CONFIG_USB_W9968CF=m +CONFIG_USB_OV511=m +CONFIG_USB_SE401=m +CONFIG_USB_SN9C102=m +CONFIG_USB_STV680=m +CONFIG_USB_ZC0301=m +CONFIG_USB_PWC=m +# CONFIG_USB_PWC_DEBUG is not set +CONFIG_USB_ZR364XX=m +CONFIG_USB_STKWEBCAM=m +CONFIG_USB_S2255=m +CONFIG_RADIO_ADAPTERS=y +# CONFIG_RADIO_GEMTEK_PCI is not set +# CONFIG_RADIO_MAXIRADIO is not set +# CONFIG_RADIO_MAESTRO is not set +CONFIG_USB_DSBR=m +# CONFIG_USB_SI470X is not set +# CONFIG_USB_MR800 is not set CONFIG_DAB=y -# CONFIG_USB_DABUSB is not set +CONFIG_USB_DABUSB=m # # Graphics support @@ -1116,6 +1257,7 @@ CONFIG_DAB=y CONFIG_DUMMY_CONSOLE=y CONFIG_FONT_8x16=y CONFIG_SOUND=m +CONFIG_SOUND_OSS_CORE=y CONFIG_SND=m CONFIG_SND_TIMER=m CONFIG_SND_PCM=m @@ -1162,6 +1304,8 @@ CONFIG_USB_DEVICE_CLASS=y # CONFIG_USB_OTG_WHITELIST is not set # CONFIG_USB_OTG_BLACKLIST_HUB is not set # CONFIG_USB_MON is not set +# CONFIG_USB_WUSB is not set +# CONFIG_USB_WUSB_CBAF is not set # # USB Host Controller Drivers @@ -1179,6 +1323,8 @@ CONFIG_USB_OHCI_LITTLE_ENDIAN=y CONFIG_USB_UHCI_HCD=y CONFIG_USB_SL811_HCD=y # CONFIG_USB_R8A66597_HCD is not set +# CONFIG_USB_WHCI_HCD is not set +# CONFIG_USB_HWA_HCD is not set # # USB Device Class drivers @@ -1186,13 +1332,14 @@ CONFIG_USB_SL811_HCD=y CONFIG_USB_ACM=m CONFIG_USB_PRINTER=m CONFIG_USB_WDM=m +# CONFIG_USB_TMC is not set # -# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support' +# NOTE: USB_STORAGE depends on SCSI but BLK_DEV_SD may also be needed; # # -# may also be needed; see USB_STORAGE Help for more information +# see USB_STORAGE Help for more information # CONFIG_USB_STORAGE=y # CONFIG_USB_STORAGE_DEBUG is not set @@ -1282,6 +1429,7 @@ CONFIG_USB_SERIAL_OMNINET=m CONFIG_USB_EMI62=m CONFIG_USB_EMI26=m # CONFIG_USB_ADUTUX is not set +# CONFIG_USB_SEVSEG is not set CONFIG_USB_RIO500=m CONFIG_USB_LEGOTOWER=m CONFIG_USB_LCD=m @@ -1300,13 +1448,15 @@ CONFIG_USB_SISUSBVGA_CON=y # CONFIG_USB_IOWARRIOR is not set # CONFIG_USB_TEST is not set CONFIG_USB_ISIGHTFW=m +# CONFIG_USB_VST is not set # CONFIG_USB_GADGET is not set +# CONFIG_UWB is not set CONFIG_MMC=m # CONFIG_MMC_DEBUG is not set # CONFIG_MMC_UNSAFE_RESUME is not set # -# MMC/SD Card Drivers +# MMC/SD/SDIO Card Drivers # CONFIG_MMC_BLOCK=m CONFIG_MMC_BLOCK_BOUNCE=y @@ -1314,10 +1464,12 @@ CONFIG_MMC_BLOCK_BOUNCE=y # CONFIG_MMC_TEST is not set # -# MMC/SD Host Controller Drivers +# MMC/SD/SDIO Host Controller Drivers # # CONFIG_MMC_SDHCI is not set # CONFIG_MMC_TIFM_SD is not set +# CONFIG_MEMSTICK is not set +# CONFIG_ACCESSIBILITY is not set # CONFIG_NEW_LEDS is not set CONFIG_RTC_LIB=y CONFIG_RTC_CLASS=y @@ -1350,6 +1502,7 @@ CONFIG_RTC_DRV_M41T80=y # CONFIG_RTC_DRV_M41T80_WDT is not set CONFIG_RTC_DRV_S35390A=y # CONFIG_RTC_DRV_FM3130 is not set +# CONFIG_RTC_DRV_RX8581 is not set # # SPI RTC drivers @@ -1359,12 +1512,15 @@ CONFIG_RTC_DRV_S35390A=y # 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_BQ4802 is not set # CONFIG_RTC_DRV_V3020 is not set # @@ -1383,14 +1539,7 @@ CONFIG_DMA_ENGINE=y # # CONFIG_NET_DMA is not set # CONFIG_DMATEST is not set - -# -# Voltage and Current regulators -# # CONFIG_REGULATOR is not set -# CONFIG_REGULATOR_FIXED_VOLTAGE is not set -# CONFIG_REGULATOR_VIRTUAL_CONSUMER is not set -# CONFIG_REGULATOR_BQ24022 is not set # CONFIG_UIO is not set # @@ -1405,7 +1554,7 @@ CONFIG_EXT3_FS=y CONFIG_EXT3_FS_XATTR=y CONFIG_EXT3_FS_POSIX_ACL=y CONFIG_EXT3_FS_SECURITY=y -# CONFIG_EXT4DEV_FS is not set +# CONFIG_EXT4_FS is not set CONFIG_JBD=y CONFIG_FS_MBCACHE=y CONFIG_REISERFS_FS=y @@ -1420,6 +1569,7 @@ CONFIG_JFS_SECURITY=y # CONFIG_JFS_DEBUG is not set CONFIG_JFS_STATISTICS=y CONFIG_FS_POSIX_ACL=y +CONFIG_FILE_LOCKING=y CONFIG_XFS_FS=y CONFIG_XFS_QUOTA=y CONFIG_XFS_POSIX_ACL=y @@ -1464,6 +1614,7 @@ CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1" # CONFIG_PROC_FS=y CONFIG_PROC_SYSCTL=y +CONFIG_PROC_PAGE_MONITOR=y CONFIG_SYSFS=y CONFIG_TMPFS=y # CONFIG_TMPFS_POSIX_ACL is not set @@ -1517,6 +1668,7 @@ CONFIG_NFS_ACL_SUPPORT=y CONFIG_NFS_COMMON=y CONFIG_SUNRPC=y CONFIG_SUNRPC_GSS=y +# CONFIG_SUNRPC_REGISTER_V4 is not set CONFIG_RPCSEC_GSS_KRB5=y # CONFIG_RPCSEC_GSS_SPKM3 is not set # CONFIG_SMB_FS is not set @@ -1604,15 +1756,15 @@ CONFIG_FRAME_WARN=1024 # CONFIG_DEBUG_BUGVERBOSE is not set # CONFIG_DEBUG_MEMORY_INIT is not set CONFIG_FRAME_POINTER=y +# CONFIG_RCU_CPU_STALL_DETECTOR is not set # CONFIG_LATENCYTOP is not set CONFIG_SYSCTL_SYSCALL_CHECK=y -CONFIG_HAVE_FTRACE=y -CONFIG_HAVE_DYNAMIC_FTRACE=y -# CONFIG_FTRACE is not set -# CONFIG_IRQSOFF_TRACER is not set -# CONFIG_PREEMPT_TRACER is not set -# CONFIG_SCHED_TRACER is not set -# CONFIG_CONTEXT_SWITCH_TRACER is not set +CONFIG_HAVE_FUNCTION_TRACER=y + +# +# Tracers +# +# CONFIG_DYNAMIC_PRINTK_DEBUG is not set # CONFIG_SAMPLES is not set CONFIG_HAVE_ARCH_KGDB=y # CONFIG_DEBUG_USER is not set @@ -1622,6 +1774,7 @@ CONFIG_HAVE_ARCH_KGDB=y # # CONFIG_KEYS is not set # CONFIG_SECURITY is not set +# CONFIG_SECURITYFS is not set # CONFIG_SECURITY_FILE_CAPABILITIES is not set CONFIG_XOR_BLOCKS=m CONFIG_ASYNC_CORE=y @@ -1632,11 +1785,18 @@ CONFIG_CRYPTO=y # # Crypto core or helper # +# CONFIG_CRYPTO_FIPS is not set CONFIG_CRYPTO_ALGAPI=y +CONFIG_CRYPTO_ALGAPI2=y CONFIG_CRYPTO_AEAD=m +CONFIG_CRYPTO_AEAD2=y CONFIG_CRYPTO_BLKCIPHER=y +CONFIG_CRYPTO_BLKCIPHER2=y CONFIG_CRYPTO_HASH=m +CONFIG_CRYPTO_HASH2=y +CONFIG_CRYPTO_RNG2=y CONFIG_CRYPTO_MANAGER=y +CONFIG_CRYPTO_MANAGER2=y # CONFIG_CRYPTO_GF128MUL is not set # CONFIG_CRYPTO_NULL is not set # CONFIG_CRYPTO_CRYPTD is not set @@ -1708,6 +1868,11 @@ CONFIG_CRYPTO_DES=y # CONFIG_CRYPTO_DEFLATE=m # CONFIG_CRYPTO_LZO is not set + +# +# Random Number Generation +# +# CONFIG_CRYPTO_ANSI_CPRNG is not set CONFIG_CRYPTO_HW=y # CONFIG_CRYPTO_DEV_HIFN_795X is not set @@ -1715,8 +1880,6 @@ CONFIG_CRYPTO_HW=y # Library routines # CONFIG_BITREVERSE=y -# CONFIG_GENERIC_FIND_FIRST_BIT is not set -# CONFIG_GENERIC_FIND_NEXT_BIT is not set CONFIG_CRC_CCITT=y CONFIG_CRC16=y CONFIG_CRC_T10DIF=y diff --git a/packages/linux/linux-orion_2.6.27.10.bb b/packages/linux/linux-orion_2.6.28.4.bb index 500d959a9a..c0a7d3c9af 100644 --- a/packages/linux/linux-orion_2.6.27.10.bb +++ b/packages/linux/linux-orion_2.6.28.4.bb @@ -1,19 +1,19 @@ DESCRIPTION = "Linux Kernel for Marvell Orion based devices" SECTION = "kernel" LICENSE = "GPL" -PR = "r6" +PR = "r0" COMPATIBLE_MACHINE = "(dns323|mv2120|kuropro|lspro|tsx09|ts409)" require linux.inc -SRC_URI = "${KERNELORG_MIRROR}/pub/linux/kernel/v2.6/linux-2.6.27.tar.bz2 \ +SRC_URI = "${KERNELORG_MIRROR}/pub/linux/kernel/v2.6/linux-2.6.28.tar.bz2 \ ${KERNELORG_MIRROR}/pub/linux/kernel/v2.6/patch-${PV}.gz;patch=1 \ file://kuropro-foonas-mtd.patch;patch=1 \ file://fw-and-powerpc-install.patch;patch=1 \ file://defconfig \ " -S = "${WORKDIR}/linux-2.6.27" +S = "${WORKDIR}/linux-2.6.28" # Fix the mach-type of orion devices - always passed 526 SRC_URI_append_dns323 += "file://dns323.patch;patch=1" diff --git a/packages/linux/linux_2.6.25.20.bb b/packages/linux/linux_2.6.25.20.bb new file mode 100644 index 0000000000..7b9308cf1d --- /dev/null +++ b/packages/linux/linux_2.6.25.20.bb @@ -0,0 +1,32 @@ +########################################### +#@MAINTAINER: Marco Cavallini <m.cavallini@koansoftware.com> +# linux_2.6.25.20.bb +# recipe file for PM9261 and PM9263 +########################################### + +require linux.inc + +PR = "r2" + +DEFAULT_PREFERENCE_ronetix-pm9263 = "1" +DEFAULT_PREFERENCE_ronetix-pm9261 = "1" + +SRC_URI = "${KERNELORG_MIRROR}/pub/linux/kernel/v2.6/linux-2.6.25.tar.bz2 \ + ${KERNELORG_MIRROR}/pub/linux/kernel/v2.6/patch-2.6.25.20.bz2;patch=1 \ + file://defconfig" + +# WARNING: for following patched is required the proper entry in conf/checksums.ini + +SRC_URI_append_ronetix-pm9263 = " \ + http://maxim.org.za/AT91RM9200/2.6/2.6.25-at91.patch.gz;patch=1 \ + http://download.ronetix.info/sk-eb926x/linux/kernel/2.6.25.4/linux-2.6.25.4-ronetix-08-11-02.2228.patch;patch=1 \ + http://download.ronetix.info/sk-eb926x/linux/kernel/2.6.25.4/socketcan-driver-at91.patch;patch=1 \ + " + +SRC_URI_append_ronetix-pm9261 = " \ + http://maxim.org.za/AT91RM9200/2.6/2.6.25-at91.patch.gz;patch=1 \ + http://download.ronetix.info/sk-eb926x/linux/kernel/2.6.25.4/linux-2.6.25.4-ronetix-08-11-02.2228.patch;patch=1 \ + http://download.ronetix.info/sk-eb926x/linux/kernel/2.6.25.4/socketcan-driver-at91.patch;patch=1 \ + " + +S = "${WORKDIR}/linux-2.6.25/" diff --git a/packages/linux/linux_2.6.27.bb b/packages/linux/linux_2.6.27.bb index 7da406a0d3..4b094bf48c 100644 --- a/packages/linux/linux_2.6.27.bb +++ b/packages/linux/linux_2.6.27.bb @@ -1,6 +1,6 @@ require linux.inc -PR = "r3" +PR = "r4" # Mark archs/machines that this kernel supports DEFAULT_PREFERENCE = "-1" @@ -21,8 +21,8 @@ SRC_URI_append_boc01 = "\ file://010-090112-mii.patch;patch=1 \ file://011-090115-gpio.patch;patch=1 \ file://012-090115-cy3218-btns.patch;patch=1 \ - file://013-090116-lcd.patch;patch=1 \ - file://014-090115-pm-wakeup.patch;patch=1 \ + file://013-090209-lcd.patch;patch=1 \ + file://014-090209-pm-wakeup.patch;patch=1 \ " SRC_URI_append_progear = "file://progear-bl.patch;patch=1\ diff --git a/packages/linux/linux_2.6.28.bb b/packages/linux/linux_2.6.28.bb index 393209c3be..603fe49cd7 100644 --- a/packages/linux/linux_2.6.28.bb +++ b/packages/linux/linux_2.6.28.bb @@ -1,12 +1,14 @@ require linux.inc -PR = "r2" +PR = "r4" # Mark archs/machines that this kernel supports DEFAULT_PREFERENCE = "-1" DEFAULT_PREFERENCE_at91sam9263ek = "28" +DEFAULT_PREFERENCE_ronetix-pm9263 = "28" DEFAULT_PREFERENCE_stb225 = "28" +DEFAULT_PREFERENCE_collie = "1" SRC_URI = "${KERNELORG_MIRROR}/pub/linux/kernel/v2.6/linux-2.6.28.tar.bz2 \ file://defconfig" @@ -15,8 +17,40 @@ SRC_URI_append_at91sam9263ek = " \ file://linux-2.6.28-at91.patch.bz2;patch=1 \ file://linux-2.6.28-exp.patch.bz2;patch=1 " +SRC_URI_append_ronetix-pm9263 = " \ + file://linux-2.6.28-at91.patch.bz2;patch=1 \ + file://linux-2.6.28-exp.patch.bz2;patch=1 \ + file://linux-2.6.28-at91-ronetix-12012009.patch;patch=1 " + SRC_URI_append_stb225 = " \ file://uImage.patch;patch=1 \ file://ebase-fix.patch;patch=1 \ file://enable-uart.patch;patch=1 \ file://ip3902.patch;patch=1" + +SRC_URI_append_collie = " \ + file://0001-collie-start-scoop-converton-to-new-api.patch;patch=1 \ + file://0002-add-locomo_spi-driver.patch;patch=1 \ + file://0003-enable-cpufreq-for-collie.patch;patch=1 \ + file://0004-fix-dma-for-SA1100.patch;patch=1 \ + file://0005-fix-collie-keyboard-bug.patch;patch=1 \ + file://0006-add-collie-flash-hack.patch;patch=1 \ + file://0007-hostap-workaround-for-buggy-sa1100-pcmcia-driver.patch;patch=1 \ + file://0008-fix-collie-suspend-hack.patch;patch=1 \ + file://0009-add-sa1100-usb-gadget-driver-hack.patch;patch=1 \ + file://0010-mmc_spi-add-suspend-and-resume-callbacks.patch;patch=1 \ + file://0011-move-drivers-mfd-.h-to-include-linux-mfd.patch;patch=1 \ + file://0012-move-ucb1200-ts-driver.patch;patch=1 \ + file://0013-add-collie-touchscreen-driver.patch;patch=1 \ + file://0014-collie-locomo-led-change-default-trigger.patch;patch=1 \ + file://0015-SA1100-make-gpio_to_irq-and-reverse-a-macro.patch;patch=1 \ + file://0016-add-gpiolib-support-to-ucb1x00.patch;patch=1 \ + file://0017-collie-convert-to-gpiolib-for-ucb1x00.patch;patch=1 \ + file://0018-collie-add-battery-driver.patch;patch=1 \ + file://0019-collie-support-pda_power-driver.patch;patch=1 \ + file://0020-remove-collie_pm.c.patch;patch=1 \ + file://0021-mmc-trivial-annotation-of-blocks.patch;patch=1 \ + file://0022-mmc_block-print-better-error-messages.patch;patch=1 \ + file://0023-mmc_block-ensure-all-sectors-that-do-not-have-error.patch;patch=1 " + +S = "${WORKDIR}/linux-2.6.28/" diff --git a/packages/lmbench/lmbench/lmbench-run b/packages/lmbench/lmbench/lmbench-run index 3674f6d265..e904c75e43 100644 --- a/packages/lmbench/lmbench/lmbench-run +++ b/packages/lmbench/lmbench/lmbench-run @@ -7,7 +7,7 @@ SHAREDIR=/usr/share/lmbench/ BINDIR=/usr/lib/lmbench/ SCRIPTSDIR=$SHAREDIR/scripts RESULTSDIR=$SHAREDIR/results -CONFIG=$SHAREDIR/config/`$SCRIPTSDIR/config` +CONFIG=/var/lib/lmbench/config/`$SCRIPTSDIR/config` runuid=`id -u` [ $runuid -gt 0 ] && { diff --git a/packages/lmbench/lmbench_2.0.4.bb b/packages/lmbench/lmbench_2.0.4.bb index 04b78eca19..e2bed84e9c 100644 --- a/packages/lmbench/lmbench_2.0.4.bb +++ b/packages/lmbench/lmbench_2.0.4.bb @@ -1,6 +1,8 @@ SECTION = "console/utils" DESCRIPTION = "Tools for performance analysis." LICENSE = "GPL" +RDEPENDS = "debianutils" +PR = "r1" SRC_URI = "${SOURCEFORGE_MIRROR}/lmbench/lmbench-${PV}.tgz \ file://debian.patch;patch=1 \ diff --git a/packages/lmbench/lmbench_2.5.bb b/packages/lmbench/lmbench_2.5.bb index a51508017c..5c99945c2c 100644 --- a/packages/lmbench/lmbench_2.5.bb +++ b/packages/lmbench/lmbench_2.5.bb @@ -1,6 +1,8 @@ SECTION = "console/utils" DESCRIPTION = "Tools for performance analysis." LICENSE = "GPL" +RDEPENDS = "debianutils" +PR = "r1" SRC_URI = "${SOURCEFORGE_MIRROR}/lmbench/lmbench-${PV}.tgz \ file://build.patch;patch=1 \ diff --git a/packages/lowpan-utils/lowpan-utils_git.bb b/packages/lowpan-utils/lowpan-utils_git.bb new file mode 100644 index 0000000000..89a5e438ab --- /dev/null +++ b/packages/lowpan-utils/lowpan-utils_git.bb @@ -0,0 +1,21 @@ +DESCRIPTION = "LoWPAN utilities (IEEE802.15.4)" +LICENSE = "GPL" +SRCREV = "master" +SRC_URI = "git://github.com/lumag/lowpan-utils.git;protocol=git" +DEPENDS = "libnl bison-native flex-native" +PR = "r4" + +S = "${WORKDIR}/git" +PACKAGES += "${PN}-tests-dbg" +PACKAGES += "${PN}-tests" +FILES_${PN} = "${sbindir}/iz ${sbindir}/izconfig \ + ${bindir}/izchat ${bindir}/izlisten ${sbindir}/izcoordinator \ + ${sbindir}/izattach" +FILES_${PN}-tests = "${libexecdir}/zigbee ${libdir}/python*/site-packages" +FILES_${PN}-tests-dbg = "${libexecdir}/zigbee/.debug" + +inherit autotools + +do_stage() { + autotools_stage_all +} diff --git a/packages/ltp/ltp-20090131/cross-compile.patch b/packages/ltp/ltp-20090131/cross-compile.patch new file mode 100644 index 0000000000..b414b6fc0f --- /dev/null +++ b/packages/ltp/ltp-20090131/cross-compile.patch @@ -0,0 +1,352 @@ +--- + Makefile | 4 +++- + lib/Makefile | 3 --- + m4/GNUmakefile | 3 --- + pan/Makefile | 2 -- + testcases/ballista/ballista/Makefile | 2 +- + testcases/ballista/ballista/compile/Makefile | 8 ++++---- + testcases/kernel/device-drivers/acpi/Makefile | 2 +- + testcases/kernel/device-drivers/agp/user_space/Makefile | 6 +++--- + testcases/kernel/device-drivers/base/user_base/Makefile | 6 +++--- + testcases/kernel/device-drivers/dev_sim_framework/user_space/Makefile | 6 +++--- + testcases/kernel/device-drivers/drm/user_space/Makefile | 2 +- + testcases/kernel/device-drivers/include/Makefile | 2 +- + testcases/kernel/device-drivers/nls/Makefile | 2 +- + testcases/kernel/device-drivers/pci/user_tpci/Makefile | 6 +++--- + testcases/kernel/device-drivers/tbio/user_space/Makefile | 6 +++--- + testcases/kernel/device-drivers/usb/user_usb/Makefile | 6 +++--- + testcases/kernel/fs/fs-bench/Makefile | 6 +++--- + testcases/kernel/fs/scsi/ltpfs/Makefile | 2 +- + testcases/kernel/sched/hyperthreading/ht_affinity/Makefile | 4 ++-- + testcases/kernel/sched/hyperthreading/ht_enabled/Makefile | 2 +- + testcases/kernel/sched/hyperthreading/ht_interrupt/Makefile | 2 +- + 21 files changed, 38 insertions(+), 44 deletions(-) + +Index: ltp-full-20090131/Makefile +=================================================================== +--- ltp-full-20090131.orig/Makefile ++++ ltp-full-20090131/Makefile +@@ -5,14 +5,16 @@ CROSS_COMPILER = $(CROSS_COMPILE) + endif + ifdef CROSS_COMPILER + CC=$(CROSS_COMPILER)gcc ++CPP=$(CROSS_COMPILER)g++ + AR=$(CROSS_COMPILER)ar + RANLIB=$(CROSS_COMPILER)ranlib + endif ++PREFIX=/opt/ltp + + HAS_NUMA=$(shell sh tools/scripts/numa_test.sh) + + export CFLAGS += -Wall $(CROSS_CFLAGS) +-export CC AR RANLIB CPPFLAGS LDFLAGS HAS_NUMA ++export CC CPP AR RANLIB CPPFLAGS LDFLAGS HAS_NUMA + + -include config.mk + +Index: ltp-full-20090131/testcases/ballista/ballista/Makefile +=================================================================== +--- ltp-full-20090131.orig/testcases/ballista/ballista/Makefile ++++ ltp-full-20090131/testcases/ballista/ballista/Makefile +@@ -24,7 +24,7 @@ + ######################## + + # compiler info for the host +-CC = g++ -Wno-deprecated ++CC = $(CPP) -Wno-deprecated + CFLAGS += -w ${TARGET_DEF} + CLIBS = -lpthread -ldl -lnsl -rdynamic + TEST_MAN_FILE = selfHost +Index: ltp-full-20090131/testcases/ballista/ballista/compile/Makefile +=================================================================== +--- ltp-full-20090131.orig/testcases/ballista/ballista/compile/Makefile ++++ ltp-full-20090131/testcases/ballista/ballista/compile/Makefile +@@ -19,14 +19,14 @@ dFLAGS=-g -DDEBUG + FLAGS= -O -Wall + PFLAGS= -p -g3 + +-CPPCOMP= g++ ++CPPCOMP= $(CPP) + + # + # The following is "boilerplate" to set up the standard compilation + # commands: + .SUFFIXES: + .SUFFIXES: .cpp .c .cc .h .o +-.c.o: ; gcc $(FLAGS) -c $*.c ++.c.o: ; $(CC) $(FLAGS) -c $*.c + .cc.o: ; $(CPPCOMP) $(FLAGS) -c $*.cc + .cpp.o: ; $(CPPCOMP) $(FLAGS) $(INC) -c $*.cpp + .cxx.o: ; $(CPPCOMP) $(FLAGS) $(INC) -c $*.cxx +@@ -41,10 +41,10 @@ all: blexer bparser + chmod 700 ../templates/do_parse + + blexer: jlist.o butil.o lex.yy.o blexer.o +- gcc $(FLAGS) -o blexer jlist.o butil.o lex.yy.o blexer.o ++ $(CC) $(FLAGS) -o blexer jlist.o butil.o lex.yy.o blexer.o + + bparser: bparser.o +- g++ $(FLAGS) -o bparser bparser.o butil.c ++ $(CPP) $(FLAGS) -o bparser bparser.o butil.c + + jlist.o: jlist.c butil.h jlist.h + +Index: ltp-full-20090131/testcases/kernel/device-drivers/acpi/Makefile +=================================================================== +--- ltp-full-20090131.orig/testcases/kernel/device-drivers/acpi/Makefile ++++ ltp-full-20090131/testcases/kernel/device-drivers/acpi/Makefile +@@ -15,7 +15,7 @@ PWD := $(shell pwd) + + default: + $(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules +- gcc $(CFLAGS) -o LtpAcpiMain LtpAcpiMain.c ++ $(CC) $(CFLAGS) -o LtpAcpiMain LtpAcpiMain.c + # $(MAKE) -C $(KERNELDIR) SUBDIRS=$(PWD) modules + endif + +Index: ltp-full-20090131/testcases/kernel/device-drivers/agp/user_space/Makefile +=================================================================== +--- ltp-full-20090131.orig/testcases/kernel/device-drivers/agp/user_space/Makefile ++++ ltp-full-20090131/testcases/kernel/device-drivers/agp/user_space/Makefile +@@ -1,8 +1,8 @@ + test_agp: tagp_ki.o user_tagp.o +- gcc tagp_ki.o user_tagp.o -o test_agp ++ $(CC) tagp_ki.o user_tagp.o -o test_agp + + tagp_ki.o: tagp_ki.c +- gcc -c tagp_ki.c ++ $(CC) -c tagp_ki.c + + user_tagp.o: user_tagp.c +- gcc -c user_tagp.c ++ $(CC) -c user_tagp.c +Index: ltp-full-20090131/testcases/kernel/device-drivers/base/user_base/Makefile +=================================================================== +--- ltp-full-20090131.orig/testcases/kernel/device-drivers/base/user_base/Makefile ++++ ltp-full-20090131/testcases/kernel/device-drivers/base/user_base/Makefile +@@ -1,11 +1,11 @@ + test_base: tbase_ki.o user_tbase.o +- gcc tbase_ki.o user_tbase.o -o test_base ++ $(CC) tbase_ki.o user_tbase.o -o test_base + + tbase_ki.o: tbase_ki.c +- gcc -c tbase_ki.c ++ $(CC) -c tbase_ki.c + + user_tbase.o: user_tbase.c +- gcc -c user_tbase.c ++ $(CC) -c user_tbase.c + + clean: + rm -f *.o 2>/dev/null || true +Index: ltp-full-20090131/testcases/kernel/device-drivers/dev_sim_framework/user_space/Makefile +=================================================================== +--- ltp-full-20090131.orig/testcases/kernel/device-drivers/dev_sim_framework/user_space/Makefile ++++ ltp-full-20090131/testcases/kernel/device-drivers/dev_sim_framework/user_space/Makefile +@@ -1,8 +1,8 @@ + test_mod: tmod_ki.o user_tmod.o +- gcc tmod_ki.o user_tmod.o -o test_mod ++ $(CC) tmod_ki.o user_tmod.o -o test_mod + + tmod_ki.o: tmod_ki.c +- gcc -c tmod_ki.c ++ $(CC) -c tmod_ki.c + + user_tmod.o: user_tmod.c +- gcc -c user_tmod.c ++ $(CC) -c user_tmod.c +Index: ltp-full-20090131/testcases/kernel/device-drivers/drm/user_space/Makefile +=================================================================== +--- ltp-full-20090131.orig/testcases/kernel/device-drivers/drm/user_space/Makefile ++++ ltp-full-20090131/testcases/kernel/device-drivers/drm/user_space/Makefile +@@ -2,4 +2,4 @@ + KDIR := /lib/modules/$(shell uname -r)/build + CFLAGS := -I$(KDIR)/drivers/char/drm + default: +- gcc -o test_drm user_tdrm.c $(CFLAGS) ++ $(CC) -o test_drm user_tdrm.c $(CFLAGS) +Index: ltp-full-20090131/testcases/kernel/device-drivers/include/Makefile +=================================================================== +--- ltp-full-20090131.orig/testcases/kernel/device-drivers/include/Makefile ++++ ltp-full-20090131/testcases/kernel/device-drivers/include/Makefile +@@ -14,7 +14,7 @@ PWD := $(shell pwd) + + default: + $(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules +- gcc -Wall -o userBlockInclude userBlockInclude.c ++ $(CC) -Wall -o userBlockInclude userBlockInclude.c + # $(MAKE) -C $(KERNELDIR) SUBDIRS=$(PWD) modules + endif + +Index: ltp-full-20090131/testcases/kernel/device-drivers/nls/Makefile +=================================================================== +--- ltp-full-20090131.orig/testcases/kernel/device-drivers/nls/Makefile ++++ ltp-full-20090131/testcases/kernel/device-drivers/nls/Makefile +@@ -13,7 +13,7 @@ PWD := $(shell pwd) + + default: + $(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules +- gcc $(EXTRA_CFLAGS) -o userBlockNLS userBlockNLS.c ++ $(CC) $(EXTRA_CFLAGS) -o userBlockNLS userBlockNLS.c + # $(MAKE) -C $(KERNELDIR) SUBDIRS=$(PWD) modules + + clean: +Index: ltp-full-20090131/testcases/kernel/device-drivers/pci/user_tpci/Makefile +=================================================================== +--- ltp-full-20090131.orig/testcases/kernel/device-drivers/pci/user_tpci/Makefile ++++ ltp-full-20090131/testcases/kernel/device-drivers/pci/user_tpci/Makefile +@@ -1,8 +1,8 @@ + test_pci: tpci_ki.o user_tpci.o +- gcc tpci_ki.o user_tpci.o -o test_pci ++ $(CC) tpci_ki.o user_tpci.o -o test_pci + + tpci_ki.o: tpci_ki.c +- gcc -c tpci_ki.c ++ $(CC) -c tpci_ki.c + + user_tpci.o: user_tpci.c +- gcc -c user_tpci.c ++ $(CC) -c user_tpci.c +Index: ltp-full-20090131/testcases/kernel/device-drivers/tbio/user_space/Makefile +=================================================================== +--- ltp-full-20090131.orig/testcases/kernel/device-drivers/tbio/user_space/Makefile ++++ ltp-full-20090131/testcases/kernel/device-drivers/tbio/user_space/Makefile +@@ -1,8 +1,8 @@ + test_bio: tbio_ki.o user_tbio.o +- gcc -g tbio_ki.o user_tbio.o -o test_bio ++ $(CC) -g tbio_ki.o user_tbio.o -o test_bio + + tbio_ki.o: tbio_ki.c +- gcc -c -g tbio_ki.c ++ $(CC) -c -g tbio_ki.c + + user_tbio.o: user_tbio.c +- gcc -c -g user_tbio.c ++ $(CC) -c -g user_tbio.c +Index: ltp-full-20090131/testcases/kernel/device-drivers/usb/user_usb/Makefile +=================================================================== +--- ltp-full-20090131.orig/testcases/kernel/device-drivers/usb/user_usb/Makefile ++++ ltp-full-20090131/testcases/kernel/device-drivers/usb/user_usb/Makefile +@@ -1,8 +1,8 @@ + test_usb: tusb_ki.o user_tusb.o +- gcc tusb_ki.o user_tusb.o -o test_usb ++ $(CC) tusb_ki.o user_tusb.o -o test_usb + + tusb_ki.o: tusb_ki.c +- gcc -c tusb_ki.c ++ $(CC) -c tusb_ki.c + + user_tusb.o: user_tusb.c +- gcc -c user_tusb.c ++ $(CC) -c user_tusb.c +Index: ltp-full-20090131/testcases/kernel/fs/fs-bench/Makefile +=================================================================== +--- ltp-full-20090131.orig/testcases/kernel/fs/fs-bench/Makefile ++++ ltp-full-20090131/testcases/kernel/fs/fs-bench/Makefile +@@ -6,13 +6,13 @@ all: ${EXECS} + @echo done + + cr: create-files.o ${UTILS} +- gcc ${UTILS} create-files.o -lm -o cr ++ $(CC) ${UTILS} create-files.o -lm -o cr + + ra: random-access.o +- gcc random-access.o -o ra ++ $(CC) random-access.o -o ra + + radc: random-del-create.o ${UTILS} +- gcc ${UTILS} random-del-create.o -lm -o radc ++ $(CC) ${UTILS} random-del-create.o -lm -o radc + + install: + @set -e; for i in $(EXECS) $(SCRIPTS); do ln -f $$i ../../../bin/$$i ; done +Index: ltp-full-20090131/testcases/kernel/fs/scsi/ltpfs/Makefile +=================================================================== +--- ltp-full-20090131.orig/testcases/kernel/fs/scsi/ltpfs/Makefile ++++ ltp-full-20090131/testcases/kernel/fs/scsi/ltpfs/Makefile +@@ -15,7 +15,7 @@ PWD := $(shell pwd) + + default: + $(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules +- gcc $(CFLAGS) -o ltpfstest -lm main.c ++ $(CC) $(CFLAGS) -o ltpfstest -lm main.c + # $(MAKE) -C $(KERNELDIR) SUBDIRS=$(PWD) modules + endif + +Index: ltp-full-20090131/testcases/kernel/sched/hyperthreading/ht_affinity/Makefile +=================================================================== +--- ltp-full-20090131.orig/testcases/kernel/sched/hyperthreading/ht_affinity/Makefile ++++ ltp-full-20090131/testcases/kernel/sched/hyperthreading/ht_affinity/Makefile +@@ -7,9 +7,9 @@ TARGETS := ht_affinity + all: $(TARGETS) + + #ht_affinity: HTaffinity.o HTutils.o +-# gcc -o ht_affinity HTaffinity.o HTutils.o $(CFLAGS) $(LOADLIBES) ++# $(CC) -o ht_affinity HTaffinity.o HTutils.o $(CFLAGS) $(LOADLIBES) + ht_affinity: +- gcc -o ht_affinity HTaffinity.c HTutils.c $(CFLAGS) $(LOADLIBES) ++ $(CC) -o ht_affinity HTaffinity.c HTutils.c $(CFLAGS) $(LOADLIBES) + + install: + @set -e; for i in $(TARGETS) ; do ln -f $$i ../../../../bin/$$i ; done +Index: ltp-full-20090131/testcases/kernel/sched/hyperthreading/ht_enabled/Makefile +=================================================================== +--- ltp-full-20090131.orig/testcases/kernel/sched/hyperthreading/ht_enabled/Makefile ++++ ltp-full-20090131/testcases/kernel/sched/hyperthreading/ht_enabled/Makefile +@@ -7,7 +7,7 @@ TARGETS := ht_enabled + all: $(TARGETS) + + ht_enabled: +- gcc -o ht_enabled HTenabled.c HTutils.c $(CFLAGS) $(LOADLIBES) ++ $(CC) -o ht_enabled HTenabled.c HTutils.c $(CFLAGS) $(LOADLIBES) + + install: + @set -e; for i in $(TARGETS) ; do ln -f $$i ../../../../bin/$$i ; done +Index: ltp-full-20090131/testcases/kernel/sched/hyperthreading/ht_interrupt/Makefile +=================================================================== +--- ltp-full-20090131.orig/testcases/kernel/sched/hyperthreading/ht_interrupt/Makefile ++++ ltp-full-20090131/testcases/kernel/sched/hyperthreading/ht_interrupt/Makefile +@@ -7,7 +7,7 @@ TARGETS = ht_interrupt + all: $(TARGETS) + + ht_interrupt: +- gcc -o ht_interrupt HTinterrupt.c HTutils.c $(CFLAGS) $(LOADLIBES) ++ $(CC) -o ht_interrupt HTinterrupt.c HTutils.c $(CFLAGS) $(LOADLIBES) + + install: + @set -e; for i in $(TARGETS) ; do ln -f $$i ../../../../bin/$$i ; done +Index: ltp-full-20090131/lib/Makefile +=================================================================== +--- ltp-full-20090131.orig/lib/Makefile ++++ ltp-full-20090131/lib/Makefile +@@ -1,6 +1,3 @@ +- +-PREFIX=/opt/ltp +- + CFLAGS+= -Wall + CFLAGS+= -D_USC_LIB_ + CPPFLAGS+= -I../include +Index: ltp-full-20090131/m4/GNUmakefile +=================================================================== +--- ltp-full-20090131.orig/m4/GNUmakefile ++++ ltp-full-20090131/m4/GNUmakefile +@@ -1,6 +1,3 @@ +- +- +-PREFIX=/opt/ltp + M4MACROS=$(notdir $(wildcard *.m4)) + + all: +Index: ltp-full-20090131/pan/Makefile +=================================================================== +--- ltp-full-20090131.orig/pan/Makefile ++++ ltp-full-20090131/pan/Makefile +@@ -1,8 +1,6 @@ +- + LOADLIBES += -lm + LFLAGS += -l -w + CFLAGS += -w +-PREFIX = /opt/ltp + + all: pan bump scanner + diff --git a/packages/ltp/ltp-20090131/fix-tcore_patch_test_suites.patch b/packages/ltp/ltp-20090131/fix-tcore_patch_test_suites.patch new file mode 100644 index 0000000000..92a8879410 --- /dev/null +++ b/packages/ltp/ltp-20090131/fix-tcore_patch_test_suites.patch @@ -0,0 +1,20 @@ +--- + testcases/misc/tcore_patch_test_suites/tcore.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +Index: ltp-full-20090131/testcases/misc/tcore_patch_test_suites/tcore.c +=================================================================== +--- ltp-full-20090131.orig/testcases/misc/tcore_patch_test_suites/tcore.c ++++ ltp-full-20090131/testcases/misc/tcore_patch_test_suites/tcore.c +@@ -27,9 +27,10 @@ extern int Tst_count; /* + extern char *TESTDIR; /* temporary dir created by tst_tmpdir() */ + /* Global Variables */ + char *TCID = "tcore"; /* test program identifier. */ +-int TST_TOTAL = 1; /* total number of tests in this file. */ + + #if defined __i386__ || defined(__x86_64__) ++int TST_TOTAL = 1; /* total number of tests in this file. */ ++ + #include <stdio.h> + #include <sys/types.h> + #include <unistd.h> diff --git a/packages/ltp/ltp-20090131/no-IDcheck.patch b/packages/ltp/ltp-20090131/no-IDcheck.patch new file mode 100644 index 0000000000..d43780748f --- /dev/null +++ b/packages/ltp/ltp-20090131/no-IDcheck.patch @@ -0,0 +1,17 @@ +--- + Makefile | 2 -- + 1 file changed, 2 deletions(-) + +Index: ltp-full-20090131/Makefile +=================================================================== +--- ltp-full-20090131.orig/Makefile ++++ ltp-full-20090131/Makefile +@@ -37,8 +37,6 @@ install: all + @$(MAKE) -C doc/man1 install + @$(MAKE) -C doc/man3 install + +- @./IDcheck.sh +- + libltp.a: config.h + @$(MAKE) -C lib $@ + diff --git a/packages/ltp/ltp-20090131/no_epoll_create2_mips.patch b/packages/ltp/ltp-20090131/no_epoll_create2_mips.patch new file mode 100644 index 0000000000..84ce8e4128 --- /dev/null +++ b/packages/ltp/ltp-20090131/no_epoll_create2_mips.patch @@ -0,0 +1,17 @@ +--- + testcases/kernel/syscalls/Makefile | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +Index: ltp-full-20090131/testcases/kernel/syscalls/Makefile +=================================================================== +--- ltp-full-20090131.orig/testcases/kernel/syscalls/Makefile ++++ ltp-full-20090131/testcases/kernel/syscalls/Makefile +@@ -25,7 +25,7 @@ EXCLUDE_DIR=epoll + # + # Commented this out since there are directories here we don't want built by default + # +-SUBDIR = `ls */Makefile | sed "s/Makefile//g"` ++SUBDIR = `ls */Makefile | sed "s/Makefile//g | grep -vE "^epoll_create2""` + UCLINUX_SUBDIR = `ls */Makefile | sed "s/Makefile//g" | grep -vE "^fork|epoll|capget|capset|chmod|chown|llseek|nftw|clone|profil|getcontext"` + + all: diff --git a/packages/ltp/ltp-20090131/no_hyperthreading_tests.patch b/packages/ltp/ltp-20090131/no_hyperthreading_tests.patch new file mode 100644 index 0000000000..6ef9635df9 --- /dev/null +++ b/packages/ltp/ltp-20090131/no_hyperthreading_tests.patch @@ -0,0 +1,14 @@ +--- + testcases/kernel/sched/Makefile | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +Index: ltp-full-20090131/testcases/kernel/sched/Makefile +=================================================================== +--- ltp-full-20090131.orig/testcases/kernel/sched/Makefile ++++ ltp-full-20090131/testcases/kernel/sched/Makefile +@@ -1,4 +1,4 @@ +-SUBDIRS = cfs-scheduler clisrv hyperthreading nptl process_stress pthreads sched_stress tool ++SUBDIRS = cfs-scheduler clisrv nptl process_stress pthreads sched_stress tool + + all: + @set -e; for i in $(SUBDIRS); do $(MAKE) -C $$i ; done diff --git a/packages/ltp/ltp-20090131/runltp-path.patch b/packages/ltp/ltp-20090131/runltp-path.patch new file mode 100644 index 0000000000..607e019e61 --- /dev/null +++ b/packages/ltp/ltp-20090131/runltp-path.patch @@ -0,0 +1,17 @@ +--- + runltp | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +Index: ltp-full-20090131/runltp +=================================================================== +--- ltp-full-20090131.orig/runltp ++++ ltp-full-20090131/runltp +@@ -74,7 +74,7 @@ setup() + echo "FATAL: unable to change directory to $(dirname $0)" + exit 1 + } +- export LTPROOT=${PWD} ++ export LTPROOT=/usr/libexec/ltp + export TMPBASE="/tmp" + export PATH="${PATH}:${LTPROOT}/testcases/bin" + diff --git a/packages/ltp/ltp_20090131.bb b/packages/ltp/ltp_20090131.bb new file mode 100644 index 0000000000..73d6f76fa7 --- /dev/null +++ b/packages/ltp/ltp_20090131.bb @@ -0,0 +1,75 @@ +DESCRIPTION = "Linux Test Project" +HOMEPAGE = "http://ltp.sourceforge.net" +LICENSE = "GPL" +SECTION = "console/utils" +DEPENDS = "zip-native" +PR = "r1" + +SRC_URI = "${SOURCEFORGE_MIRROR}/ltp/ltp-full-${PV}.tgz \ + file://cross-compile.patch;patch=1 \ + file://runltp-path.patch;patch=1 \ + file://fix-tcore_patch_test_suites.patch;patch=1 \ + file://no-IDcheck.patch;patch=1 \ + file://no_hyperthreading_tests.patch;patch=1" + +SRC_URI_append_mips += "file://no_epoll_create2_mips.patch;patch=1" +SRC_URI_append_mipsel += "file://no_epoll_create2_mips.patch;patch=1" + +S = "${WORKDIR}/ltp-full-${PV}" + +EXTRA_OEMAKE_append = " CROSS_COMPILE=${HOST_PREFIX}" + +FILES_${PN}-dbg = "${libexecdir}/ltp/*/*/*/*/*/.debug" +FILES_${PN}-dbg += "${libexecdir}/ltp/*/*/*/*/.debug" +FILES_${PN}-dbg += "${libexecdir}/ltp/*/*/*/.debug" +FILES_${PN}-dbg += "${libexecdir}/ltp/*/*/.debug" +FILES_${PN}-dbg += "${libexecdir}/ltp/*/.debug" +#FILES_${PN}-dbg += "${libexecdir}/ltp/testcases/misc/math/float/trigo/.debug" +#FILES_${PN}-dbg += "${libexecdir}/ltp/testcases/misc/math/float/iperb/.debug" +#FILES_${PN}-dbg += "${libexecdir}/ltp/testcases/misc/math/float/exp_log/.debug" +#FILES_${PN}-dbg += "${libexecdir}/ltp/testcases/misc/math/float/power/.debug" +#FILES_${PN}-dbg += "${libexecdir}/ltp/testcases/misc/math/float/bessel/.debug" +#FILES_${PN}-dbg += "${libexecdir}/ltp/testcases/misc/math/abs/.debug" +#FILES_${PN}-dbg += "${libexecdir}/ltp/testcases/misc/math/atof/.debug" +#FILES_${PN}-dbg += "${libexecdir}/ltp/testcases/misc/math/nextafter/.debug" +#FILES_${PN}-dbg += "${libexecdir}/ltp/testcases/misc/math/fptests/.debug" +#FILES_${PN}-dbg += "${libexecdir}/ltp/testcases/misc/f00f/.debug" +#FILES_${PN}-dbg += "${libexecdir}/ltp/testcases/misc/crash/.debug" +#FILES_${PN}-dbg += "${libexecdir}/ltp/pan/.debug" +#FILES_${PN}-dbg += "${libexecdir}/ltp/testcases/network/ipv6/*/.debug" +#FILES_${PN}-dbg += "${libexecdir}/ltp/testcases/network/rpc/rpc01/.debug" +#FILES_${PN}-dbg += "${libexecdir}/ltp/testcases/bin/.debug" +#FILES_${PN}-dbg += "${libexecdir}/ltp/testcases/kernel/syscalls/*/.debug" +#FILES_${PN}-dbg += "${libexecdir}/ltp/testcases/kernel/mem/*/.debug" + +do_compile(){ + oe_runmake CROSS_COMPILE=${HOST_PREFIX} +} + +do_install(){ + export CREATE=0 + export LTPROOT=${D}/usr/libexec/ltp/testcases + + oe_runmake DESTDIR=${D} PREFIX=/usr/libexec/ltp install + + install -d ${D}/usr/libexec/ltp/testcases + install -d ${D}/usr/libexec/ltp/pan + + #install testcases + #install -m 0755 ${WORKDIR}/testcases ${D}/usr/libexec/ltp/testcases + #install -m 0755 ${WORKDIR}/testcases ${D}/usr/libexec/ltp/ + + # treecopy testcases pan/pan runtest ver_linux IDcheck.sh \ + # ${D}/usr/libexec/ltp + cp testcases ${D}/usr/libexec/ltp/ -rfp + rm ${D}/usr/libexec/ltp/testcases/ballista -rf + cp pan/pan ${D}/usr/libexec/ltp/pan -p + cp runtest ${D}/usr/libexec/ltp/ -rfp + cp ver_linux ${D}/usr/libexec/ltp/ -p + cp runltp ${D}/usr/libexec/ltp/ -p + cp IDcheck.sh ${D}/usr/libexec/ltp/ -p + + # We don't want "devel" stuff + rm -rf ${D}/opt/ltp/include + rm ${D}/usr/libexec/ltp/share/pkgconfig/ltp.pc +} diff --git a/packages/maemo4/libosso/libosso-dont-use-inline.patch b/packages/maemo4/libosso/libosso-dont-use-inline.patch new file mode 100644 index 0000000000..d3878308c2 --- /dev/null +++ b/packages/maemo4/libosso/libosso-dont-use-inline.patch @@ -0,0 +1,47 @@ +--- libosso-2.13/src/osso-init.c.orig 2008-09-22 12:56:49.000000000 -0700 ++++ libosso-2.13/src/osso-init.c 2008-09-22 12:57:22.000000000 -0700 +@@ -657,7 +657,8 @@ + return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; + } + +-inline int __attribute__ ((visibility("hidden"))) ++//inline int __attribute__ ((visibility("hidden"))) ++static int + muali_convert_msgtype(int t) + { + switch (t) { +--- libosso-2.13/src/osso-internal.h.orig 2008-09-22 12:57:39.000000000 -0700 ++++ libosso-2.13/src/osso-internal.h 2008-09-22 12:58:13.000000000 -0700 +@@ -209,7 +209,8 @@ + # define dprint(f, a...) + # endif /* LIBOSSO_DEBUG */ + +-inline int __attribute__ ((visibility("hidden"))) ++//inline int __attribute__ ((visibility("hidden"))) ++static int + muali_convert_msgtype(int t); + + muali_arg_t* _get_muali_args(DBusMessageIter *iter); +@@ -297,7 +298,8 @@ + _muali_parse_id(const char *id, muali_bus_type *bus, char *sender, + int *serial); + +-inline void __attribute__ ((visibility("hidden"))) ++//inline void __attribute__ ((visibility("hidden"))) ++static void + _muali_make_id(muali_bus_type bus, const char *sender, int serial, char *id); + + #endif /* OSSO_INTERNAL_H_ */ +--- libosso-2.13/src/osso-rpc.c.orig 2008-09-22 12:58:53.000000000 -0700 ++++ libosso-2.13/src/osso-rpc.c 2008-09-22 12:59:42.000000000 -0700 +@@ -1026,7 +1026,8 @@ + *serial = atoi(buf); + } + +-inline void __attribute__ ((visibility("hidden"))) ++//inline void __attribute__ ((visibility("hidden"))) ++static void + _muali_make_id(muali_bus_type bus, const char *sender, int serial, char *id) + { + snprintf(id, MAX_MSGID_LEN, "%d,%s,%d", bus, sender, serial); + diff --git a/packages/maemo4/libosso_2.13.bb b/packages/maemo4/libosso_2.13.bb index 1920e29d3a..25ee9aac15 100644 --- a/packages/maemo4/libosso_2.13.bb +++ b/packages/maemo4/libosso_2.13.bb @@ -1,10 +1,11 @@ require libosso.inc -PR = "r0" +PR = "r1" SRC_URI = "\ http://repository.maemo.org/pool/maemo4.0/free/source/libo/${PN}/${PN}_${PV}-1.1fix.tar.gz \ file://libosso-buildfix.patch;patch=1 \ + file://libosso-dont-use-inline.patch;patch=1 \ " PACKAGES += "${PN}-outo ${PN}-outo-dev ${PN}-outo-dbg ${PN}-outo-bin-dbg ${PN}-outo-bin" diff --git a/packages/make/mingw-make-canadian-sdk_3.81.bb b/packages/make/mingw-make-canadian-sdk_3.81.bb new file mode 100644 index 0000000000..3479dad249 --- /dev/null +++ b/packages/make/mingw-make-canadian-sdk_3.81.bb @@ -0,0 +1,16 @@ +PR = "r0" + +require make.inc + +inherit canadian-sdk + +DESCRIPTION = "GNU Make examines the timestamps on a set of \ +interdependent files, and, if necessary, issues commands \ +to bring them up-to-date - MinGW port." +HOMEPAGE = "http://www.mingw.org/" + +DEPENDS = "virtual/${HOST_PREFIX}binutils virtual/${HOST_PREFIX}gcc" + +SRC_URI = "${SOURCEFORGE_MIRROR}/mingw/mingw32-make-3.81-20080326-src.tar.gz" + +S = "${WORKDIR}/make-${PV}-patched" diff --git a/packages/meta/meta-toolchain-slugos.bb b/packages/meta/meta-toolchain-slugos.bb index 60326c0bc1..21d9a84442 100644 --- a/packages/meta/meta-toolchain-slugos.bb +++ b/packages/meta/meta-toolchain-slugos.bb @@ -1,10 +1,7 @@ -PR = "r0" +PR = "r1" -TOOLCHAIN_HOST_TASK = "task-slugos-toolchain-host" - -# TBD: need to determine minimal library set to provide; -# uncomment next line and bump PR when this is done. -#TOOLCHAIN_TARGET_TASK = "task-slugos-toolchain-target" +TOOLCHAIN_HOST_TASK = "task-slugos-toolchain-host" +TOOLCHAIN_TARGET_TASK = "task-slugos-toolchain-target" require meta-toolchain.bb SDK_SUFFIX = "toolchain-slugos"
\ No newline at end of file diff --git a/packages/meta/slugos-packages.bb b/packages/meta/slugos-packages.bb index acc9bd3597..1428fdcd7b 100644 --- a/packages/meta/slugos-packages.bb +++ b/packages/meta/slugos-packages.bb @@ -5,7 +5,7 @@ DESCRIPTION = "Packages that are compatible with the SlugOS firmware" HOMEPAGE = "http://www.nslu2-linux.org" LICENSE = "MIT" -PR = "r60" +PR = "r63" CONFLICTS = "db3" COMPATIBLE_MACHINE = "nslu2|ixp4xx" @@ -49,6 +49,7 @@ SLUGOS_PACKAGES = "\ bison \ bluez-utils \ bluez-hcidump \ + bluez4 \ bogofilter \ bonnie++ \ boost \ @@ -163,6 +164,7 @@ SLUGOS_PACKAGES = "\ ncftp \ ncurses \ net-tools \ + netatalk \ netcat \ netpbm \ nfs-utils \ @@ -207,6 +209,7 @@ SLUGOS_PACKAGES = "\ spandsp \ sqlite \ squid \ + sshfs-fuse \ ssmtp \ strace \ streamripper \ @@ -259,7 +262,6 @@ SLUGOS_BROKEN_PACKAGES = "\ lirc-modules lirc \ madfu \ motion \ - netatalk \ openldap \ postfix \ pvrusb2-mci \ diff --git a/packages/mingw/mingw-runtime-headers_3.15.2.bb b/packages/mingw/mingw-runtime-headers_3.15.2.bb new file mode 100644 index 0000000000..8c77b6a594 --- /dev/null +++ b/packages/mingw/mingw-runtime-headers_3.15.2.bb @@ -0,0 +1,3 @@ +require mingw-runtime_${PV}.bb + +require mingw-runtime-headers.inc diff --git a/packages/mingw/mingw-runtime_3.15.2.bb b/packages/mingw/mingw-runtime_3.15.2.bb new file mode 100644 index 0000000000..c691d0749d --- /dev/null +++ b/packages/mingw/mingw-runtime_3.15.2.bb @@ -0,0 +1,7 @@ +require mingw-runtime.inc + +PR = "r1" + +SRC_URI = "${SOURCEFORGE_MIRROR}/mingw/mingwrt-${PV}-mingw32-src.tar.gz" + +S = "${WORKDIR}/mingwrt-${PV}-mingw32" diff --git a/packages/mini-httpd/.mini-httpd_1.19.bb.swp b/packages/mini-httpd/.mini-httpd_1.19.bb.swp Binary files differnew file mode 100644 index 0000000000..d384577124 --- /dev/null +++ b/packages/mini-httpd/.mini-httpd_1.19.bb.swp diff --git a/packages/mini-httpd/files/init b/packages/mini-httpd/files/init new file mode 100644 index 0000000000..5e9b176eb9 --- /dev/null +++ b/packages/mini-httpd/files/init @@ -0,0 +1,70 @@ +#! /bin/sh + +# Globals +PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin +DAEMON=/usr/sbin/mini_httpd +NAME=mini-httpd +DESC="web server" +# Additional options that are passed to the Daemon. +DAEMON_OPTS="-C /etc/mini-httpd.conf" + +test -x $DAEMON || exit 0 + +# Include mini-httpd defaults if available +if [ -f /etc/default/mini-httpd ] +then + . /etc/default/mini-httpd +fi + +set -e + +case "$1" in + start) + echo -n "Starting $DESC: " + start-stop-daemon --start --quiet --pidfile /var/run/$NAME.pid \ + --exec $DAEMON -- $DAEMON_OPTS + echo "$NAME." + ;; + + stop) + echo -n "Stopping $DESC: " + # Get pid number + if [ -e /var/run/$NAME.pid ] + then + PID=`cat /var/run/$NAME.pid` + if [ -d /proc/$PID ] + then + start-stop-daemon --stop --quiet --pidfile /var/run/$NAME.pid + else + # we need to remove the pidfile manually + if [ -e /var/run/$NAME.pid ] + then + rm -f /var/run/$NAME.pid + fi + fi + fi + echo "$NAME." + ;; + + restart|force-reload) + echo -n "Restarting $DESC: " + if [ "$START" = "0" ] + then + start-stop-daemon --start --quiet --pidfile /var/run/$NAME.pid \ + --exec $DAEMON -- $DAEMON_OPTS + fi + sleep 1 + start-stop-daemon --start --quiet --pidfile \ + /var/run/$NAME.pid --exec $DAEMON -- $DAEMON_OPTS + echo "$NAME." + ;; + + *) + N=/etc/init.d/$NAME + echo "Usage: $N {start|stop|restart|force-reload}" >&2 + exit 1 + ;; +esac + +exit 0 + diff --git a/packages/mini-httpd/files/mini-httpd.conf b/packages/mini-httpd/files/mini-httpd.conf new file mode 100644 index 0000000000..cb4150c3d9 --- /dev/null +++ b/packages/mini-httpd/files/mini-httpd.conf @@ -0,0 +1,37 @@ +# Example config for mini_httpd. +# Author: Marvin Stark <marv@der-marv.de> + +# Uncomment this line for turning on ssl support. +#ssl + +# On which host mini_httpd should bind? +host=0.0.0.0 + +# On which port mini_httpd should listen? +port=80 + +# Which user mini_httpd should use? +user=nobody + +# Run in chroot mode? +#chroot # yes +nochroot # no + +# Working directory of mini_httpd. +#dir=<work_dir> + +# We are the web files stored? +data_dir=/etc/mini-httpd + +# Which certificate to use? +#certfile=<certfile> + +# Which logfile to use? +logfile=/var/log/mini-httpd.log + +# Which pidfile to use? +pidfile=/var/run/mini-httpd.pid + +# Which charset to use? +charset=iso-8859-1 + diff --git a/packages/mini-httpd/files/new-bindir-mandir.patch b/packages/mini-httpd/files/new-bindir-mandir.patch new file mode 100644 index 0000000000..7d48cd1685 --- /dev/null +++ b/packages/mini-httpd/files/new-bindir-mandir.patch @@ -0,0 +1,15 @@ +diff -NurpP --minimal mini_httpd-1.19/Makefile mini_httpd-1.19-new/Makefile +--- mini_httpd-1.19/Makefile 2002-11-02 07:02:57.000000000 +0800 ++++ mini_httpd-1.19-new/Makefile 2008-10-06 15:43:52.000000000 +0800 +@@ -20,8 +20,8 @@ CRYPT_LIB = -lcrypt + #SSL_LIBS = -L${SSL_TREE}/lib -lssl -lcrypto + + +-BINDIR = /usr/local/sbin +-MANDIR = /usr/local/man ++BINDIR = /usr/sbin ++MANDIR = /usr/share/man + CC = gcc + CDEFS = ${SSL_DEFS} ${SSL_INC} + CFLAGS = -O ${CDEFS} + diff --git a/packages/mini-httpd/files/remove-CC.patch b/packages/mini-httpd/files/remove-CC.patch new file mode 100644 index 0000000000..0fddcd7cb6 --- /dev/null +++ b/packages/mini-httpd/files/remove-CC.patch @@ -0,0 +1,13 @@ +diff -NurpP --minimal mini_httpd-1.19/Makefile mini_httpd-1.19-new/Makefile +--- mini_httpd-1.19/Makefile 2008-10-06 15:45:44.000000000 +0800 ++++ mini_httpd-1.19-new/Makefile 2008-10-06 15:46:11.000000000 +0800 +@@ -22,7 +22,7 @@ CRYPT_LIB = -lcrypt + + BINDIR = /usr/sbin + MANDIR = /usr/share/man +-CC = gcc ++#CC = gcc + CDEFS = ${SSL_DEFS} ${SSL_INC} + CFLAGS = -O ${CDEFS} + #CFLAGS = -g ${CDEFS} + diff --git a/packages/mini-httpd/mini-httpd_1.19.bb b/packages/mini-httpd/mini-httpd_1.19.bb new file mode 100644 index 0000000000..6ca44e79ee --- /dev/null +++ b/packages/mini-httpd/mini-httpd_1.19.bb @@ -0,0 +1,36 @@ +# Copyright (C) 2009 Khem Raj <raj.khem@gmail.org> +# Released under the MIT license (see COPYING.MIT for the terms) + +DESCRIPTION = "mini_httpd is a small HTTP server. \ + It implements all the basic features of an HTTP server \ + It can also be configured to do SSL/HTTPS and IPv6. \ + " +HOMEPAGE = "http://www.acme.com/software/mini_httpd/" +LICENSE = "BSD" +SECTION = "net" +DEPENDS = "openssl" +PR = "r0" + +SRC_URI="http://www.acme.com/software/mini_httpd/mini_httpd-${PV}.tar.gz \ + file://new-bindir-mandir.patch;patch=1 \ + file://remove-CC.patch;patch=1 \ + file://mini-httpd.conf \ + file://init \ + " + +INITSCRIPT_NAME = "mini_httpd" +INITSCRIPT_PARAMS = "defaults" + +S = "${WORKDIR}/mini_httpd-${PV}" + + +inherit autotools update-rc.d + +do_install () { + install -d ${D}${sysconfdir} + install -d ${D}${sysconfdir}/init.d + install -d ${D}${sysconfdir}/mini-httpd + install -m 0755 ${WORKDIR}/init ${D}${sysconfdir}/init.d/mini_httpd + install -m 0755 ${WORKDIR}/mini-httpd.conf ${D}${sysconfdir}/mini-httpd.conf + oe_runmake 'BINDIR=${D}${sbindir}' 'MANDIR=${D}${mandir}' install +} diff --git a/packages/minicom/minicom_2.3.bb b/packages/minicom/minicom_2.3.bb new file mode 100644 index 0000000000..5b32401b1e --- /dev/null +++ b/packages/minicom/minicom_2.3.bb @@ -0,0 +1,11 @@ +SECTION = "console/network" +DEPENDS = "ncurses" +LICENSE = "GPL" +SRC_URI = "http://alioth.debian.org/frs/download.php/2332/minicom-${PV}.tar.gz \ + " + +inherit autotools gettext + +do_install() { + for d in doc extras man lib src; do make -C $d DESTDIR=${D} install; done +} diff --git a/packages/mktemp/files/add_destdir.patch b/packages/mktemp/files/add_destdir.patch new file mode 100644 index 0000000000..5eede383b3 --- /dev/null +++ b/packages/mktemp/files/add_destdir.patch @@ -0,0 +1,20 @@ +diff -NurpP --minimal mktemp-1.6/Makefile.in mktemp-1.6-addDESTDIR/Makefile.in +--- mktemp-1.6/Makefile.in 2008-08-17 23:38:34.000000000 +0800 ++++ mktemp-1.6-addDESTDIR/Makefile.in 2008-10-20 14:28:42.000000000 +0800 +@@ -106,13 +106,13 @@ $(OBJS): config.h + install: install-dirs install-binaries install-man + + install-dirs: +- $(SHELL) $(srcdir)/mkinstalldirs $(bindir) $(mandir)/man1 ++ $(SHELL) $(srcdir)/mkinstalldirs ${DESTDIR}/$(bindir) ${DESTDIR}/$(mandir)/man1 + + install-binaries: $(PROG) +- $(INSTALL) -m 0555 -s $(PROG) $(bindir)/$(PROG) ++ $(INSTALL) -m 0555 -s $(PROG) ${DESTDIR}/$(bindir)/$(PROG) + + install-man: +- $(INSTALL) -m 0444 $(srcdir)/mktemp.$(mantype) $(mandir)/man1/mktemp.1 ++ $(INSTALL) -m 0444 $(srcdir)/mktemp.$(mantype) ${DESTDIR}/$(mandir)/man1/mktemp.1 + + check: + @echo nothing to check diff --git a/packages/mktemp/files/disable-strip.patch b/packages/mktemp/files/disable-strip.patch new file mode 100644 index 0000000000..96269863a4 --- /dev/null +++ b/packages/mktemp/files/disable-strip.patch @@ -0,0 +1,12 @@ +diff -NurpP --minimal mktemp-1.6/Makefile.in mktemp-1.6-disable-strip/Makefile.in +--- mktemp-1.6/Makefile.in 2009-01-22 15:11:33.000000000 +0800 ++++ mktemp-1.6-disable-strip/Makefile.in 2009-01-22 15:13:52.000000000 +0800 +@@ -109,7 +109,7 @@ install-dirs: + $(SHELL) $(srcdir)/mkinstalldirs ${DESTDIR}/$(bindir) ${DESTDIR}/$(mandir)/man1 + + install-binaries: $(PROG) +- $(INSTALL) -m 0555 -s $(PROG) ${DESTDIR}/$(bindir)/$(PROG) ++ $(INSTALL) -m 0555 $(PROG) ${DESTDIR}/$(bindir)/$(PROG) + + install-man: + $(INSTALL) -m 0444 $(srcdir)/mktemp.$(mantype) ${DESTDIR}/$(mandir)/man1/mktemp.1 diff --git a/packages/mktemp/mktemp_1.6.bb b/packages/mktemp/mktemp_1.6.bb new file mode 100644 index 0000000000..bd9c4caa7d --- /dev/null +++ b/packages/mktemp/mktemp_1.6.bb @@ -0,0 +1,17 @@ +DESCRIPTION = "Allow safe temporary file creation from shell scripts." +HOMEPAGE = "http://www.mktemp.org/" +SECTION = "console/utils" +LICENSE = "GPLv2 BSD" + +inherit autotools + +EXTRA_OECONF = "--with-libc" + +SRC_URI = "\ + ftp://ftp.mktemp.org/pub/mktemp/${P}.tar.gz \ + file://add_destdir.patch;patch=1 \ + file://disable-strip.patch;patch=1 \ +" + +# FIXME should rather use update-alternatives +RCONFLICTS_${PN} = "coreutils" diff --git a/packages/mpeg-encode/files/fixup.patch b/packages/mpeg-encode/files/fixup.patch new file mode 100644 index 0000000000..c90f32760a --- /dev/null +++ b/packages/mpeg-encode/files/fixup.patch @@ -0,0 +1,76 @@ +diff -urN mpeg_encode.old//headers/libpnmrw.h mpeg_encode//headers/libpnmrw.h +--- mpeg_encode.old//headers/libpnmrw.h 1995-08-09 16:17:41.000000000 +0100 ++++ mpeg_encode//headers/libpnmrw.h 2009-02-10 17:06:09.508519503 +0000 +@@ -13,18 +13,7 @@ + #ifndef _PNMRW_H_ + #define _PNMRW_H_ + +-/* CONFIGURE: On some systems, malloc.h doesn't declare these, so we have +-** to do it. On other systems, for example HP/UX, it declares them +-** incompatibly. And some systems, for example Dynix, don't have a +-** malloc.h at all. A sad situation. If you have compilation problems +-** that point here, feel free to tweak or remove these declarations. +-*/ + #include <malloc.h> +-#if !defined(sco) && !defined(sgi) && !defined(IRIX) +-extern char* malloc(); +-#endif +-/* End of configurable definitions. */ +- + + /* Definitions to make PBMPLUS work with either ANSI C or C Classic. */ + +diff -urN mpeg_encode.old//jpeg/Makefile mpeg_encode//jpeg/Makefile +--- mpeg_encode.old//jpeg/Makefile 1995-08-05 00:27:00.000000000 +0100 ++++ mpeg_encode//jpeg/Makefile 2009-02-10 17:27:20.488862124 +0000 +@@ -20,9 +20,6 @@ + manprefix = + manext = 1 + +-# The name of your C compiler: +-CC= gcc +- + # You may need to adjust these cc options: + CFLAGS= -O -I$(srcdir) + # Generally, we recommend defining any configuration symbols in jconfig.h, +@@ -49,10 +46,8 @@ + RM= rm -f + # file rename command + MV= mv +-# library (.a) file creation command +-AR= ar rc + # second step in .a creation (use "touch" if not needed) +-AR2= ranlib ++AR2= $(RANLIB) + # installation program + INSTALL= /bin/install -c + INSTALL_PROGRAM= $(INSTALL) +@@ -121,7 +116,7 @@ + + libjpeg.a: $(LIBOBJECTS) + $(RM) libjpeg.a +- $(AR) libjpeg.a $(LIBOBJECTS) ++ $(AR) rc libjpeg.a $(LIBOBJECTS) + $(AR2) libjpeg.a + + cjpeg: $(COBJECTS) libjpeg.a +diff -urN mpeg_encode.old//libpnmrw.c mpeg_encode//libpnmrw.c +--- mpeg_encode.old//libpnmrw.c 1995-08-16 23:24:26.000000000 +0100 ++++ mpeg_encode//libpnmrw.c 2009-02-10 17:58:49.768855068 +0000 +@@ -28,6 +28,7 @@ + #endif + + #include <stdio.h> ++#include <errno.h> + #include "libpnmrw.h" + + /* if don't have string.h, try strings.h */ +@@ -126,8 +127,6 @@ + pm_perror( reason ) + char* reason; + { +- extern char* sys_errlist[]; +- extern int errno; + char* e; + + e = sys_errlist[errno]; diff --git a/packages/mpeg-encode/mpeg-encode_1.5b.bb b/packages/mpeg-encode/mpeg-encode_1.5b.bb new file mode 100644 index 0000000000..c350739531 --- /dev/null +++ b/packages/mpeg-encode/mpeg-encode_1.5b.bb @@ -0,0 +1,16 @@ +DESCRIPTION = "The Berkeley MPEG Encoder." +HOMEPAGE = "http://bmrc.berkeley.edu/frame/research/mpeg/mpeg_encode.html" +SECTION = "multimedia" +PR = "r0" + +SRC_URI = "http://bmrc.berkeley.edu/ftp/pub/multimedia/mpeg/encode/mpeg_encode-${PV}-src.tar.gz \ + file://fixup.patch;patch=1" + +S = "${WORKDIR}/mpeg_encode" + +CFLAGS_append += " -I${S}/headers" + +do_install() { + install -D -m 0755 ${S}/mpeg_encode ${D}${bindir}/mpeg_encode + install -D -m 0644 ${S}/mpeg_encode.1 ${D}${mandir}/man1/mpeg_encode.1 +} diff --git a/packages/mutagen/mutagen_1.15.bb b/packages/mutagen/mutagen_1.15.bb new file mode 100644 index 0000000000..682c144386 --- /dev/null +++ b/packages/mutagen/mutagen_1.15.bb @@ -0,0 +1,9 @@ +DESCRIPTION = " Python module to handle audio metadata" +HOMEPAGE = "http://code.google.com/p/quodlibet/wiki/Development/Mutagen" +SECTION = "devel/python" +LICENSE = "GPL" +PR = "0" + +SRC_URI = "http://www.sacredchao.net/~piman/software/${PN}-${PV}.tar.gz" + +inherit distutils diff --git a/packages/neon/files/gnutls-2.patch b/packages/neon/files/gnutls-2.patch new file mode 100644 index 0000000000..2b37dfc889 --- /dev/null +++ b/packages/neon/files/gnutls-2.patch @@ -0,0 +1,11 @@ +diff -Nurd neon-0.25.5/macros/neon.m4 neon-0.25.5-patched/macros/neon.m4 +--- neon-0.25.5/macros/neon.m4 2009-02-03 16:23:40.000000000 +0100 ++++ neon-0.25.5-patched/macros/neon.m4 2009-02-03 16:24:00.000000000 +0100 +@@ -895,6 +895,7 @@ + 1.0.?|1.0.1?|1.0.20|1.0.21) + AC_MSG_ERROR([GNU TLS version $ne_gnutls_ver is too old -- 1.0.22 or later required]) ;; + 1.*) ;; ++ 2.*) ;; + *) AC_MSG_ERROR([GNU TLS version $ne_gnutls_ver is not supported]) ;; + esac + diff --git a/packages/net-snmp/net-snmp.inc b/packages/net-snmp/net-snmp.inc new file mode 100644 index 0000000000..bbe809696e --- /dev/null +++ b/packages/net-snmp/net-snmp.inc @@ -0,0 +1,97 @@ +DESCRIPTION = "Various tools relating to the Simple Network Management Protocol" +HOMEPAGE = "http://www.net-snmp.org/" +LICENSE = "BSD" +DEPENDS = "openssl" +RDEPENDS_${PN}-server += "net-snmp-mibs" +RDEPENDS_${PN}-client += "net-snmp-mibs" +RDEPENDS_${PN}-dev = "net-snmp-client (= ${EXTENDPV}) net-snmp-server (= ${EXTENDPV})" +RRECOMMENDS_${PN}-dbg = "net-snmp-client (= ${EXTENDPV}) net-snmp-server (= ${EXTENDPV})" + +inherit autotools update-rc.d + + +do_configure() { + # Additional flag based on target endiness (see siteinfo.bbclass) + ENDIANESS="${@base_conditional('SITEINFO_ENDIANESS', 'le', '--with-endianness=little', '--with-endianness=big', d)}" + oenote Determined endianess as: $ENDIANESS + oe_runconf $ENDIANESS +} + +do_install_append() { + install -d ${D}${sysconfdir}/snmp + install -d ${D}${sysconfdir}/init.d + install -m 755 ${WORKDIR}/init ${D}${sysconfdir}/init.d/snmpd + install -m 644 ${WORKDIR}/snmpd.conf ${D}${sysconfdir}/snmp/ + install -m 644 ${WORKDIR}/snmptrapd.conf ${D}${sysconfdir}/snmp/ +} + +do_stage() { + rm -rf ${STAGE_TEMP} + mkdir -p ${STAGE_TEMP} + oe_runmake INSTALL_PREFIX="${STAGE_TEMP}" install + autotools_stage_dir ${STAGE_TEMP}/${includedir} ${STAGING_INCDIR} + if [ -d ${STAGE_TEMP}/${libdir} ] + then + olddir=`pwd` + cd ${STAGE_TEMP}/${libdir} + las=$(find . -name \*.la -type f) + cd $olddir + echo "Found la files: $las" + for i in $las + do + sed -e 's/^installed=yes$/installed=no/' \ + -e '/^dependency_libs=/s,${WORKDIR}[[:alnum:]/\._+-]*/\([[:alnum:]\._+-]*\),${STAGING_LIBDIR}/\1,g' \ + -e "/^dependency_libs=/s,\([[:space:]']\)${libdir},\1${STAGING_LIBDIR},g" \ + -i ${STAGE_TEMP}/${libdir}/$i + done + autotools_stage_dir ${STAGE_TEMP}/${libdir} ${STAGING_LIBDIR} + fi + install -d ${STAGING_DIR_HOST}${layout_bindir} + sed -e "s@-I/usr/include@@g" \ + -e "s@^prefix=.*@prefix=${STAING_DIR_HOST}@g" \ + -e "s@^exec_prefix=.*@exec_prefix=${STAING_DIR_HOST}@g" \ + -e "s@^includedir=.*@includedir=${STAGING_INCDIR}@g" \ + -e "s@^libdir=.*@libdir=${STAGING_LIBDIR}@g" \ + -i net-snmp-config + + install -m 755 net-snmp-config ${STAGING_DIR_HOST}${layout_bindir} + rm -Rf ${STAGE_TEMP} +} + +PACKAGES = "net-snmp-dbg net-snmp-doc net-snmp-dev net-snmp-libs \ + net-snmp-mibs net-snmp-server net-snmp-client" + +FILES_${PN}-libs = "${libdir}/*" +FILES_${PN}-mibs = "${datadir}/snmp/mibs" +FILES_${PN}-server = "${sbindir}/* ${sysconfdir}" +FILES_${PN}-client = "${bindir}/* ${datadir}/snmp/" +FILES_${PN}-dbg += "${libdir}/.debug/ ${sbindir}/.debug/ ${bindir}/.debug/" +FILES_${PN}-dev += ${bindir}/net-snmp-config ${bindir}/mib2c ${bindir}/mib2c-update" + +CONFFILES_${PN}-server = "${sysconfdir}/snmp/snmpd.conf \ + ${sysconfdir}/snmp/snmptrapd.conf" + +INITSCRIPT_PACKAGES = "${PN}-server" +INITSCRIPT_NAME_${PN}-server = "snmpd" +INITSCRIPT_PARAMS_${PN}-server = "defaults" + +LEAD_SONAME = "libnetsnmp.so" + +pkg_postinst_net-snmp-server() { +if test "x$D" != "x"; then + D="-r $D" +else + D="-s" +fi +update-rc.d $D snmpd defaults +} + +pkg_postrm_net-snmp-server() { +if test "x$D" != "x"; then + D="-r $D" +else + /etc/init.d/snmpd stop +fi +update-rc.d $D snmpd remove +} + diff --git a/packages/net-snmp/net-snmp_5.1.2.bb b/packages/net-snmp/net-snmp_5.1.2.bb index 330e13e0ef..527c9e33b1 100644 --- a/packages/net-snmp/net-snmp_5.1.2.bb +++ b/packages/net-snmp/net-snmp_5.1.2.bb @@ -1,8 +1,5 @@ -DESCRIPTION = "Various tools relating to the Simple Network Management Protocol" -HOMEPAGE = "http://www.net-snmp.org/" -LICENSE = "BSD" -DEPENDS = "openssl" -PR = "r3" +require net-snmp.inc +PR = "r4" SRC_URI = "${SOURCEFORGE_MIRROR}/net-snmp/net-snmp-${PV}.tar.gz \ file://uclibc-fix.patch;patch=1 \ @@ -16,46 +13,6 @@ PARALLEL_MAKE = "" EXTRA_OECONF = "--enable-shared --disable-manuals --with-defaults" EXTRA_OEMAKE = "INSTALL_PREFIX=${D}" -do_configure() { - # Additional flag based on target endiness (see siteinfo.bbclass) - ENDIANESS="${@base_conditional('SITEINFO_ENDIANESS', 'le', '--with-endianness=little', '--with-endianness=big', d)}" - oenote Determined endianess as: $ENDIANESS - oe_runconf $ENDIANESS -} - -do_install_append() { - install -d ${D}${sysconfdir}/snmp - install -d ${D}${sysconfdir}/init.d - install -m 755 ${WORKDIR}/init ${D}${sysconfdir}/init.d/snmpd - install -m 644 ${WORKDIR}/snmpd.conf ${D}${sysconfdir}/snmp/ - install -m 644 ${WORKDIR}/snmptrapd.conf ${D}${sysconfdir}/snmp/ -} - -PACKAGES = "net-snmp-dbg net-snmp-doc net-snmp-dev net-snmp-libs net-snmp-mibs net-snmp-server net-snmp-client" -FILES_net-snmp-libs = "${libdir}/*" -FILES_net-snmp-mibs = "${datadir}/snmp/mibs" -FILES_net-snmp-server = "${sbindir}/* ${sysconfdir}" -FILES_net-snmp-client = "${bindir}/* ${datadir}/snmp/" -FILES_net-snmp-dbg += "${libdir}/.debug/ ${sbindir}/.debug/ ${bindir}/.debug/" -RDEPENDS_net-snmp-server += "net-snmp-mibs" -RDEPENDS_net-snmp-client += "net-snmp-mibs" - -pkg_postinst_net-snmp-server() { -if test "x$D" != "x"; then - D="-r $D" -else - D="-s" -fi -update-rc.d $D snmpd defaults -} - -pkg_postrm_net-snmp-server() { -if test "x$D" != "x"; then - D="-r $D" -else - /etc/init.d/snmpd stop -fi -update-rc.d $D snmpd remove -} - CONFFILES_${PN}_nylon = "${sysconfdir}/snmp/snmpd.conf ${sysconfdir}/snmp/snmptrapd.conf" +CCACHE = "" + diff --git a/packages/net-snmp/net-snmp_5.4.1.bb b/packages/net-snmp/net-snmp_5.4.1.bb index d900019a0a..f76005b435 100644 --- a/packages/net-snmp/net-snmp_5.4.1.bb +++ b/packages/net-snmp/net-snmp_5.4.1.bb @@ -1,13 +1,5 @@ -DESCRIPTION = "Various tools relating to the Simple Network Management Protocol" -HOMEPAGE = "http://www.net-snmp.org/" -LICENSE = "BSD" -DEPENDS = "openssl" -RDEPENDS_${PN}-server += "net-snmp-mibs" -RDEPENDS_${PN}-client += "net-snmp-mibs" -RDEPENDS_${PN}-dev = "net-snmp-client (= ${EXTENDPV}) net-snmp-server (= ${EXTENDPV})" -RRECOMMENDS_${PN}-dbg = "net-snmp-client (= ${EXTENDPV}) net-snmp-server (= ${EXTENDPV})" - -PR = "r1" +require net-snmp.inc +PR = "r2" SRC_URI = "${SOURCEFORGE_MIRROR}/net-snmp/net-snmp-${PV}.tar.gz \ file://configure-tail.patch;patch=1 \ @@ -15,43 +7,14 @@ SRC_URI = "${SOURCEFORGE_MIRROR}/net-snmp/net-snmp-${PV}.tar.gz \ file://snmpd.conf \ file://snmptrapd.conf" -inherit autotools update-rc.d - EXTRA_OECONF = "--enable-shared --disable-manuals --with-defaults \ --disable-embedded-perl --with-perl-modules=no" EXTRA_OEMAKE = "INSTALL_PREFIX=${D}" -do_configure() { - # Additional flag based on target endiness (see siteinfo.bbclass) - ENDIANESS="${@base_conditional('SITEINFO_ENDIANESS', 'le', '--with-endianness=little', '--with-endianness=big', d)}" - oenote Determined endianess as: $ENDIANESS +do_configure_prepend() { libtoolize --force - oe_runconf $ENDIANESS -} -do_install_append() { - install -d ${D}${sysconfdir}/snmp - install -d ${D}${sysconfdir}/init.d - install -m 755 ${WORKDIR}/init ${D}${sysconfdir}/init.d/snmpd - install -m 644 ${WORKDIR}/snmpd.conf ${D}${sysconfdir}/snmp/ - install -m 644 ${WORKDIR}/snmptrapd.conf ${D}${sysconfdir}/snmp/ } -PACKAGES = "net-snmp-dbg net-snmp-doc net-snmp-dev net-snmp-libs \ - net-snmp-mibs net-snmp-server net-snmp-client" - -FILES_${PN}-libs = "${libdir}/*" -FILES_${PN}-mibs = "${datadir}/snmp/mibs" -FILES_${PN}-server = "${sbindir}/* ${sysconfdir}" -FILES_${PN}-client = "${bindir}/* ${datadir}/snmp/" -FILES_${PN}-dbg += "${libdir}/.debug/ ${sbindir}/.debug/ ${bindir}/.debug/" - -CONFFILES_${PN}-server = "${sysconfdir}/snmp/snmpd.conf \ - ${sysconfdir}/snmp/snmptrapd.conf" - -INITSCRIPT_PACKAGES = "${PN}-server" -INITSCRIPT_NAME_${PN}-server = "snmpd" -INITSCRIPT_PARAMS_${PN}-server = "defaults" - -LEAD_SONAME = "libnetsnmp.so" - PARALLEL_MAKE = "" +CCACHE = "" + diff --git a/packages/net-snmp/net-snmp_svn.bb b/packages/net-snmp/net-snmp_svn.bb new file mode 100644 index 0000000000..2f82865aaa --- /dev/null +++ b/packages/net-snmp/net-snmp_svn.bb @@ -0,0 +1,27 @@ +require net-snmp.inc +DEPENDS += "libtool libtool-native libtool-cross" + +PR = "r3" +S = "${WORKDIR}/net-snmp" + +SRC_URI = "svn://net-snmp.svn.sourceforge.net/svnroot/net-snmp/trunk;rev=17367;module=net-snmp;proto=https \ + file://init \ + file://snmpd.conf \ + file://snmptrapd.conf" + +EXTRA_OECONF = "--enable-shared --disable-manuals --with-defaults \ + --disable-embedded-perl --with-perl-modules=no GREP=/bin/grep SED=/bin/sed" +EXTRA_OEMAKE = "INSTALL_PREFIX=${D}" + +PARALLEL_MAKE = "" +CCACHE = "" + +do_configure_prepend() { + gnu-configize -f + # We better change sources and re-autoconf here, but + # required autoconf is too new for us. + sed -e '/echo.*\".*\\\\.*\"/s/echo/echo -e/g' \ + -e 's/tail -1/tail -n 1/g' \ + -i configure +} + diff --git a/packages/netbase/netbase/ronetix-pm9261/interfaces b/packages/netbase/netbase/ronetix-pm9261/interfaces new file mode 100644 index 0000000000..ab20f5b37b --- /dev/null +++ b/packages/netbase/netbase/ronetix-pm9261/interfaces @@ -0,0 +1,72 @@ +# /etc/network/interfaces -- configuration file for ifup(8), ifdown(8) + +# The loopback interface +auto lo +iface lo inet loopback + + +# Wireless interfaces +# +# Example of an unencrypted (no WEP or WPA) wireless connection +# that connects to any available access point: +# +iface wlan0 inet dhcp + wireless_mode managed + wireless_essid any +# +# +# Same as above but locked to a specific access point: +# +#iface wlan0 inet dhcp +# wireless_mode managed +# wireless-essid some-essid +# +# A WEP encrypted connection locked to a specific access point: +# +#iface wlan0 inet dhcp +# wireless-essid some-essid +# wireless-key s:My-PlainText-Password +# wireless-mode managed +# +# A WPA1 or WPA2 encrypted connection locked to a specific access point. +# This is the best option for non-roaming, single-network usage. +# Note that your card may require a firmware update to use WPA. +# Some distributions install a temporary volatile firmware update on ifup. +# +#iface wlan0 inet dhcp +# wpa-essid some-essid +# wpa-psk My-PlainText-Password +# +# A WPA1 or WPA2 encrypted connection using an external configuration file +# for wpa-supplicant. This is the way to go if you need to configure multiple +# networks with different keys and / or WPA settings and roaming support. +# +# iface wlan0 inet dhcp +# wpa-conf /etc/wpa_supplicant.conf +# wpa-driver hostap + + + +iface atml0 inet dhcp + +# Wired or wireless interfaces +auto eth0 +iface eth0 inet static + address 192.168.0.184 + netmask 255.255.255.0 + network 192.168.0.0 + gateway 192.168.0.1 + +iface eth1 inet dhcp + +# Ethernet/RNDIS gadget (g_ether) +# ... or on host side, usbnet and random hwaddr +iface usb0 inet static + address 192.168.0.202 + netmask 255.255.255.0 + network 192.168.0.0 + gateway 192.168.0.200 + +# Bluetooth networking +iface bnep0 inet dhcp + diff --git a/packages/netbase/netbase/ronetix-pm9263/interfaces b/packages/netbase/netbase/ronetix-pm9263/interfaces new file mode 100644 index 0000000000..ab20f5b37b --- /dev/null +++ b/packages/netbase/netbase/ronetix-pm9263/interfaces @@ -0,0 +1,72 @@ +# /etc/network/interfaces -- configuration file for ifup(8), ifdown(8) + +# The loopback interface +auto lo +iface lo inet loopback + + +# Wireless interfaces +# +# Example of an unencrypted (no WEP or WPA) wireless connection +# that connects to any available access point: +# +iface wlan0 inet dhcp + wireless_mode managed + wireless_essid any +# +# +# Same as above but locked to a specific access point: +# +#iface wlan0 inet dhcp +# wireless_mode managed +# wireless-essid some-essid +# +# A WEP encrypted connection locked to a specific access point: +# +#iface wlan0 inet dhcp +# wireless-essid some-essid +# wireless-key s:My-PlainText-Password +# wireless-mode managed +# +# A WPA1 or WPA2 encrypted connection locked to a specific access point. +# This is the best option for non-roaming, single-network usage. +# Note that your card may require a firmware update to use WPA. +# Some distributions install a temporary volatile firmware update on ifup. +# +#iface wlan0 inet dhcp +# wpa-essid some-essid +# wpa-psk My-PlainText-Password +# +# A WPA1 or WPA2 encrypted connection using an external configuration file +# for wpa-supplicant. This is the way to go if you need to configure multiple +# networks with different keys and / or WPA settings and roaming support. +# +# iface wlan0 inet dhcp +# wpa-conf /etc/wpa_supplicant.conf +# wpa-driver hostap + + + +iface atml0 inet dhcp + +# Wired or wireless interfaces +auto eth0 +iface eth0 inet static + address 192.168.0.184 + netmask 255.255.255.0 + network 192.168.0.0 + gateway 192.168.0.1 + +iface eth1 inet dhcp + +# Ethernet/RNDIS gadget (g_ether) +# ... or on host side, usbnet and random hwaddr +iface usb0 inet static + address 192.168.0.202 + netmask 255.255.255.0 + network 192.168.0.0 + gateway 192.168.0.200 + +# Bluetooth networking +iface bnep0 inet dhcp + diff --git a/packages/nonworking/e2fsprogs/e2fsprogs_1.41.2.bb b/packages/nonworking/e2fsprogs/e2fsprogs_1.41.2.bb new file mode 100644 index 0000000000..1b139d2a9c --- /dev/null +++ b/packages/nonworking/e2fsprogs/e2fsprogs_1.41.2.bb @@ -0,0 +1,87 @@ +require e2fsprogs.inc + +PR = "r0" +DEFAULT_PREFERENCE = "-1" + +SRC_URI += "file://no-hardlinks.patch;patch=1" + +do_compile_prepend () { + find ./ -print|xargs chmod u=rwX + ( cd util; ${BUILD_CC} subst.c -o subst ) +} + +ext2fsheaders = "ext2_ext_attr.h bitops.h ext2_err.h \ + ext2_types.h ext2_fs.h ext2_io.h \ + ext2fs.h" +e2pheaders = "e2p.h" + +do_stage () { + oe_libinstall -a -C lib libe2p ${STAGING_LIBDIR}/ + oe_libinstall -a -C lib libext2fs ${STAGING_LIBDIR}/ + install -d ${STAGING_INCDIR}/e2p + for h in ${e2pheaders}; do + install -m 0644 lib/e2p/$h ${STAGING_INCDIR}/e2p/ || die "failed to install $h" + done + install -d ${STAGING_INCDIR}/ext2fs + for h in ${ext2fsheaders}; do + install -m 0644 lib/ext2fs/$h ${STAGING_INCDIR}/ext2fs/ || die "failed to install $h" + done + autotools_stage_all +} + +# blkid used to be part of e2fsprogs but is useful outside, add it +# as an RDEPENDS so that anything relying on it being in e2fsprogs +# still works +RDEPENDS_e2fsprogs = "e2fsprogs-blkid e2fsprogs-uuidgen e2fsprogs-badblocks" + +PACKAGES =+ "e2fsprogs-blkid e2fsprogs-uuidgen e2fsprogs-e2fsck e2fsprogs-mke2fs e2fsprogs-fsck e2fsprogs-tune2fs e2fsprogs-badblocks" +FILES_e2fsprogs-blkid = "${base_sbindir}/blkid" +FILES_e2fsprogs-uuidgen = "${bindir}/uuidgen" +FILES_e2fsprogs-fsck = "${base_sbindir}/fsck.${PN}" +FILES_e2fsprogs-e2fsck = "${base_sbindir}/e2fsck.${PN} ${base_sbindir}/fsck.ext*.${PN}" +FILES_e2fsprogs-mke2fs = "${base_sbindir}/mke2fs.${PN} ${base_sbindir}/mkfs.ext*.${PN}" +FILES_e2fsprogs-tune2fs = "${base_sbindir}/tune2fs ${base_sbindir}/e2label ${base_sbindir}/findfs" +FILES_e2fsprogs-badblocks = "${base_sbindir}/badblocks" + +do_install_append () { + mv ${D}${base_sbindir}/fsck ${D}${base_sbindir}/fsck.${PN} + mv ${D}${base_sbindir}/e2fsck ${D}${base_sbindir}/e2fsck.${PN} + mv ${D}${base_sbindir}/fsck.ext2 ${D}${base_sbindir}/fsck.ext2.${PN} + mv ${D}${base_sbindir}/fsck.ext3 ${D}${base_sbindir}/fsck.ext3.${PN} + mv ${D}${base_sbindir}/mke2fs ${D}${base_sbindir}/mke2fs.${PN} + mv ${D}${base_sbindir}/mkfs.ext2 ${D}${base_sbindir}/mkfs.ext2.${PN} + mv ${D}${base_sbindir}/mkfs.ext3 ${D}${base_sbindir}/mkfs.ext3.${PN} +} + +pkg_postinst_e2fsprogs-fsck () { + update-alternatives --install ${base_sbindir}/fsck fsck fsck.${PN} 100 +} + +pkg_prerm_e2fsprogs-fsck () { + update-alternatives --remove fsck fsck.${PN} +} + +pkg_postinst_e2fsprogs-e2fsck () { + update-alternatives --install ${base_sbindir}/e2fsck e2fsck e2fsck.${PN} 100 + update-alternatives --install ${base_sbindir}/fsck.ext2 fsck.ext2 fsck.ext2.${PN} 100 + update-alternatives --install ${base_sbindir}/fsck.ext3 fsck.ext3 fsck.ext3.${PN} 100 +} + +pkg_prerm_e2fsprogs-e2fsck () { + update-alternatives --remove e2fsck e2fsck.${PN} + update-alternatives --remove fsck.ext2 fsck.ext2.${PN} + update-alternatives --remove fsck.ext3 fsck.ext3.${PN} +} + +pkg_postinst_e2fsprogs-mke2fs () { + update-alternatives --install ${base_sbindir}/mke2fs mke2fs mke2fs.${PN} 100 + update-alternatives --install ${base_sbindir}/mkfs.ext2 mkfs.ext2 mkfs.ext2.${PN} 100 + update-alternatives --install ${base_sbindir}/mkfs.ext3 mkfs.ext3 mkfs.ext3.${PN} 100 +} + +pkg_prerm_e2fsprogs-mke2fs () { + update-alternatives --remove mke2fs mke2fs.${PN} + update-alternatives --remove mkfs.ext2 mkfs.ext2.${PN} + update-alternatives --remove mkfs.ext3 mkfs.ext3.${PN} +} + diff --git a/packages/nrlolsr/nrlolsr-7.8.1/nrlolsr-cross.patch b/packages/nrlolsr/nrlolsr-7.8.1/nrlolsr-cross.patch new file mode 100644 index 0000000000..92af69f4f3 --- /dev/null +++ b/packages/nrlolsr/nrlolsr-7.8.1/nrlolsr-cross.patch @@ -0,0 +1,120 @@ +diff -Nurd nrlolsr/protolib/unix/Makefile.common nrlolsr.new/protolib/unix/Makefile.common +--- nrlolsr/protolib/unix/Makefile.common 2006-12-15 12:30:58.000000000 -0500 ++++ nrlolsr.new/protolib/unix/Makefile.common 2009-02-13 10:43:26.000000000 -0500 +@@ -12,9 +12,9 @@ + + INCLUDES = $(TCL_INCL_PATH) $(SYSTEM_INCLUDES) -I$(UNIX) -I$(COMMON) + +-CFLAGS = -g -DPROTO_DEBUG -DUNIX -D_FILE_OFFSET_BITS=64 -O -Wall -Wcast-align -pedantic -fPIC $(SYSTEM_HAVES) $(INCLUDES) ++NRL_CFLAGS = -g -DPROTO_DEBUG -DUNIX -D_FILE_OFFSET_BITS=64 -O -Wall -Wcast-align -pedantic -fPIC $(SYSTEM_HAVES) $(INCLUDES) + +-LDFLAGS = $(SYSTEM_LDFLAGS) ++NRL_LDFLAGS = $(SYSTEM_LDFLAGS) + + LIBS = $(SYSTEM_LIBS) -lm -lpthread + +@@ -22,7 +22,7 @@ + + # Rule for C++ .cpp extension + .cpp.o: +- $(CC) -c $(CFLAGS) -o $*.o $*.cpp ++ $(CC) -c $(CFLAGS) $(NRL_CFLAGS) -o $*.o $*.cpp + + KIT_SRC = $(COMMON)/protoDebug.cpp $(COMMON)/protoAddress.cpp \ + $(COMMON)/protoSocket.cpp $(COMMON)/protoTimer.cpp \ +@@ -50,37 +50,37 @@ + EXAMPLE_OBJ = $(EXAMPLE_SRC:.cpp=.o) + + protoExample: $(EXAMPLE_OBJ) libProtokit.a +- $(CC) $(CFLAGS) -o $@ $(EXAMPLE_OBJ) $(LDFLAGS) $(LIBS) libProtokit.a ++ $(CC) $(CFLAGS) $(NRLCFLAGS) -o $@ $(EXAMPLE_OBJ) $(LDFLAGS) $(NRL_LDFLAGS) $(LIBS) libProtokit.a + + THREAD_SRC = $(COMMON)/threadExample.cpp + THREAD_OBJ = $(THREAD_SRC:.cpp=.o) + + threadExample: $(THREAD_OBJ) libProtokit.a +- $(CC) $(CFLAGS) -o $@ $(THREAD_OBJ) $(LDFLAGS) $(LIBS) libProtokit.a ++ $(CC) $(CFLAGS) $(BRL_CFLAGS) -o $@ $(THREAD_OBJ) $(LDFLAGS) $(LIBS) libProtokit.a + + PIPE_SRC = $(COMMON)/pipeExample.cpp + PIPE_OBJ = $(PIPE_SRC:.cpp=.o) + + pipeExample: $(PIPE_OBJ) libProtokit.a +- $(CC) $(CFLAGS) -o $@ $(PIPE_OBJ) $(LDFLAGS) $(LIBS) libProtokit.a ++ $(CC) $(CFLAGS) $(NRLCFLAGS) -o $@ $(PIPE_OBJ) $(LDFLAGS) $(NRL_LDFLAGS) $(LIBS) libProtokit.a + + PCAP_SRC = $(COMMON)/pcapExample.cpp $(COMMON)/protoPacketeer.cpp linuxPacketeer.cpp + PCAP_OBJ = $(PCAP_SRC:.cpp=.o) + + pcapExample: $(PCAP_OBJ) libProtokit.a +- $(CC) $(CFLAGS) -o $@ $(PCAP_OBJ) $(LDFLAGS) $(LIBS) libProtokit.a -lpcap ++ $(CC) $(CFLAGS) $(NRL_CFLAGS) -o $@ $(PCAP_OBJ) $(LDFLAGS) $(NRL_LDFLAGS) $(LIBS) libProtokit.a -lpcap + + CAP_SRC = $(COMMON)/protoCapExample.cpp + CAP_OBJ = $(CAP_SRC:.cpp=.o) + + protoCapExample: $(CAP_OBJ) libProtokit.a +- $(CC) $(CFLAGS) -o $@ $(CAP_OBJ) $(LDFLAGS) $(LIBS) libProtokit.a ++ $(CC) $(CFLAGS) $(NRL_CFLAGS) -o $@ $(CAP_OBJ) $(LDFLAGS) $(NRL_LDFLAGS) $(LIBS) libProtokit.a + + DETOUR_SRC = $(COMMON)/detourExample.cpp $(SYSTEM_SRC_EX) + DETOUR_OBJ = $(DETOUR_SRC:.cpp=.o) + + detourExample: $(DETOUR_OBJ) libProtokit.a +- $(CC) $(CFLAGS) -o $@ $(DETOUR_OBJ) $(LDFLAGS) $(LIBS) libProtokit.a ++ $(CC) $(CFLAGS) $(NRL_CFLAGS) -o $@ $(DETOUR_OBJ) $(LDFLAGS) $(NRL_LDFLOAGS) $(LIBS) libProtokit.a + + clean: + rm -f *.o $(COMMON)/*.o $(NS)/*.o ../wx/*.o *.a \ +diff -Nurd nrlolsr/unix/Makefile.common nrlolsr.new/unix/Makefile.common +--- nrlolsr/unix/Makefile.common 2005-11-03 12:09:57.000000000 -0500 ++++ nrlolsr.new/unix/Makefile.common 2009-02-13 11:12:23.000000000 -0500 +@@ -13,11 +13,11 @@ + + INCLUDES = $(TCL_INCL_PATH) $(SYSTEM_INCLUDES) $(WX_INCLUDES) -I$(UNIX) -I$(COMMON) -I$(PROTOLIB)/common + +-CFLAGS = -g -DPROTO_DEBUG -DUNIX -Wall -O -fPIC $(SYSTEM_HAVES) $(INCLUDES) ++NRL_CFLAGS = -g -DPROTO_DEBUG -DUNIX -Wall -O -fPIC $(SYSTEM_HAVES) $(INCLUDES) + + WXCFLAGS = -g -DPROTO_DEBUG -DUNIX -Wall -O -fPIC $(WX_FLAGS) $(SYSTEM_HAVES) $(INCLUDES) + +-LDFLAGS = $(SYSTEM_LDFLAGS) ++NRL_LDFLAGS = $(SYSTEM_LDFLAGS) + + LIBS = $(SYSTEM_LIBS) -lm + +@@ -25,7 +25,7 @@ + + # Rule for C++ .cpp extension + .cpp.o: +- $(CC) -c $(CFLAGS) -o $*.o $*.cpp ++ $(CC) -c $(CFLAGS) $(NRL_CFLAGS) -o $*.o $*.cpp + + all: nrlolsrd + +@@ -40,13 +40,13 @@ + OLSR_OBJ = $(OLSR_SRC:.cpp=.o) + + nrlolsrd: $(LIBPROTO) $(OLSR_OBJ) +- $(CC) -g $(CFLAGS) -o $@ $(OLSR_OBJ) $(LDFLAGS) $(LIBS) $(LIBPROTO) -l pcap ++ $(CXX) -g $(CFLAGS) -o $@ $(OLSR_OBJ) $(LDFLAGS) $(NRL_LDFLAGS) $(LIBS) $(LIBPROTO) -l pcap + + MNM_SRC = $(COMMON)/mnmMacMsg.cpp $(COMMON)/mnmExample.cpp + MNM_OBJ = $(MNM_SRC:.cpp=.o) + + mnmExample: $(LIBPROTO) $(MNM_OBJ) +- $(CC) -g $(CFLAGS) -o $@ $(MNM_OBJ) $(LDFLAGS) $(LIBS) $(LIBPROTO) ++ $(CC) -g $(CFLAGS) $(NRL_CFLAGS) -o $@ $(MNM_OBJ) $(LDFLAGS) $(NRL_LDFLAGS) $(LIBS) $(LIBPROTO) + + # Re-define rule for C++ .cpp extension + .cpp.o: +@@ -56,7 +56,7 @@ + NRLOLSRGUI_OBJ = $(NRLOLSRGUI_SRC:.cpp=.o) + + olsrgui: $(NRLOLSRGUI_OBJ) $(LIBPROTO) +- $(CC) -g $(WXCFLAGS) -o $@ $(NRLOLSRGUI_OBJ) $(LIBPROTO) $(LDFLAGS) $(WX_FLAGS) $(LIBS) $(WX_LIBS) ++ $(CC) -g $(WXCFLAGS) -o $@ $(NRLOLSRGUI_OBJ) $(LIBPROTO) $(LDFLAGS) $(NRL_LDFLAGS) $(WX_FLAGS) $(LIBS) $(WX_LIBS) + + clean: + rm -f *.o $(COMMON)/*.o $(NS)/*.o nrlolsrd olsrgui +Binary files nrlolsr/unix/.Makefile.common.swp and nrlolsr.new/unix/.Makefile.common.swp differ diff --git a/packages/nrlolsr/nrlolsr_7.8.1.bb b/packages/nrlolsr/nrlolsr_7.8.1.bb new file mode 100644 index 0000000000..3fa5e2f4df --- /dev/null +++ b/packages/nrlolsr/nrlolsr_7.8.1.bb @@ -0,0 +1,27 @@ +DESCRIPTION = "NRL OLSR - added to OE to support the Maniac Challenge (http://www.maniacchallenge.org/)" +SECTION = "applications" +LICENSE = "Public Domain" + +S="${WORKDIR}/nrlolsr/" + +SRC_URI = "http://downloads.pf.itd.nrl.navy.mil/olsr/nrlolsrdv7.8.1.tgz \ + file://nrlolsr-cross.patch;patch=1 \ + " + +do_compile () { + cd ${S}/unix + + sed -i -e 's:-I/usr/X11R6/include:-I${STAGING_INCDIR}:g' Makefile.linux + sed -i -e 's:-L/usr/X11R6/lib:-L${STAGING_LIBDIR}:g' Makefile.linux + sed -i -e 's:/usr/local/bin:${STAGING_BINDIR}:g' Makefile.linux + sed -i -e 's:make -f Makefile:make -e -f Makefile:g' Makefile.common + +# EXTRA_OEMAKE="-f Makefile.linux" + oe_runmake -f Makefile.linux + +} + +do_install () { + install -d ${D}/${bindir} + install unix/nrlolsrd ${D}/${bindir} +} diff --git a/packages/ntfs-3g/ntfs-3g_1.0.bb b/packages/ntfs-3g/ntfs-3g_1.0.bb index 7d73b79ac9..ac2b384c9e 100644 --- a/packages/ntfs-3g/ntfs-3g_1.0.bb +++ b/packages/ntfs-3g/ntfs-3g_1.0.bb @@ -5,6 +5,8 @@ DEPENDS = "fuse" RDEPENDS = "fuse" PR = "r0" +DEFAULT_PREFERENCE = "-1" + SRC_URI = http://www.ntfs-3g.org/ntfs-3g-${PV}.tgz inherit autotools diff --git a/packages/ntfs-3g/ntfs-3g_2009.1.1.bb b/packages/ntfs-3g/ntfs-3g_2009.1.1.bb new file mode 100644 index 0000000000..7d73b79ac9 --- /dev/null +++ b/packages/ntfs-3g/ntfs-3g_2009.1.1.bb @@ -0,0 +1,12 @@ +DESCRIPTION = "The NTFS-3G driver is an open source, freely available NTFS driver for Linux with read and write support." +HOMEPAGE = "http://www.ntfs-3g.org/" +LICENSE = "GPLv2" +DEPENDS = "fuse" +RDEPENDS = "fuse" +PR = "r0" + +SRC_URI = http://www.ntfs-3g.org/ntfs-3g-${PV}.tgz + +inherit autotools + +EXTRA_OEMAKE = "LDCONFIG=echo" diff --git a/packages/ogre/ogre-egl_svn.bb b/packages/ogre/ogre-egl_svn.bb index 8cecf56a7d..9ca9e8f54f 100644 --- a/packages/ogre/ogre-egl_svn.bb +++ b/packages/ogre/ogre-egl_svn.bb @@ -1,6 +1,8 @@ DESCRIPTION = "OGRE (Object-Oriented Graphics Rendering Engine) is a scene-oriented, flexible 3D engine " LICENSE = "LGPL" -DEPENDS = "zziplib boost freeimage freetype virtual/libx11 virtual/egl" +DEPENDS = "gtk+ wgois cppunit zziplib boost freeimage freetype virtual/libx11 virtual/egl" + +PR = "r3" SRCREV = "8310" PV = "1.6.1+svnr${SRCREV}" @@ -12,7 +14,7 @@ SRC_URI = "svn://ogre.svn.sourceforge.net/svnroot/ogre;module=trunk;proto=https inherit autotools_stage # This is the EGL version -EXTRA_OECONF = " --with-allocator=std --enable-threading=no --disable-cg --enable-gles " +EXTRA_OECONF = " --with-gui=gtk --disable-freetypetest --enable-ogre-demos --with-allocator=std --enable-threading=no --disable-cg --enable-gles " S = "${WORKDIR}/trunk" @@ -23,7 +25,20 @@ do_configure_prepend() { sed -i -e /OGRE_DETECT_ENDIAN/d ${S}/configure.in } -FILES_${PN}-dbg += "${libdir}/OGRE/.debug" +do_install_append() { + install -d ${D}${datadir}/ogre3d/samples + mv ${D}${S}/Samples/* ${D}${datadir}/ogre3d/samples/ + cp ${S}/Samples/Common/bin/Release/*cfg ${D}${datadir}/ogre3d/samples/Common/bin + + install -d ${D}${datadir}/ogre3d/Media + cp -r ${S}/Samples/Media/* ${D}${datadir}/ogre3d/Media/ + find ${D} -name ".svn" | xargs rm -rf +} + +PACKAGES += "${PN}-samples" + +FILES_${PN}-samples = "${datadir}/ogre3d/" +FILES_${PN}-dbg += "${libdir}/OGRE/.debug ${datadir}/ogre3d/samples/*/*/.debug" FILES_${PN}-dev += "${libdir}/OGRE/*.la" -FILES_${PN} += "${libdir}/OGRE/*.so" +FILES_${PN} += "${libdir}/libOgreMain-*.so ${libdir}/OGRE/*.so" diff --git a/packages/ogre/wgois_1.2.0.bb b/packages/ogre/wgois_1.2.0.bb new file mode 100644 index 0000000000..ff59a3bcae --- /dev/null +++ b/packages/ogre/wgois_1.2.0.bb @@ -0,0 +1,15 @@ +DESCRIPTION = "Object Oriented Input System (OIS) is meant to be a cross platform, simple solution for using all kinds of Input Devices." +LICENSE = "zlib" +DEPENDS = "virtual/libx11" + +SRC_URI = "${SOURCEFORGE_MIRROR}/wgois/ois_${PV}.tar.gz" + +inherit autotools_stage + +S = "${WORKDIR}/ois" + +FILES_${PN} += "${libdir}/libOIS-1*.so" + + + + diff --git a/packages/opkg/files/opkg_unarchive.patch b/packages/opkg/files/opkg_unarchive.patch new file mode 100644 index 0000000000..9e5ccfb714 --- /dev/null +++ b/packages/opkg/files/opkg_unarchive.patch @@ -0,0 +1,13 @@ +--- trunk/libbb/unarchive.c.orig 2009-02-11 22:14:58.000000000 +0100 ++++ trunk/libbb/unarchive.c 2009-02-11 22:15:07.000000000 +0100 +@@ -606,6 +606,10 @@ + tar_entry->name = concat_path_file(tar.formated.prefix, tar.formated.name); + } + ++ if (strlen(tar_entry->name) > 100) { ++ tar_entry->name[100] = 0; ++ } ++ + // tar_entry->name = xstrdup(tar.formated.name); + + /* diff --git a/packages/opkg/files/opkg_wget_nogpg_04_default_tmpdir.patch b/packages/opkg/files/opkg_wget_nogpg_04_default_tmpdir.patch new file mode 100644 index 0000000000..403073fced --- /dev/null +++ b/packages/opkg/files/opkg_wget_nogpg_04_default_tmpdir.patch @@ -0,0 +1,20 @@ +# This patch moves the default tmpdir from /tmp, which is +# normally an in-memory filesystem to /root, which is not. +# This is desirable on very small-memory systems -- for +# example, the ipk for samba is nearly 20MB in size, and +# simply won't fit in /tmp, and attempting to do so very +# often causes a silent failure due to the OOM killer. +# +# Mike Westerhof, Feb 2009 +# +--- orig/libopkg/opkg_conf.h 2009-02-13 21:56:27.000000000 -0600 ++++ opkg/libopkg/opkg_conf.h 2009-02-13 21:56:39.000000000 -0600 +@@ -28,7 +28,7 @@ typedef struct opkg_conf opkg_conf_t; + #include "pkg_dest_list.h" + #include "nv_pair_list.h" + +-#define OPKG_CONF_DEFAULT_TMP_DIR_BASE "/tmp" ++#define OPKG_CONF_DEFAULT_TMP_DIR_BASE "/root" + #define OPKG_CONF_TMP_DIR_SUFFIX "opkg-XXXXXX" + #define OPKG_CONF_LISTS_DIR OPKG_STATE_DIR_PREFIX "/lists" + #define OPKG_CONF_PENDING_DIR OPKG_STATE_DIR_PREFIX "/pending" diff --git a/packages/opkg/opkg-native_svn.bb b/packages/opkg/opkg-native_svn.bb index 57c6e61fb0..82c74e0b86 100644 --- a/packages/opkg/opkg-native_svn.bb +++ b/packages/opkg/opkg-native_svn.bb @@ -1,7 +1,7 @@ require opkg.inc DEPENDS = "curl-native" -PR = "r2" +PR = "r3" target_libdir := "${libdir}" diff --git a/packages/opkg/opkg-nogpg-nocurl_svn.bb b/packages/opkg/opkg-nogpg-nocurl_svn.bb index 4daa58f274..6f8b446ead 100644 --- a/packages/opkg/opkg-nogpg-nocurl_svn.bb +++ b/packages/opkg/opkg-nogpg-nocurl_svn.bb @@ -9,8 +9,9 @@ SRC_URI += " \ file://opkg_wget_nogpg_01_use_vfork_gunzip.patch;patch=1 \ file://opkg_wget_nogpg_02_use_vfork_system.patch;patch=1 \ file://opkg_wget_nogpg_03_fix_tmpdirs.patch;patch=1 \ + file://opkg_wget_nogpg_04_default_tmpdir.patch;patch=1 \ " -PR = "r3" +PR = "r5" SRCREV = "${SRCREV_pn-opkg}" diff --git a/packages/opkg/opkg-nogpg_svn.bb b/packages/opkg/opkg-nogpg_svn.bb index f58df2fb18..a9297d7645 100644 --- a/packages/opkg/opkg-nogpg_svn.bb +++ b/packages/opkg/opkg-nogpg_svn.bb @@ -3,7 +3,7 @@ require opkg_svn.bb DEPENDS = "curl" PROVIDES += "opkg" -PR = "r2" +PR = "r3" SRCREV = "${SRCREV_pn-opkg}" diff --git a/packages/opkg/opkg-sdk_svn.bb b/packages/opkg/opkg-sdk_svn.bb index c28fe97591..d9b3727d82 100644 --- a/packages/opkg/opkg-sdk_svn.bb +++ b/packages/opkg/opkg-sdk_svn.bb @@ -1,7 +1,7 @@ require opkg.inc DEPENDS = "curl-sdk" -PR = "r2" +PR = "r3" target_libdir := "${libdir}" inherit sdk diff --git a/packages/opkg/opkg.inc b/packages/opkg/opkg.inc index b586e70ab9..bd16f92e20 100644 --- a/packages/opkg/opkg.inc +++ b/packages/opkg/opkg.inc @@ -5,7 +5,8 @@ LICENSE = "GPL" DEPENDS = "curl gpgme" PV = "0.1.6+svnr${SRCREV}" -SRC_URI = "svn://opkg.googlecode.com/svn;module=trunk;proto=http" +SRC_URI = "svn://opkg.googlecode.com/svn;module=trunk;proto=http \ + file://opkg_unarchive.patch;patch=1" S = "${WORKDIR}/trunk" inherit autotools pkgconfig diff --git a/packages/opkg/opkg_svn.bb b/packages/opkg/opkg_svn.bb index 4cf1c5caab..a4728970ce 100644 --- a/packages/opkg/opkg_svn.bb +++ b/packages/opkg/opkg_svn.bb @@ -1,6 +1,6 @@ require opkg.inc -PR = "r1" +PR = "r2" PACKAGES =+ "libopkg-dev libopkg" diff --git a/packages/parted/files/parted-1.8.x.patch b/packages/parted/files/parted-1.8.x.patch new file mode 100644 index 0000000000..167a0fbeff --- /dev/null +++ b/packages/parted/files/parted-1.8.x.patch @@ -0,0 +1,1492 @@ +diff --git a/configure.ac b/configure.ac +index f1284a0..9f0971b 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -5,7 +5,7 @@ dnl + dnl This file may be modified and/or distributed without restriction. + + AC_PREREQ(2.61) +-AC_INIT([GNU parted],[1.8.8],[bug-parted@gnu.org]) ++AC_INIT([GNU parted],[1.8.9],[bug-parted@gnu.org]) + + AC_CONFIG_SRCDIR(include/parted/parted.h) + +@@ -24,7 +24,7 @@ dnl function signatures changed), + dnl set PED_BINARY_AGE _and_ PED_INTERFACE_AGE to 0. + PED_MAJOR_VERSION=1 + PED_MINOR_VERSION=8 +-PED_MICRO_VERSION=8 ++PED_MICRO_VERSION=9 + PED_INTERFACE_AGE=0 + PED_BINARY_AGE=0 + PED_VERSION_SUFFIX= +@@ -471,14 +471,7 @@ AC_CHECK_HEADER([execinfo.h], [ + ]) + ]) + +-dnl Checks for #defines. +-AC_COMPILE_IFELSE([ +- AC_LANG_PROGRAM([[ +- #if defined __s390__ || defined __s390x__ +- # message s390 defined +- #endif +- ]])], [compile_for_s390="no"], [compile_for_s390="yes"]) +-AM_CONDITIONAL([COMPILE_FOR_S390], [test "$compile_for_s390" = "yes"]) ++AM_CONDITIONAL([COMPILE_FOR_S390], [test "$host_cpu" = s390 || test "$host_cpu" = s390x]) + + dnl check for "check", unit testing library/header + PKG_CHECK_MODULES([CHECK], [check >= 0.9.3], have_check=yes, have_check=no) +diff --git a/doc/C/parted.8 b/doc/C/parted.8 +index 7040402..fdf3d04 100644 +--- a/doc/C/parted.8 ++++ b/doc/C/parted.8 +@@ -124,6 +124,18 @@ and a human-friendly form for output). + .B version + Display version information and a copyright message. + .RE ++.SH KNOWN ISSUES ++ext3 filesystem resizing does not currently work, please use ++.BR resize2fs (8) ++instead. ++ ++Resizing partitions with an ext3 filesystem will not generally work because ++of the above issue. Use ++.BR resize2fs (8) ++to resize the filesystem and resize the partition manually using ++.BR fdisk (8) ++or a similar tool. For LVM situations, you will need to use the LVM commands ++to resize the LVM elements. + .SH REPORTING BUGS + Report bugs to <bug-parted@gnu.org> + .SH SEE ALSO +diff --git a/doc/parted.texi b/doc/parted.texi +index 139ea77..86ec076 100644 +--- a/doc/parted.texi ++++ b/doc/parted.texi +@@ -14,7 +14,7 @@ resizing, checking and copy partitions and file systems on them. + @ifnottex @c texi2pdf don't understand copying and insertcopying ??? + @c modifications must also be done in the titlepage + @copying +-Copyright @copyright{} 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007 ++Copyright @copyright{} 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 + Free Software Foundation, Inc. + + Permission is granted to copy, distribute and/or modify this document +@@ -63,7 +63,7 @@ Free Documentation License''. + + @c WTF doesn't texi2html include the titlepage? + @ifhtml +-@insertcopying ++@insertcopying + @end ifhtml + + This document describes the use of GNU Parted, a program for creating, +@@ -257,7 +257,7 @@ $ @kbd{make} + However, there are a few options for @command{configure}: + + @table @code +-@item --without-readline ++@item --without-readline + turns off use of readline. This is useful for making rescue disks, + etc., where few libraries are available. + +@@ -275,12 +275,12 @@ you don't need the flexibility. + @item --disable-fs + disable all file system support + +-@item --disable-nls ++@item --disable-nls + turns off native language support. This is useful for use with old + versions of glibc, or a trimmed down version of glibc suitable for + rescue disks. + +-@item --disable-shared ++@item --disable-shared + turns off shared libraries. This may be necessary for use with old + versions of GNU libc, if you get a compile error about a ``spilled + register''. Also useful for boot/rescue disks. +@@ -301,7 +301,7 @@ disable writing (for debugging) + + @node Static binaries + @section Using static binaries of GNU Parted +-@cindex static binary ++@cindex static binary + @cindex unsupported platforms + @cindex resizing root device + +@@ -320,7 +320,7 @@ of the latest GNU Parted version is available, which you can use thus: + + @subsection Creating the Parted disk + @enumerate +-@item Boot your system ++@item Boot your system + + @item Download @file{parted-static-VERSION.tgz} from @uref{ftp://ftp.gnu.org/gnu/parted/static} + @item Unpack the tarball, resulting in a file called ``parted.static". +@@ -329,7 +329,7 @@ of the latest GNU Parted version is available, which you can use thus: + + @item Do a low-level format on it (on GNU/Linux this can be achieved with + the tool ``fdformat" from the ``util-linux" package. +- This is basically a sanity check because floppy disks often ++ This is basically a sanity check because floppy disks often + contain bad blocks. + + @item Create a file system. Example: +@@ -359,7 +359,7 @@ $ @kbd{umount /mnt/floppy} + + @subsection Using the Parted disk + @enumerate +-@item Choose a rescue disk that suits you. ++@item Choose a rescue disk that suits you. + + @item Boot off your rescue disk. Mount the disk you copied Parted onto. + +@@ -383,7 +383,7 @@ $ @kbd{umount /mnt/floppy} + @end menu + + @node Partitioning +-@section Introduction to Partitioning ++@section Introduction to Partitioning + @cindex partitioning overview + + Unfortunately, partitioning your disk is rather complicated. This is +@@ -566,7 +566,7 @@ Supported file systems: + (provided the destination partition is larger than the source partition) + + @item fat16, fat32 +-@item linux-swap ++@item linux-swap + (equivalent to mkswap on destination partition) + @item reiserfs (if libreiserfs is installed) + +@@ -918,7 +918,7 @@ partitions can be resized only so long as the new extended partition + completely contains all logical partitions. + + Note that Parted can manipulate partitions whether or not they have been +-defragmented, so you do not need to defragmenting the disk before ++defragmented, so you do not need to defragment the disk before + using Parted. + + Supported file systems: +@@ -1031,7 +1031,7 @@ Microsoft operating systems. + + @item raid + (MS-DOS) - this flag can be enabled to tell linux the partition is a +-software RAID partition. ++software RAID partition. + + @item LVM + (MS-DOS) - this flag can be enabled to tell linux the partition is a +@@ -1109,59 +1109,59 @@ specified after an input number. Input numbers can be followed by + an unit (without any space or other character between them), in + which case this unit apply instead of the default unit for this + particular number, but CHS and cylinder units are not supported as +-a suffix. If no suffix is given, then the default unit is assumed. ++a suffix. If no suffix is given, then the default unit is assumed. + Parted will compute sensible ranges for the locations you specify + (e.g. a range of +/- 500 MB when you specify the location in ``G'') + and will select the nearest location in this range from the one you + wrote that satisfies constraints from both the operation, the + filesystem being worked on, the disk label, other partitions and so + on. Use the sector unit ``s'' to specify exact locations (if they +-do not satisfy all onstraints, Parted will ask you for the nearest ++do not satisfy all onstraints, Parted will ask you for the nearest + solution). Note that negative numbers count back from the end of +-the disk, with ``-1s'' pointing to the end of the disk. ++the disk, with ``-1s'' pointing to the end of the disk. + + Example: + + @example + @group +-(parted) unit compact +-(parted) print ++(parted) unit compact ++(parted) print + Disk geometry for /dev/hda: 0kB - 123GB + Disk label type: msdos + Number Start End Size Type File system Flags + 1 32kB 1078MB 1077MB primary reiserfs boot +-2 1078MB 2155MB 1078MB primary linux-swap +-3 2155MB 123GB 121GB extended +-5 2155MB 7452MB 5297MB logical reiserfs ++2 1078MB 2155MB 1078MB primary linux-swap ++3 2155MB 123GB 121GB extended ++5 2155MB 7452MB 5297MB logical reiserfs + @end group + @group +-(parted) unit chs print ++(parted) unit chs print + Disk geometry for /dev/hda: 0,0,0 - 14946,225,62 + BIOS cylinder,head,sector geometry: 14946,255,63. Each cylinder + is 8225kB. + Disk label type: msdos + Number Start End Type File system Flags + 1 0,1,0 130,254,62 primary reiserfs boot +-2 131,0,0 261,254,62 primary linux-swap +-3 262,0,0 14945,254,62 extended +-5 262,2,0 905,254,62 logical reiserfs ++2 131,0,0 261,254,62 primary linux-swap ++3 262,0,0 14945,254,62 extended ++5 262,2,0 905,254,62 logical reiserfs + @end group + @group +-(parted) unit mb print ++(parted) unit mb print + Disk geometry for /dev/hda: 0MB - 122942MB + Disk label type: msdos + Number Start End Size Type File system Flags + 1 0MB 1078MB 1077MB primary reiserfs boot +-2 1078MB 2155MB 1078MB primary linux-swap +-3 2155MB 122935MB 120780MB extended +-5 2155MB 7452MB 5297MB logical reiserfs ++2 1078MB 2155MB 1078MB primary linux-swap ++3 2155MB 122935MB 120780MB extended ++5 2155MB 7452MB 5297MB logical reiserfs + @end group + @end example + + @end deffn + + @node Related information +-@chapter Related information ++@chapter Related information + @cindex further reading + @cindex related documentation + +diff --git a/include/parted/constraint.h b/include/parted/constraint.h +index 7a39602..6496926 100644 +--- a/include/parted/constraint.h ++++ b/include/parted/constraint.h +@@ -22,6 +22,7 @@ + typedef struct _PedConstraint PedConstraint; + + #include <parted/device.h> ++#include <parted/geom.h> + #include <parted/natmath.h> + + struct _PedConstraint { +diff --git a/include/parted/device.h b/include/parted/device.h +index cf32dba..e669688 100644 +--- a/include/parted/device.h ++++ b/include/parted/device.h +@@ -26,6 +26,7 @@ + #ifndef PED_DEVICE_H_INCLUDED + #define PED_DEVICE_H_INCLUDED + ++#include <parted/constraint.h> + #include <parted/timer.h> + + /** We can address 2^63 sectors */ +@@ -45,9 +46,7 @@ typedef enum { + PED_DEVICE_DASD = 9, + PED_DEVICE_VIODASD = 10, + PED_DEVICE_SX8 = 11, +-#ifdef ENABLE_DEVICE_MAPPER + PED_DEVICE_DM = 12, +-#endif + PED_DEVICE_XVD = 13 + } PedDeviceType; + +diff --git a/include/parted/disk.h b/include/parted/disk.h +index b82ea0f..1b0133d 100644 +--- a/include/parted/disk.h ++++ b/include/parted/disk.h +@@ -1,6 +1,6 @@ + /* + libparted - a library for manipulating disk partitions +- Copyright (C) 1999, 2000, 2001, 2002, 2007 Free Software Foundation, Inc. ++ Copyright (C) 1999, 2000, 2001, 2002, 2007, 2008 Free Software Foundation, Inc. + + 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 +@@ -52,10 +52,11 @@ enum _PedPartitionFlag { + PED_PARTITION_HPSERVICE=8, + PED_PARTITION_PALO=9, + PED_PARTITION_PREP=10, +- PED_PARTITION_MSFT_RESERVED=11 ++ PED_PARTITION_MSFT_RESERVED=11, ++ PED_PARTITION_BIOS_GRUB=12 + }; + #define PED_PARTITION_FIRST_FLAG PED_PARTITION_BOOT +-#define PED_PARTITION_LAST_FLAG PED_PARTITION_MSFT_RESERVED ++#define PED_PARTITION_LAST_FLAG PED_PARTITION_BIOS_GRUB + + enum _PedDiskTypeFeature { + PED_DISK_TYPE_EXTENDED=1, /**< supports extended partitions */ +diff --git a/include/parted/linux.h b/include/parted/linux.h +index 52d28be..05a2f0e 100644 +--- a/include/parted/linux.h ++++ b/include/parted/linux.h +@@ -22,7 +22,7 @@ + #include <parted/parted.h> + #include <parted/device.h> + +-#if defined __s390__ || defined __s390x__ ++#if defined(__s390__) || defined(__s390x__) + # include <parted/fdasd.h> + #endif + +diff --git a/include/parted/natmath.h b/include/parted/natmath.h +index 32a6e28..e387833 100644 +--- a/include/parted/natmath.h ++++ b/include/parted/natmath.h +@@ -30,6 +30,7 @@ + typedef struct _PedAlignment PedAlignment; + + #include <parted/disk.h> ++#include <parted/device.h> + + #define PED_MIN(a, b) ( ((a)<(b)) ? (a) : (b) ) + #define PED_MAX(a, b) ( ((a)>(b)) ? (a) : (b) ) +diff --git a/libparted/arch/linux.c b/libparted/arch/linux.c +index 462ab92..9876956 100644 +--- a/libparted/arch/linux.c ++++ b/libparted/arch/linux.c +@@ -64,7 +64,7 @@ + #define HDIO_GETGEO 0x0301 /* get device geometry */ + #define HDIO_GET_IDENTITY 0x030d /* get IDE identification info */ + +-#if defined(O_DIRECT) && (!defined(__s390__) || !defined(__s390x__)) ++#if defined(O_DIRECT) && !(defined(__s390__) || defined(__s390x__)) + #define RD_MODE (O_RDONLY | O_DIRECT) + #define WR_MODE (O_WRONLY | O_DIRECT) + #define RW_MODE (O_RDWR | O_DIRECT) +@@ -986,7 +986,7 @@ error: + } + + static int +-init_dasd (PedDevice* dev, char* model_name) ++init_dasd (PedDevice* dev, const char* model_name) + { + struct stat dev_stat; + struct hd_geometry geo; +@@ -1042,7 +1042,7 @@ error: + } + + static int +-init_generic (PedDevice* dev, char* model_name) ++init_generic (PedDevice* dev, const char* model_name) + { + struct stat dev_stat; + PedExceptionOption ex_status; +diff --git a/libparted/cs/natmath.c b/libparted/cs/natmath.c +index b8b4a95..fd376cd 100644 +--- a/libparted/cs/natmath.c ++++ b/libparted/cs/natmath.c +@@ -74,16 +74,16 @@ ped_round_down_to (PedSector sector, PedSector grain_size) + return sector - abs_mod (sector, grain_size); + } + +-inline PedSector ++PedSector + ped_div_round_up (PedSector numerator, PedSector divisor) + { +- return (numerator + divisor - 1) / divisor; ++ return (numerator + divisor - 1) / divisor; + } + +-inline PedSector ++PedSector + ped_div_round_to_nearest (PedSector numerator, PedSector divisor) + { +- return (numerator + divisor/2) / divisor; ++ return (numerator + divisor/2) / divisor; + } + + /* Rounds a number up to the closest number that is a multiple of +diff --git a/libparted/disk.c b/libparted/disk.c +index 1582f26..c465d40 100644 +--- a/libparted/disk.c ++++ b/libparted/disk.c +@@ -224,23 +224,24 @@ static int + _add_duplicate_part (PedDisk* disk, PedPartition* old_part) + { + PedPartition* new_part; +- PedConstraint* constraint_exact; ++ int ret; + + new_part = disk->type->ops->partition_duplicate (old_part); + if (!new_part) + goto error; + new_part->disk = disk; + +- constraint_exact = ped_constraint_exact (&new_part->geom); +- if (!constraint_exact) ++ _disk_push_update_mode (disk); ++ ret = _disk_raw_add (disk, new_part); ++ _disk_pop_update_mode (disk); ++ if (!ret) + goto error_destroy_new_part; +- if (!ped_disk_add_partition (disk, new_part, constraint_exact)) +- goto error_destroy_constraint_exact; +- ped_constraint_destroy (constraint_exact); ++#ifdef DEBUG ++ if (!_disk_check_sanity (disk)) ++ goto error_destroy_new_part; ++#endif + return 1; + +-error_destroy_constraint_exact: +- ped_constraint_destroy (constraint_exact); + error_destroy_new_part: + ped_partition_destroy (new_part); + error: +@@ -2161,6 +2162,8 @@ ped_partition_flag_get_name (PedPartitionFlag flag) + switch (flag) { + case PED_PARTITION_BOOT: + return N_("boot"); ++ case PED_PARTITION_BIOS_GRUB: ++ return N_("bios_grub"); + case PED_PARTITION_ROOT: + return N_("root"); + case PED_PARTITION_SWAP: +diff --git a/libparted/exception.c b/libparted/exception.c +index 0940d65..230a9b7 100644 +--- a/libparted/exception.c ++++ b/libparted/exception.c +@@ -1,6 +1,6 @@ + /* + libparted - a library for manipulating disk partitions +- Copyright (C) 1999, 2000, 2007 Free Software Foundation, Inc. ++ Copyright (C) 1999, 2000, 2007-2008 Free Software Foundation, Inc. + + 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 +@@ -73,7 +73,7 @@ static PedExceptionHandler* ex_handler = default_handler; + static PedException* ex = NULL; + static int ex_fetch_count = 0; + +-static char* type_strings [] = { ++static const char *const type_strings [] = { + N_("Information"), + N_("Warning"), + N_("Error"), +@@ -82,7 +82,7 @@ static char* type_strings [] = { + N_("No Implementation") + }; + +-static char* option_strings [] = { ++static const char *const option_strings [] = { + N_("Fix"), + N_("Yes"), + N_("No"), +@@ -98,7 +98,7 @@ static char* option_strings [] = { + char* + ped_exception_get_type_string (PedExceptionType ex_type) + { +- return type_strings [ex_type - 1]; ++ return (char *) type_strings [ex_type - 1]; + } + + /* FIXME: move this out to the prospective math.c */ +@@ -121,7 +121,7 @@ ped_log2 (int n) + char* + ped_exception_get_option_string (PedExceptionOption ex_opt) + { +- return option_strings [ped_log2 (ex_opt)]; ++ return (char *) option_strings [ped_log2 (ex_opt)]; + } + + static PedExceptionOption +@@ -243,8 +243,8 @@ ped_exception_throw (PedExceptionType ex_type, + ex->type = ex_type; + ex->options = ex_opts; + +- while (1) { +- ex->message = (char*) malloc (size); ++ while (message) { ++ ex->message = (char*) malloc (size * sizeof (char)); + if (!ex->message) + goto no_memory; + +@@ -256,6 +256,7 @@ ped_exception_throw (PedExceptionType ex_type, + break; + + size += 10; ++ ped_free (ex->message); + } + + return do_throw (); +diff --git a/libparted/fs/ext2/ext2.c b/libparted/fs/ext2/ext2.c +index 618fca9..79fc6f6 100644 +--- a/libparted/fs/ext2/ext2.c ++++ b/libparted/fs/ext2/ext2.c +@@ -727,7 +727,10 @@ struct ext2_fs *ext2_open(struct ext2_dev_handle *handle, int state) + EXT2_FEATURE_RO_COMPAT_LARGE_FILE))) + { + ped_exception_throw (PED_EXCEPTION_ERROR, PED_EXCEPTION_CANCEL, +- _("File system has an incompatible feature enabled.")); ++ _("File system has an incompatible feature enabled. " ++ "Compatible features are has_journal, dir_index, " ++ "filetype, sparse_super and large_file. " ++ "Use tune2fs or debugfs to remove features.")); + goto error_free_fs; + } + +diff --git a/libparted/fs/ext2/ext2_block_relocator.c b/libparted/fs/ext2/ext2_block_relocator.c +index b75a4c5..60f3d50 100644 +--- a/libparted/fs/ext2/ext2_block_relocator.c ++++ b/libparted/fs/ext2/ext2_block_relocator.c +@@ -691,10 +691,11 @@ static int ext2_block_relocator_flush(struct ext2_fs *fs, struct ext2_block_relo + { + /* FIXXXME gross hack */ + fprintf(stderr, "relocating %s blocks", +- ((char *[4]){"direct", +- "singly indirect", +- "doubly indirect", +- "triply indirect"})[i]); ++ ((const char *const [4]) ++ {"direct", ++ "singly indirect", ++ "doubly indirect", ++ "triply indirect"})[i]); + fflush(stderr); + } + +diff --git a/libparted/fs/ext2/ext2_mkfs.c b/libparted/fs/ext2/ext2_mkfs.c +index 19931dd..b1a8ce3 100644 +--- a/libparted/fs/ext2/ext2_mkfs.c ++++ b/libparted/fs/ext2/ext2_mkfs.c +@@ -1,6 +1,6 @@ + /* + ext2_mkfs.c -- ext2 fs creator +- Copyright (C) 1999, 2000, 2001, 2007 Free Software Foundation, Inc. ++ Copyright (C) 1999, 2000, 2001, 2007-2008 Free Software Foundation, Inc. + + 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 +@@ -263,7 +263,7 @@ error: + + /* returns the offset into the buffer of the start of the next dir entry */ + static int _set_dirent(void* buf, int offset, int block_size, int is_last, +- uint32_t inode, char* name, int file_type) ++ uint32_t inode, const char* name, int file_type) + { + struct ext2_dir_entry_2 *dirent = (void*) (((char*)buf) + offset); + int name_len = strlen(name); +diff --git a/libparted/fs/fat/resize.c b/libparted/fs/fat/resize.c +index 7386948..5f24ec2 100644 +--- a/libparted/fs/fat/resize.c ++++ b/libparted/fs/fat/resize.c +@@ -1,6 +1,6 @@ + /* + libparted +- Copyright (C) 1998, 1999, 2000, 2007 Free Software Foundation, Inc. ++ Copyright (C) 1998, 1999, 2000, 2007-2008 Free Software Foundation, Inc. + + 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 +@@ -481,8 +481,8 @@ ask_type (PedFileSystem* fs, int fat16_ok, int fat32_ok, FatType* out_fat_type) + { + FatSpecific* fs_info = FAT_SPECIFIC (fs); + PedExceptionOption status; +- char* fat16_msg; +- char* fat32_msg; ++ const char* fat16_msg; ++ const char* fat32_msg; + + if (fs_info->fat_type == FAT_TYPE_FAT16) + fat16_msg = _("If you leave your file system as FAT16, " +diff --git a/libparted/fs/fat/traverse.c b/libparted/fs/fat/traverse.c +index 3d2e2b5..4ef2044 100644 +--- a/libparted/fs/fat/traverse.c ++++ b/libparted/fs/fat/traverse.c +@@ -120,7 +120,7 @@ fat_traverse_mark_dirty (FatTraverseInfo* trav_info) + + FatTraverseInfo* + fat_traverse_begin (PedFileSystem* fs, FatCluster start_cluster, +- char* dir_name) ++ const char* dir_name) + { + FatSpecific* fs_info = FAT_SPECIFIC (fs); + FatTraverseInfo* trav_info; +diff --git a/libparted/fs/fat/traverse.h b/libparted/fs/fat/traverse.h +index 21e4c27..afb24a5 100644 +--- a/libparted/fs/fat/traverse.h ++++ b/libparted/fs/fat/traverse.h +@@ -42,7 +42,8 @@ extern int fat_traverse_entries_per_buffer (FatTraverseInfo* trav_info); + /* starts traversal at an arbitary cluster. if start_cluster==0, then uses + root directory */ + extern FatTraverseInfo* fat_traverse_begin (PedFileSystem* fs, +- FatCluster start_cluster, char* dir_name); ++ FatCluster start_cluster, ++ const char* dir_name); + + extern int fat_traverse_complete (FatTraverseInfo* trav_info); + +diff --git a/libparted/labels/bsd.c b/libparted/labels/bsd.c +index f25353b..ee9aba0 100644 +--- a/libparted/labels/bsd.c ++++ b/libparted/labels/bsd.c +@@ -108,6 +108,9 @@ typedef struct { + + typedef struct { + uint8_t type; ++ int boot; ++ int raid; ++ int lvm; + } BSDPartitionData; + + static PedDiskType bsd_disk_type; +@@ -394,6 +397,9 @@ bsd_partition_new (const PedDisk* disk, PedPartitionType part_type, + if (!bsd_data) + goto error_free_part; + bsd_data->type = 0; ++ bsd_data->boot = 0; ++ bsd_data->raid = 0; ++ bsd_data->lvm = 0; + } else { + part->disk_specific = NULL; + } +@@ -423,6 +429,9 @@ bsd_partition_duplicate (const PedPartition* part) + old_bsd_data = (BSDPartitionData*) part->disk_specific; + new_bsd_data = (BSDPartitionData*) new_part->disk_specific; + new_bsd_data->type = old_bsd_data->type; ++ new_bsd_data->boot = old_bsd_data->boot; ++ new_bsd_data->raid = old_bsd_data->raid; ++ new_bsd_data->lvm = old_bsd_data->lvm; + return new_part; + } + +@@ -456,14 +465,60 @@ bsd_partition_set_system (PedPartition* part, const PedFileSystemType* fs_type) + static int + bsd_partition_set_flag (PedPartition* part, PedPartitionFlag flag, int state) + { +- /* no flags for bsd */ ++ PedDisk* disk; ++// PedPartition* walk; // since -Werror, this unused variable would break build ++ BSDPartitionData* bsd_data; ++ ++ PED_ASSERT (part != NULL, return 0); ++ PED_ASSERT (part->disk_specific != NULL, return 0); ++ PED_ASSERT (part->disk != NULL, return 0); ++ ++ bsd_data = part->disk_specific; ++ disk = part->disk; ++ ++ switch (flag) { ++ case PED_PARTITION_BOOT: ++ bsd_data->boot = state; ++ return 1; ++ case PED_PARTITION_RAID: ++ if (state) { ++ bsd_data->lvm = 0; ++ } ++ bsd_data->raid = state; ++ return 1; ++ case PED_PARTITION_LVM: ++ if (state) { ++ bsd_data->raid = 0; ++ } ++ bsd_data->lvm = state; ++ default: ++ ; ++ } + return 0; + } + + static int + bsd_partition_get_flag (const PedPartition* part, PedPartitionFlag flag) + { +- /* no flags for bsd */ ++ BSDPartitionData* bsd_data; ++ ++ PED_ASSERT (part != NULL, return 0); ++ PED_ASSERT (part->disk_specific != NULL, return 0); ++ ++ bsd_data = part->disk_specific; ++ switch (flag) { ++ case PED_PARTITION_BOOT: ++ return bsd_data->boot; ++ ++ case PED_PARTITION_RAID: ++ return bsd_data->raid; ++ ++ case PED_PARTITION_LVM: ++ return bsd_data->lvm; ++ ++ default: ++ ; ++ } + return 0; + } + +@@ -471,7 +526,14 @@ static int + bsd_partition_is_flag_available (const PedPartition* part, + PedPartitionFlag flag) + { +- /* no flags for bsd */ ++ switch (flag) { ++ case PED_PARTITION_BOOT: ++ case PED_PARTITION_RAID: ++ case PED_PARTITION_LVM: ++ return 1; ++ default: ++ ; ++ } + return 0; + } + +diff --git a/libparted/labels/dos.c b/libparted/labels/dos.c +index c686658..641257c 100644 +--- a/libparted/labels/dos.c ++++ b/libparted/labels/dos.c +@@ -190,14 +190,16 @@ msdos_probe (const PedDevice *dev) + if (PED_LE16_TO_CPU (part_table->magic) != MSDOS_MAGIC) + goto probe_fail; + +- /* if this is a FAT fs, fail here. Note that the Smart Boot Manager +- * Loader (SBML) signature indicates a partition table, not a file +- * system. ++ /* If this is a FAT fs, fail here. Checking for the FAT signature ++ * has some false positives; instead, do what the Linux kernel does ++ * and ensure that each partition has a boot indicator that is ++ * either 0 or 0x80. + */ +- if ((!strncmp (part_table->boot_code + 0x36, "FAT", 3) +- && strncmp (part_table->boot_code + 0x40, "SBML", 4) != 0) +- || !strncmp (part_table->boot_code + 0x52, "FAT", 3)) +- goto probe_fail; ++ for (i = 0; i < 4; i++) { ++ if (part_table->partitions[i].boot_ind != 0 ++ && part_table->partitions[i].boot_ind != 0x80) ++ goto probe_fail; ++ } + + /* If this is a GPT disk, fail here */ + for (i = 0; i < 4; i++) { +diff --git a/libparted/labels/fdasd.c b/libparted/labels/fdasd.c +index e4ecf52..7adf12f 100644 +--- a/libparted/labels/fdasd.c ++++ b/libparted/labels/fdasd.c +@@ -149,7 +149,7 @@ fdasd_error (fdasd_anchor_t *anc, enum fdasd_failure why, char * str) + case device_verification_failed: + sprintf(error, "fdasd: %s -- %s\n", + _("Device verification failed"), +- _("The specified device is not a valid DASD device"));, ++ _("The specified device is not a valid DASD device")); + break; + default: + sprintf(error, "fdasd: %s: %s\n", _("Fatal error"), str); +diff --git a/libparted/labels/gpt.c b/libparted/labels/gpt.c +index 4dc4f10..cb90d11 100644 +--- a/libparted/labels/gpt.c ++++ b/libparted/labels/gpt.c +@@ -4,7 +4,7 @@ + original version by Matt Domsch <Matt_Domsch@dell.com> + Disclaimed into the Public Domain + +- Portions Copyright (C) 2001, 2002, 2003, 2005, 2006, 2007 ++ Portions Copyright (C) 2001, 2002, 2003, 2005, 2006, 2007, 2008 + Free Software Foundation, Inc. + + EFI GUID Partition Table handling +@@ -86,6 +86,10 @@ typedef struct { + ((efi_guid_t) { PED_CPU_TO_LE32 (0xC12A7328), PED_CPU_TO_LE16 (0xF81F), \ + PED_CPU_TO_LE16 (0x11d2), 0xBA, 0x4B, \ + { 0x00, 0xA0, 0xC9, 0x3E, 0xC9, 0x3B }}) ++#define PARTITION_BIOS_GRUB_GUID \ ++ ((efi_guid_t) { PED_CPU_TO_LE32 (0x21686148), PED_CPU_TO_LE16 (0x6449), \ ++ PED_CPU_TO_LE16 (0x6E6f), 0x74, 0x4E, \ ++ { 0x65, 0x65, 0x64, 0x45, 0x46, 0x49 }}) + #define LEGACY_MBR_PARTITION_GUID \ + ((efi_guid_t) { PED_CPU_TO_LE32 (0x024DEE41), PED_CPU_TO_LE16 (0x33E7), \ + PED_CPU_TO_LE16 (0x11d3, 0x9D, 0x69, \ +@@ -245,6 +249,7 @@ typedef struct _GPTPartitionData { + int lvm; + int raid; + int boot; ++ int bios_grub; + int hp_service; + int hidden; + int msftres; +@@ -753,13 +758,16 @@ _parse_part_entry (PedDisk* disk, GuidPartitionEntry_t* pte) + + gpt_part_data->lvm = gpt_part_data->raid + = gpt_part_data->boot = gpt_part_data->hp_service +- = gpt_part_data->hidden = gpt_part_data->msftres = 0; ++ = gpt_part_data->hidden = gpt_part_data->msftres ++ = gpt_part_data->bios_grub = 0; + + if (pte->Attributes.RequiredToFunction & 0x1) + gpt_part_data->hidden = 1; + + if (!guid_cmp (gpt_part_data->type, PARTITION_SYSTEM_GUID)) + gpt_part_data->boot = 1; ++ else if (!guid_cmp (gpt_part_data->type, PARTITION_BIOS_GRUB_GUID)) ++ gpt_part_data->bios_grub = 1; + else if (!guid_cmp (gpt_part_data->type, PARTITION_RAID_GUID)) + gpt_part_data->raid = 1; + else if (!guid_cmp (gpt_part_data->type, PARTITION_LVM_GUID)) +@@ -1130,6 +1138,7 @@ gpt_partition_new (const PedDisk* disk, + gpt_part_data->lvm = 0; + gpt_part_data->raid = 0; + gpt_part_data->boot = 0; ++ gpt_part_data->bios_grub = 0; + gpt_part_data->hp_service = 0; + gpt_part_data->hidden = 0; + gpt_part_data->msftres = 0; +@@ -1208,6 +1217,10 @@ gpt_partition_set_system (PedPartition* part, const PedFileSystemType* fs_type) + gpt_part_data->type = PARTITION_SYSTEM_GUID; + return 1; + } ++ if (gpt_part_data->bios_grub) { ++ gpt_part_data->type = PARTITION_BIOS_GRUB_GUID; ++ return 1; ++ } + if (gpt_part_data->hp_service) { + gpt_part_data->type = PARTITION_HPSERVICE_GUID; + return 1; +@@ -1306,6 +1319,16 @@ gpt_partition_set_flag(PedPartition *part, + if (state) + gpt_part_data->raid + = gpt_part_data->lvm ++ = gpt_part_data->bios_grub ++ = gpt_part_data->hp_service ++ = gpt_part_data->msftres = 0; ++ return gpt_partition_set_system (part, part->fs_type); ++ case PED_PARTITION_BIOS_GRUB: ++ gpt_part_data->bios_grub = state; ++ if (state) ++ gpt_part_data->raid ++ = gpt_part_data->lvm ++ = gpt_part_data->boot + = gpt_part_data->hp_service + = gpt_part_data->msftres = 0; + return gpt_partition_set_system (part, part->fs_type); +@@ -1314,6 +1337,7 @@ gpt_partition_set_flag(PedPartition *part, + if (state) + gpt_part_data->boot + = gpt_part_data->lvm ++ = gpt_part_data->bios_grub + = gpt_part_data->hp_service + = gpt_part_data->msftres = 0; + return gpt_partition_set_system (part, part->fs_type); +@@ -1322,6 +1346,7 @@ gpt_partition_set_flag(PedPartition *part, + if (state) + gpt_part_data->boot + = gpt_part_data->raid ++ = gpt_part_data->bios_grub + = gpt_part_data->hp_service + = gpt_part_data->msftres = 0; + return gpt_partition_set_system (part, part->fs_type); +@@ -1331,6 +1356,7 @@ gpt_partition_set_flag(PedPartition *part, + gpt_part_data->boot + = gpt_part_data->raid + = gpt_part_data->lvm ++ = gpt_part_data->bios_grub + = gpt_part_data->msftres = 0; + return gpt_partition_set_system (part, part->fs_type); + case PED_PARTITION_MSFT_RESERVED: +@@ -1339,6 +1365,7 @@ gpt_partition_set_flag(PedPartition *part, + gpt_part_data->boot + = gpt_part_data->raid + = gpt_part_data->lvm ++ = gpt_part_data->bios_grub + = gpt_part_data->hp_service = 0; + return gpt_partition_set_system (part, part->fs_type); + case PED_PARTITION_HIDDEN: +@@ -1367,6 +1394,8 @@ gpt_partition_get_flag(const PedPartition *part, PedPartitionFlag flag) + return gpt_part_data->lvm; + case PED_PARTITION_BOOT: + return gpt_part_data->boot; ++ case PED_PARTITION_BIOS_GRUB: ++ return gpt_part_data->bios_grub; + case PED_PARTITION_HPSERVICE: + return gpt_part_data->hp_service; + case PED_PARTITION_MSFT_RESERVED: +@@ -1390,6 +1419,7 @@ gpt_partition_is_flag_available(const PedPartition * part, + case PED_PARTITION_RAID: + case PED_PARTITION_LVM: + case PED_PARTITION_BOOT: ++ case PED_PARTITION_BIOS_GRUB: + case PED_PARTITION_HPSERVICE: + case PED_PARTITION_MSFT_RESERVED: + case PED_PARTITION_HIDDEN: +diff --git a/libparted/labels/mac.c b/libparted/labels/mac.c +index f014194..538e0c0 100644 +--- a/libparted/labels/mac.c ++++ b/libparted/labels/mac.c +@@ -1,6 +1,6 @@ + /* + libparted - a library for manipulating disk partitions +- Copyright (C) 2000, 2002, 2004, 2007 Free Software Foundation, Inc. ++ Copyright (C) 2000, 2002, 2004, 2007-2008 Free Software Foundation, Inc. + + 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 +@@ -376,19 +376,19 @@ mac_clobber (PedDevice* dev) + #endif /* !DISCOVER_ONLY */ + + static int +-_rawpart_cmp_type (MacRawPartition* raw_part, char* type) ++_rawpart_cmp_type (const MacRawPartition* raw_part, const char* type) + { + return strncasecmp (raw_part->type, type, 32) == 0; + } + + static int +-_rawpart_cmp_name (MacRawPartition* raw_part, char* name) ++_rawpart_cmp_name (const MacRawPartition* raw_part, const char* name) + { + return strncasecmp (raw_part->name, name, 32) == 0; + } + + static int +-_rawpart_is_partition_map (MacRawPartition* raw_part) ++_rawpart_is_partition_map (const MacRawPartition* raw_part) + { + return _rawpart_cmp_type (raw_part, "Apple_partition_map"); + } +@@ -408,7 +408,7 @@ strncasestr (const char* haystack, const char* needle, int n) + } + + static int +-_rawpart_is_boot (MacRawPartition* raw_part) ++_rawpart_is_boot (const MacRawPartition* raw_part) + { + if (!strcasecmp(raw_part->type, "Apple_Bootstrap")) + return 1; +@@ -420,7 +420,7 @@ _rawpart_is_boot (MacRawPartition* raw_part) + } + + static int +-_rawpart_is_driver (MacRawPartition* raw_part) ++_rawpart_is_driver (const MacRawPartition* raw_part) + { + if (strncmp (raw_part->type, "Apple_", 6) != 0) + return 0; +@@ -430,7 +430,7 @@ _rawpart_is_driver (MacRawPartition* raw_part) + } + + static int +-_rawpart_has_driver (MacRawPartition* raw_part, MacDiskData* mac_disk_data) ++_rawpart_has_driver (const MacRawPartition* raw_part, MacDiskData* mac_disk_data) + { + MacDeviceDriver *driverlist; + uint16_t i, bsz; +diff --git a/libparted/tests/Makefile.am b/libparted/tests/Makefile.am +index 12ad29f..d526207 100644 +--- a/libparted/tests/Makefile.am ++++ b/libparted/tests/Makefile.am +@@ -3,13 +3,17 @@ + # + # This file may be modified and/or distributed without restriction. + +-TESTS = t1000-label.sh ++TESTS = t1000-label.sh t2000-disk.sh + EXTRA_DIST = $(TESTS) +-bin_PROGRAMS = label ++bin_PROGRAMS = label disk + label_CFLAGS = $(CHECK_CFLAGS) -I$(top_srcdir)/include + label_LDADD = $(CHECK_LIBS) $(top_builddir)/libparted/libparted.la + label_SOURCES = common.h common.c label.c + ++disk_CFLAGS = $(CHECK_CFLAGS) -I$(top_srcdir)/include ++disk_LDADD = $(CHECK_LIBS) $(top_builddir)/libparted/libparted.la ++disk_SOURCES = common.h common.c disk.c ++ + MAINTAINERCLEANFILES = Makefile.in + + CLEANFILES = init.sh +diff --git a/libparted/tests/disk.c b/libparted/tests/disk.c +new file mode 100644 +index 0000000..295ec05 +--- /dev/null ++++ b/libparted/tests/disk.c +@@ -0,0 +1,111 @@ ++#include <config.h> ++#include <unistd.h> ++ ++#include <check.h> ++ ++#include <parted/parted.h> ++ ++#include "common.h" ++ ++static char* temporary_disk; ++ ++static void ++create_disk (void) ++{ ++ temporary_disk = _create_disk (20); ++ fail_if (temporary_disk == NULL, "Failed to create temporary disk"); ++} ++ ++static void ++destroy_disk (void) ++{ ++ unlink (temporary_disk); ++ free (temporary_disk); ++} ++ ++/* TEST: Create a disklabel on a simple disk image */ ++START_TEST (test_duplicate) ++{ ++ PedDevice* dev = ped_device_get (temporary_disk); ++ if (dev == NULL) ++ return; ++ ++ PedDiskType* type; ++ PedDisk* disk; ++ PedDisk* disk_dup; ++ PedPartition *part; ++ PedPartition *part_dup; ++ PedConstraint *constraint; ++ ++ int part_num[] = {1, 5, 6, 0}; ++ ++ disk = _create_disk_label (dev, ped_disk_type_get ("msdos")); ++ ++ constraint = ped_constraint_any (dev); ++ ++ /* Primary partition from 16,4kB to 15MB */ ++ part = ped_partition_new (disk, PED_PARTITION_EXTENDED, ++ NULL, ++ 32, 29311); ++ ped_disk_add_partition (disk, part, constraint); ++ ++ /* Logical partition from 10MB to 15MB */ ++ part = ped_partition_new (disk, PED_PARTITION_LOGICAL, ++ ped_file_system_type_get ("ext2"), ++ 19584, 29311); ++ ped_disk_add_partition (disk, part, constraint); ++ ++ /* Logical partition from 16,4kB to 4981kB */ ++ part = ped_partition_new (disk, PED_PARTITION_LOGICAL, ++ ped_file_system_type_get ("ext2"), ++ 32, 9727); ++ ped_disk_add_partition (disk, part, constraint); ++ ++ ped_disk_commit (disk); ++ ++ ped_constraint_destroy (constraint); ++ ++ disk_dup = ped_disk_duplicate (disk); ++ ++ /* Checks if both partitions match */ ++ for (int *i = part_num; *i != 0; i++) { ++ part = ped_disk_get_partition (disk, *i); ++ part_dup = ped_disk_get_partition (disk_dup, *i); ++ ++ fail_if (part->geom.start != part_dup->geom.start || ++ part->geom.end != part_dup->geom.end, ++ "Duplicated partition %d doesn't match. " ++ "Details are start: %d/%d end: %d/%d\n", ++ *i, part->geom.start, part_dup->geom.start, ++ part->geom.end, part_dup->geom.end); ++ } ++ ++ ped_disk_destroy (disk); ++ ped_device_destroy (dev); ++} ++END_TEST ++ ++int ++main (void) ++{ ++ int number_failed; ++ Suite* suite = suite_create ("Disk"); ++ TCase* tcase_duplicate = tcase_create ("Duplicate"); ++ ++ /* Fail when an exception is raised */ ++ ped_exception_set_handler (_test_exception_handler); ++ ++ tcase_add_checked_fixture (tcase_duplicate, create_disk, destroy_disk); ++ tcase_add_test (tcase_duplicate, test_duplicate); ++ /* Disable timeout for this test */ ++ tcase_set_timeout (tcase_duplicate, 0); ++ suite_add_tcase (suite, tcase_duplicate); ++ ++ SRunner* srunner = srunner_create (suite); ++ srunner_run_all (srunner, CK_VERBOSE); ++ ++ number_failed = srunner_ntests_failed (srunner); ++ srunner_free (srunner); ++ ++ return (number_failed == 0) ? EXIT_SUCCESS : EXIT_FAILURE; ++} +diff --git a/libparted/tests/t2000-disk.sh b/libparted/tests/t2000-disk.sh +new file mode 100755 +index 0000000..7a85b98 +--- /dev/null ++++ b/libparted/tests/t2000-disk.sh +@@ -0,0 +1,27 @@ ++#!/bin/sh ++ ++# Copyright (C) 2007 Free Software Foundation, Inc. ++ ++# 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 3 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, see <http://www.gnu.org/licenses/>. ++ ++test_description='run the disk unit tests in a directory supporting O_DIRECT' ++# This wrapper around the ./label binary is used to find a directory ++# in which one can open a file with the O_DIRECT flag. ++ ++. ./init.sh ++ ++test_expect_success \ ++ 'run the actual tests' 'disk' ++ ++test_done +diff --git a/parted/parted.c b/parted/parted.c +index 6a606ae..2afc2c1 100644 +--- a/parted/parted.c ++++ b/parted/parted.c +@@ -79,7 +79,7 @@ typedef struct { + time_t predicted_time_left; + } TimerContext; + +-static struct option options[] = { ++static const struct option const options[] = { + /* name, has-arg, string-return-val, char-return-val */ + {"help", 0, NULL, 'h'}, + {"list", 0, NULL, 'l'}, +@@ -90,7 +90,7 @@ static struct option options[] = { + {NULL, 0, NULL, 0} + }; + +-static char* options_help [][2] = { ++static const char *const options_help [][2] = { + {"help", N_("displays this help message")}, + {"list", N_("lists partition layout on all block devices")}, + {"machine", N_("displays machine parseable output")}, +@@ -107,26 +107,26 @@ int opt_machine_mode = 0; + int disk_is_modified = 0; + int is_toggle_mode = 0; + +-static char* number_msg = N_( ++static const char* number_msg = N_( + "NUMBER is the partition number used by Linux. On MS-DOS disk labels, the " + "primary partitions number from 1 to 4, logical partitions from 5 onwards.\n"); + +-static char* label_type_msg_start = N_("LABEL-TYPE is one of: "); +-static char* flag_msg_start = N_("FLAG is one of: "); +-static char* unit_msg_start = N_("UNIT is one of: "); +-static char* part_type_msg = N_("PART-TYPE is one of: primary, logical, " ++static const char* label_type_msg_start = N_("LABEL-TYPE is one of: "); ++static const char* flag_msg_start = N_("FLAG is one of: "); ++static const char* unit_msg_start = N_("UNIT is one of: "); ++static const char* part_type_msg = N_("PART-TYPE is one of: primary, logical, " + "extended\n"); +-static char* fs_type_msg_start = N_("FS-TYPE is one of: "); +-static char* start_end_msg = N_("START and END are disk locations, such as " ++static const char* fs_type_msg_start = N_("FS-TYPE is one of: "); ++static const char* start_end_msg = N_("START and END are disk locations, such as " + "4GB or 10%. Negative values count from the end of the disk. " + "For example, -1s specifies exactly the last sector.\n"); +-static char* state_msg = N_("STATE is one of: on, off\n"); +-static char* device_msg = N_("DEVICE is usually /dev/hda or /dev/sda\n"); +-static char* name_msg = N_("NAME is any word you want\n"); +-static char* resize_msg_start = N_("The partition must have one of the " ++static const char* state_msg = N_("STATE is one of: on, off\n"); ++static const char* device_msg = N_("DEVICE is usually /dev/hda or /dev/sda\n"); ++static const char* name_msg = N_("NAME is any word you want\n"); ++static const char* resize_msg_start = N_("The partition must have one of the " + "following FS-TYPEs: "); + +-static char* copyright_msg = N_( ++static const char* copyright_msg = N_( + "Copyright (C) 1998 - 2006 Free Software Foundation, Inc.\n" + "This program is free software, covered by the GNU General Public License.\n" + "\n" +@@ -1226,7 +1226,7 @@ partition_print (PedPartition* part) + putchar ('\n'); + + flags = partition_print_flags (part); +- ++ + printf (_("Minor: %d\n"), part->num); + printf (_("Flags: %s\n"), flags); + printf (_("File System: %s\n"), fs->type->name); +@@ -1264,15 +1264,17 @@ do_print (PedDevice** dev) + int has_free_arg = 0; + int has_list_arg = 0; + int has_num_arg = 0; +- char* transport[13] = {"unknown", "scsi", "ide", "dac960", +- "cpqarray", "file", "ataraid", "i2o", +- "ubd", "dasd", "viodasd", "sx8", "dm"}; ++ const char *const transport[14] = {"unknown", "scsi", "ide", "dac960", ++ "cpqarray", "file", "ataraid", "i2o", ++ "ubd", "dasd", "viodasd", "sx8", "dm", ++ "xvd"}; + char* peek_word; + char* start; + char* end; + char* size; + const char* name; + char* tmp; ++ char* flags; + wchar_t* table_rendered; + + disk = ped_disk_new (*dev); +@@ -1472,7 +1474,9 @@ do_print (PedDevice** dev) + str_list_append (row, name); + } + +- str_list_append (row, partition_print_flags (part)); ++ flags = partition_print_flags (part); ++ str_list_append (row, flags); ++ ped_free (flags); + } else { + if (has_extended) + str_list_append (row, ""); +@@ -1485,6 +1489,10 @@ do_print (PedDevice** dev) + //PED_ASSERT (row.cols == caption.cols) + table_add_row_from_strlist (table, row); + str_list_destroy (row); ++ ped_free (tmp); ++ ped_free (start); ++ ped_free (end); ++ ped_free (size); + } + + table_rendered = table_render (table); +diff --git a/parted/ui.c b/parted/ui.c +index a53643f..f854a54 100644 +--- a/parted/ui.c ++++ b/parted/ui.c +@@ -154,17 +154,17 @@ struct siginfo_t { + # define ILL_BADSTK (INTMAX - 8) + #endif + +-char* prog_name = "GNU Parted " VERSION "\n"; ++const char* prog_name = "GNU Parted " VERSION "\n"; + +-static char* banner_msg = N_( ++static const char* banner_msg = N_( + "Welcome to GNU Parted! Type 'help' to view a list of commands.\n"); + +-static char* usage_msg = N_( ++static const char* usage_msg = N_( + "Usage: parted [OPTION]... [DEVICE [COMMAND [PARAMETERS]...]...]\n" + "Apply COMMANDs with PARAMETERS to DEVICE. If no COMMAND(s) are given, " + "run in\ninteractive mode.\n"); + +-static char* bug_msg = N_( ++static const char* bug_msg = N_( + "\n\nYou found a bug in GNU Parted! Here's what you have to do:\n\n" + "Don't panic! The bug has most likely not affected any of your data.\n" + "Help us to fix this bug by doing the following:\n\n" +@@ -218,7 +218,7 @@ screen_width () + + /* HACK: don't specify termcap separately - it'll annoy the users. */ + #ifdef HAVE_LIBREADLINE +- width = tgetnum ("co"); ++ width = tgetnum ((char *) "co"); + #endif + + if (width <= 0) +@@ -569,7 +569,9 @@ _readline (const char* prompt, const StrList* possibilities) + fputs (line, stdout); + fflush (stdout); + #endif +- line [strlen (line) - 1] = 0; /* kill trailing CR */ ++ /* kill trailing NL */ ++ if (strlen (line)) ++ line [strlen (line) - 1] = 0; + } else { + free (line); + line = NULL; +diff --git a/parted/ui.h b/parted/ui.h +index f5cf760..77bb194 100644 +--- a/parted/ui.h ++++ b/parted/ui.h +@@ -1,6 +1,6 @@ + /* + parted - a frontend to libparted +- Copyright (C) 1999, 2000, 2001, 2007 Free Software Foundation, Inc. ++ Copyright (C) 1999, 2000, 2001, 2007-2008 Free Software Foundation, Inc. + + 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 +@@ -21,7 +21,7 @@ + + #include "strlist.h" + +-extern char* prog_name; ++extern const char *prog_name; + + extern int init_ui (); + extern int non_interactive_mode (PedDevice** dev, Command* cmd_list[], +diff --git a/tests/Makefile.am b/tests/Makefile.am +index 0a42a8d..3a694fe 100644 +--- a/tests/Makefile.am ++++ b/tests/Makefile.am +@@ -5,8 +5,10 @@ TESTS = \ + t1100-busy-label.sh \ + t1500-small-ext2.sh \ + t2000-mkfs.sh \ ++ t2200-dos-label-recog.sh \ + t3000-constraints.sh \ +- t3100-resize-ext2-partion.sh ++ t3100-resize-ext2-partion.sh \ ++ t5000-tags.sh + + EXTRA_DIST = \ + $(TESTS) test-lib.sh mkdtemp +diff --git a/tests/t2200-dos-label-recog.sh b/tests/t2200-dos-label-recog.sh +new file mode 100755 +index 0000000..d5d2670 +--- /dev/null ++++ b/tests/t2200-dos-label-recog.sh +@@ -0,0 +1,61 @@ ++#!/bin/sh ++ ++# Copyright (C) 2008 Free Software Foundation, Inc. ++ ++# 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 3 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, see <http://www.gnu.org/licenses/>. ++ ++test_description='improved MSDOS partition-table recognition' ++ ++. ./init.sh ++ ++###################################################################### ++# With vestiges of a preceding FAT file system boot sector in the MBR, ++# parted 1.8.8.1.29 and earlier would fail to recognize a DOS ++# partition table. ++###################################################################### ++N=100k ++dev=loop-file ++test_expect_success \ ++ 'create a file to simulate the underlying device' \ ++ 'dd if=/dev/null of=$dev bs=1 seek=$N 2> /dev/null' ++ ++test_expect_success \ ++ 'label the test disk' \ ++ 'parted -s $dev mklabel msdos > out 2>&1' ++test_expect_success 'expect no output' '$compare out /dev/null' ++ ++test_expect_success \ ++ 'create two partition' \ ++ ' ++ parted -s $dev mkpart primary 1s 40s > out 2>&1 && ++ parted -s $dev mkpart primary 41s 80s > out 2>&1 ++ ++ ' ++test_expect_success 'expect no output' '$compare out /dev/null' ++ ++test_expect_success \ ++ 'write "FAT" where it would cause trouble' \ ++ 'printf FAT|dd bs=1c seek=82 count=3 of=$dev conv=notrunc' ++ ++test_expect_success \ ++ 'print the partition table' \ ++ ' ++ parted -m -s $dev unit s p > out && ++ tail -2 out > k && mv k out && ++ printf "1:1s:40s:40s:::;\n2:41s:80s:40s:::;\n" > exp ++ ++ ' ++test_expect_success 'expect two partitions' '$compare out exp' ++ ++test_done +diff --git a/tests/t5000-tags.sh b/tests/t5000-tags.sh +new file mode 100755 +index 0000000..dab48ae +--- /dev/null ++++ b/tests/t5000-tags.sh +@@ -0,0 +1,81 @@ ++#!/bin/sh ++ ++# Copyright (C) 2007,2008 Free Software Foundation, Inc. ++ ++# 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 3 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, see <http://www.gnu.org/licenses/>. ++ ++test_description="test bios_grub flag in gpt labels" ++ ++. ./init.sh ++ ++dev=loop-file ++ ++test_expect_success \ ++ "setup: create zeroed device" \ ++ '{ dd if=/dev/zero bs=1024 count=64; } > $dev' ++ ++test_expect_success \ ++ 'create gpt label' \ ++ 'parted -s $dev mklabel gpt >out 2>&1' ++ ++test_expect_success \ ++ 'add a partition' \ ++ 'parted -s $dev mkpart primary 0 1 >>out 2>&1' ++ ++test_expect_success \ ++ 'print the table (before manual modification)' \ ++ 'parted -s $dev print >>out 2>&1' ++ ++# Using bios_boot_magic='\x48\x61' looks nicer, but isn't portable. ++# dash's builtin printf doesn't recognize such \xHH hexadecimal escapes. ++bios_boot_magic='\110\141\150\41\111\144\157\156\164\116\145\145\144\105\106\111' ++ ++printf "$bios_boot_magic" | dd of=$dev bs=1024 seek=1 conv=notrunc ++ ++test_expect_success \ ++ 'print the table (after manual modification)' \ ++ 'parted -s $dev print >>out 2>&1' ++ ++pwd=`pwd` ++ ++fail=0 ++{ ++ cat <<EOF ++Model: (file) ++Disk .../$dev: 65.5kB ++Sector size (logical/physical): 512B/512B ++Partition Table: gpt ++ ++Number Start End Size File system Name Flags ++ 1 17.4kB 48.6kB 31.2kB primary ++ ++Model: (file) ++Disk .../$dev: 65.5kB ++Sector size (logical/physical): 512B/512B ++Partition Table: gpt ++ ++Number Start End Size File system Name Flags ++ 1 17.4kB 48.6kB 31.2kB primary bios_grub ++ ++EOF ++} > exp || fail=1 ++ ++test_expect_success \ ++ 'prepare actual and expected output' \ ++ 'test $fail = 0 && ++ mv out o2 && sed "s,^Disk .*/$dev:,Disk .../$dev:," o2 > out' ++ ++test_expect_success 'check for expected output' '$compare out exp' ++ ++test_done diff --git a/packages/parted/files/syscalls.h b/packages/parted/files/syscalls.h deleted file mode 100644 index 9278704b29..0000000000 --- a/packages/parted/files/syscalls.h +++ /dev/null @@ -1,166 +0,0 @@ -/* - * linux/include/asm-arm/unistd.h - * - * Copyright (C) 2001-2005 Russell King - * - * 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. - * - * Please forward _all_ changes to this file to rmk@arm.linux.org.uk, - * no matter what the change is. Thanks! - */ -#ifndef __ASM_ARM_UNISTD_H2 -#define __ASM_ARM_UNISTD_H2 - - -#define __sys2(x) #x -#define __sys1(x) __sys2(x) - -#ifndef __syscall -#if defined(__thumb__) || defined(__ARM_EABI__) -#define __SYS_REG(name) register long __sysreg __asm__("r7") = __NR_##name; -#define __SYS_REG_LIST(regs...) "r" (__sysreg) , ##regs -#define __syscall(name) "swi\t0" -#else -#define __SYS_REG(name) -#define __SYS_REG_LIST(regs...) regs -#define __syscall(name) "swi\t" __sys1(__NR_##name) "" -#endif -#endif - -#define __syscall_return(type, res) \ -do { \ - if ((unsigned long)(res) >= (unsigned long)(-129)) { \ - errno = -(res); \ - res = -1; \ - } \ - return (type) (res); \ -} while (0) - -#define _syscall0(type,name) \ -type name(void) { \ - __SYS_REG(name) \ - register long __res_r0 __asm__("r0"); \ - long __res; \ - __asm__ __volatile__ ( \ - __syscall(name) \ - : "=r" (__res_r0) \ - : __SYS_REG_LIST() ); \ - __res = __res_r0; \ - __syscall_return(type,__res); \ -} - -#define _syscall1(type,name,type1,arg1) \ -type name(type1 arg1) { \ - __SYS_REG(name) \ - register long __r0 __asm__("r0") = (long)arg1; \ - register long __res_r0 __asm__("r0"); \ - long __res; \ - __asm__ __volatile__ ( \ - __syscall(name) \ - : "=r" (__res_r0) \ - : __SYS_REG_LIST( "0" (__r0) ) ); \ - __res = __res_r0; \ - __syscall_return(type,__res); \ -} - -#define _syscall2(type,name,type1,arg1,type2,arg2) \ -type name(type1 arg1,type2 arg2) { \ - __SYS_REG(name) \ - register long __r0 __asm__("r0") = (long)arg1; \ - register long __r1 __asm__("r1") = (long)arg2; \ - register long __res_r0 __asm__("r0"); \ - long __res; \ - __asm__ __volatile__ ( \ - __syscall(name) \ - : "=r" (__res_r0) \ - : __SYS_REG_LIST( "0" (__r0), "r" (__r1) ) ); \ - __res = __res_r0; \ - __syscall_return(type,__res); \ -} - - -#define _syscall3(type,name,type1,arg1,type2,arg2,type3,arg3) \ -type name(type1 arg1,type2 arg2,type3 arg3) { \ - __SYS_REG(name) \ - register long __r0 __asm__("r0") = (long)arg1; \ - register long __r1 __asm__("r1") = (long)arg2; \ - register long __r2 __asm__("r2") = (long)arg3; \ - register long __res_r0 __asm__("r0"); \ - long __res; \ - __asm__ __volatile__ ( \ - __syscall(name) \ - : "=r" (__res_r0) \ - : __SYS_REG_LIST( "0" (__r0), "r" (__r1), "r" (__r2) ) ); \ - __res = __res_r0; \ - __syscall_return(type,__res); \ -} - - -#define _syscall4(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4)\ -type name(type1 arg1, type2 arg2, type3 arg3, type4 arg4) { \ - __SYS_REG(name) \ - register long __r0 __asm__("r0") = (long)arg1; \ - register long __r1 __asm__("r1") = (long)arg2; \ - register long __r2 __asm__("r2") = (long)arg3; \ - register long __r3 __asm__("r3") = (long)arg4; \ - register long __res_r0 __asm__("r0"); \ - long __res; \ - __asm__ __volatile__ ( \ - __syscall(name) \ - : "=r" (__res_r0) \ - : __SYS_REG_LIST( "0" (__r0), "r" (__r1), "r" (__r2), "r" (__r3) ) ); \ - __res = __res_r0; \ - __syscall_return(type,__res); \ -} - - -#define _syscall5(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4,type5,arg5) \ -type name(type1 arg1, type2 arg2, type3 arg3, type4 arg4, type5 arg5) { \ - __SYS_REG(name) \ - register long __r0 __asm__("r0") = (long)arg1; \ - register long __r1 __asm__("r1") = (long)arg2; \ - register long __r2 __asm__("r2") = (long)arg3; \ - register long __r3 __asm__("r3") = (long)arg4; \ - register long __r4 __asm__("r4") = (long)arg5; \ - register long __res_r0 __asm__("r0"); \ - long __res; \ - __asm__ __volatile__ ( \ - __syscall(name) \ - : "=r" (__res_r0) \ - : __SYS_REG_LIST( "0" (__r0), "r" (__r1), "r" (__r2), \ - "r" (__r3), "r" (__r4) ) ); \ - __res = __res_r0; \ - __syscall_return(type,__res); \ -} - -#define _syscall6(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4,type5,arg5,type6,arg6) \ -type name(type1 arg1, type2 arg2, type3 arg3, type4 arg4, type5 arg5, type6 arg6) { \ - __SYS_REG(name) \ - register long __r0 __asm__("r0") = (long)arg1; \ - register long __r1 __asm__("r1") = (long)arg2; \ - register long __r2 __asm__("r2") = (long)arg3; \ - register long __r3 __asm__("r3") = (long)arg4; \ - register long __r4 __asm__("r4") = (long)arg5; \ - register long __r5 __asm__("r5") = (long)arg6; \ - register long __res_r0 __asm__("r0"); \ - long __res; \ - __asm__ __volatile__ ( \ - __syscall(name) \ - : "=r" (__res_r0) \ - : __SYS_REG_LIST( "0" (__r0), "r" (__r1), "r" (__r2), \ - "r" (__r3), "r" (__r4), "r" (__r5) ) ); \ - __res = __res_r0; \ - __syscall_return(type,__res); \ -} - -/* - * "Conditional" syscalls - * - * What we want is __attribute__((weak,alias("sys_ni_syscall"))), - * but it doesn't work on all toolchains, so we just do it by hand - */ -#define cond_syscall(x) asm(".weak\t" #x "\n\t.set\t" #x ",sys_ni_syscall") - -#endif /* __ASM_ARM_UNISTD_H2 */ diff --git a/packages/parted/files/syscalls.patch b/packages/parted/files/syscalls.patch deleted file mode 100644 index be9b91cb9c..0000000000 --- a/packages/parted/files/syscalls.patch +++ /dev/null @@ -1,10 +0,0 @@ ---- parted-1.8.7/libparted/arch/linux.c.org 2007-05-09 23:40:13.000000000 +0300 -+++ parted-1.8.7/libparted/arch/linux.c 2007-07-10 18:20:27.000000000 +0300 -@@ -32,6 +32,7 @@ - #include <stdio.h> - #include <syscall.h> - #include <unistd.h> -+#include "syscalls.h" - #include <dirent.h> - #include <sys/ioctl.h> - #include <sys/stat.h> diff --git a/packages/parted/files/use_llseek_syscall.patch b/packages/parted/files/use_llseek_syscall.patch new file mode 100644 index 0000000000..ce305635ca --- /dev/null +++ b/packages/parted/files/use_llseek_syscall.patch @@ -0,0 +1,28 @@ +--- a/libparted/arch/linux.c~ 2009-02-06 17:22:22.000000000 -0200 ++++ a/libparted/arch/linux.c 2009-02-06 17:39:28.000000000 -0200 +@@ -53,6 +53,11 @@ + + #define KERNEL_VERSION(a,b,c) (((a) << 16) + ((b) << 8) + (c)) + ++#ifndef HAVE_LLSEEK ++#define _llseek(fd, offset_high, offset_low, result, origin) \ ++ syscall(SYS__llseek, fd, offset_high, offset_low, result, origin) ++#endif ++ + #ifndef __NR__llseek + #define __NR__llseek 140 + #endif +@@ -1362,13 +1367,6 @@ + + #if SIZEOF_OFF_T < 8 + +-static _syscall5(int,_llseek, +- unsigned int, fd, +- unsigned long, offset_high, +- unsigned long, offset_low, +- loff_t*, result, +- unsigned int, origin) +- + loff_t + llseek (unsigned int fd, loff_t offset, unsigned int whence) + { diff --git a/packages/parted/parted-1.8.0/memory_allocation.patch b/packages/parted/parted-1.8.0/memory_allocation.patch deleted file mode 100644 index ba3709680b..0000000000 --- a/packages/parted/parted-1.8.0/memory_allocation.patch +++ /dev/null @@ -1,42 +0,0 @@ ---- parted-1.8.0/libparted/exception.c_orig 2006-12-11 19:44:23.000000000 +0000 -+++ parted-1.8.0/libparted/exception.c 2006-12-11 19:47:53.000000000 +0000 -@@ -231,6 +231,9 @@ - PedExceptionOption ex_opts, const char* message, ...) - { - va_list arg_list; -+ int result; -+ static int size = 1000; -+ - - if (ex) - ped_exception_catch (); -@@ -239,16 +242,22 @@ - if (!ex) - goto no_memory; - -- ex->message = (char*) malloc (8192); -- if (!ex->message) -- goto no_memory; -- - ex->type = ex_type; - ex->options = ex_opts; - -- va_start (arg_list, message); -- vsnprintf (ex->message, 8192, message, arg_list); -- va_end (arg_list); -+ while (1) { -+ ex->message = (char*) malloc (size); -+ if (!ex->message) -+ goto no_memory; -+ va_start (arg_list, message); -+ result = vsnprintf (ex->message, size, message, arg_list); -+ va_end (arg_list); -+ -+ if (result > -1 && result < size) -+ break; -+ size += 10; -+ } -+ - - return do_throw (); - diff --git a/packages/parted/parted_1.6.23.bb b/packages/parted/parted_1.6.23.bb deleted file mode 100644 index cb9b08f407..0000000000 --- a/packages/parted/parted_1.6.23.bb +++ /dev/null @@ -1,12 +0,0 @@ -DESCRIPTION = "parted, the GNU partition resizing program" -HOMEPAGE = "http://www.gnu.org/software/parted/parted.html" -LICENSE = "GPLv2" -SECTION = "console/tools" -DEPENDS = "readline e2fsprogs-libs" -PR = "r0" - -SRC_URI = "${GNU_MIRROR}/parted/parted-${PV}.tar.gz" - -EXTRA_OECONF = "--disable-Werror" - -inherit autotools diff --git a/packages/parted/parted_1.6.25.1.bb b/packages/parted/parted_1.6.25.1.bb deleted file mode 100644 index 8681055855..0000000000 --- a/packages/parted/parted_1.6.25.1.bb +++ /dev/null @@ -1,17 +0,0 @@ -DESCRIPTION = "parted, the GNU partition resizing program" -HOMEPAGE = "http://www.gnu.org/software/parted/parted.html" -LICENSE = "GPLv2" -SECTION = "console/tools" -DEPENDS = "readline e2fsprogs-libs" -PR = "r0" - -SRC_URI = "${GNU_MIRROR}/parted/parted-${PV}.tar.gz" - -EXTRA_OECONF = "--disable-Werror" -#export CFLAGS = "-mstructure-size-boundary=8" - -inherit autotools pkgconfig - -do_stage() { - autotools_stage_all -} diff --git a/packages/parted/parted_1.8.0.bb b/packages/parted/parted_1.8.0.bb deleted file mode 100644 index bff27a62e8..0000000000 --- a/packages/parted/parted_1.8.0.bb +++ /dev/null @@ -1,18 +0,0 @@ -DESCRIPTION = "parted, the GNU partition resizing program" -HOMEPAGE = "http://www.gnu.org/software/parted/parted.html" -LICENSE = "GPLv2" -SECTION = "console/tools" -DEPENDS = "readline e2fsprogs-libs" -PR = "r0" - -SRC_URI = "${GNU_MIRROR}/parted/parted-${PV}.tar.gz \ - file://memory_allocation.patch;patch=0" - -EXTRA_OECONF = "--disable-Werror" -#export CFLAGS = "-mstructure-size-boundary=8" - -inherit autotools pkgconfig - -do_stage() { - autotools_stage_all -} diff --git a/packages/parted/parted_1.8.2.bb b/packages/parted/parted_1.8.2.bb deleted file mode 100644 index 1185014aa3..0000000000 --- a/packages/parted/parted_1.8.2.bb +++ /dev/null @@ -1,16 +0,0 @@ -DESCRIPTION = "parted, the GNU partition resizing program" -HOMEPAGE = "http://www.gnu.org/software/parted/parted.html" -LICENSE = "GPLv2" -SECTION = "console/tools" -DEPENDS = "readline e2fsprogs-libs" -PR = "r0" - -SRC_URI = "${GNU_MIRROR}/parted/parted-${PV}.tar.gz" - -#EXTRA_OECONF = "--disable-Werror" - -inherit autotools pkgconfig - -do_stage() { - autotools_stage_all -} diff --git a/packages/parted/parted_1.8.7.bb b/packages/parted/parted_1.8.7.bb deleted file mode 100644 index 59e3aeaece..0000000000 --- a/packages/parted/parted_1.8.7.bb +++ /dev/null @@ -1,30 +0,0 @@ -DESCRIPTION = "parted, the GNU partition resizing program" -HOMEPAGE = "http://www.gnu.org/software/parted/parted.html" -LICENSE = "GPLv2" -SECTION = "console/tools" -DEPENDS = "readline e2fsprogs-libs" -PR = "r2" - -SRC_URI = "${GNU_MIRROR}/parted/parted-${PV}.tar.gz \ - file://syscalls.h \ - file://syscalls.patch;patch=1 \ - file://cross-gross-hack.patch;patch=1" - -EXTRA_OECONF = "--disable-Werror" - -inherit autotools pkgconfig - -do_configure_prepend() { - cp ${WORKDIR}/syscalls.h ${S}/libparted/arch/ -} - -do_configure() { - gnu-configize - libtoolize --force - autoconf - oe_runconf -} - -do_stage() { - autotools_stage_all -} diff --git a/packages/parted/parted_1.8.8.bb b/packages/parted/parted_1.8.8.bb index d1b5cbe5b3..4eb8aa5ca2 100644 --- a/packages/parted/parted_1.8.8.bb +++ b/packages/parted/parted_1.8.8.bb @@ -4,11 +4,13 @@ LICENSE = "GPLv3" SECTION = "console/tools" DEPENDS = "readline e2fsprogs-libs" -PR = "r1" +PR = "r2" SRC_URI = "${GNU_MIRROR}/parted/parted-${PV}.tar.gz \ file://syscalls.h \ file://syscalls.patch;patch=1 \ + file://use_llseek_syscall.patch;patch=1 \ + file://parted-1.8.x.patch;patch=1 \ " EXTRA_OECONF = "--disable-Werror ac_cv_func_calloc_0_nonnull=yes" diff --git a/packages/pax-utils/pax-utils-native_0.1.19.bb b/packages/pax-utils/pax-utils-native_0.1.19.bb new file mode 100644 index 0000000000..5a56c01aa4 --- /dev/null +++ b/packages/pax-utils/pax-utils-native_0.1.19.bb @@ -0,0 +1,12 @@ +inherit native + +require pax-utils_${PV}.bb + +do_stage() { + oe_runmake PREFIX=${STAGING_DIR_HOST}${layout_prefix} install +} + +do_install() { + : +} + diff --git a/packages/pax-utils/pax-utils_0.1.13.bb b/packages/pax-utils/pax-utils_0.1.13.bb index 6fc6850142..c704d288b8 100644 --- a/packages/pax-utils/pax-utils_0.1.13.bb +++ b/packages/pax-utils/pax-utils_0.1.13.bb @@ -1,8 +1,8 @@ DESCRIPTION = "Various ELF utilities" HOMEPAGE = "http://www.gentoo.org/proj/en/hardened/pax-utils.xml" LICENSE = "GPLv2" - -SRC_URI = "${GENTOO_MIRROR}/pax-utils-${PV}.tar.bz2;md5sum=5f09df47a16e83462384b44b75310539" +PR = "r1" +SRC_URI = "http://gentoo.osuosl.org/distfiles/pax-utils-${PV}.tar.bz2" S = "${WORKDIR}/pax-utils-${PV}" CPPFLAGS += "-D_GNU_SOURCE " diff --git a/packages/pax-utils/pax-utils_0.1.19.bb b/packages/pax-utils/pax-utils_0.1.19.bb new file mode 100644 index 0000000000..bd657d7997 --- /dev/null +++ b/packages/pax-utils/pax-utils_0.1.19.bb @@ -0,0 +1,17 @@ +DESCRIPTION = "Various ELF utilities" +HOMEPAGE = "http://www.gentoo.org/proj/en/hardened/pax-utils.xml" +LICENSE = "GPLv2" + +SRC_URI = "http://gentoo.osuosl.org/distfiles/pax-utils-${PV}.tar.bz2" +S = "${WORKDIR}/pax-utils-${PV}" + +CPPFLAGS += "-D_GNU_SOURCE " + +do_compile() { + oe_runmake +} + +do_install() { + oe_runmake DESTDIR=${D} install +} + diff --git a/packages/perl/libdate-manip-perl-native_5.54.bb b/packages/perl/libdate-manip-perl-native_5.54.bb new file mode 100644 index 0000000000..7199d9f8c5 --- /dev/null +++ b/packages/perl/libdate-manip-perl-native_5.54.bb @@ -0,0 +1,5 @@ +SECTION = "libs" + +inherit native + +require libdate-manip-perl_${PV}.bb diff --git a/packages/perl/libdate-manip-perl_5.54.bb b/packages/perl/libdate-manip-perl_5.54.bb new file mode 100644 index 0000000000..9097ce39c6 --- /dev/null +++ b/packages/perl/libdate-manip-perl_5.54.bb @@ -0,0 +1,14 @@ +DESCRIPTION = "Date and time manipulation routines." +SECTION = "libs" +LICENSE = "Artistic|GPL" +PR = "r0" + +RDEPENDS = "perl-module-test-more \ + perl-module-io-file \ + perl-module-carp" + +SRC_URI = "http://search.cpan.org/CPAN/authors/id/S/SB/SBECK/Date-Manip-${PV}.tar.gz" + +S = "${WORKDIR}/Date-Manip-${PV}" + +inherit cpan diff --git a/packages/perl/libdbd-mysql-perl-native_4.010.bb b/packages/perl/libdbd-mysql-perl-native_4.010.bb new file mode 100644 index 0000000000..180d1d0b13 --- /dev/null +++ b/packages/perl/libdbd-mysql-perl-native_4.010.bb @@ -0,0 +1,8 @@ +require libdbd-mysql-perl.inc + +DEPENDS = "libdbi-perl-native mysql-native" + +EXTRA_OECONF = " --mysql_config=${STAGING_BINDIR_NATIVE}" + +inherit native + diff --git a/packages/perl/libdbd-mysql-perl.inc b/packages/perl/libdbd-mysql-perl.inc new file mode 100644 index 0000000000..6200c2844a --- /dev/null +++ b/packages/perl/libdbd-mysql-perl.inc @@ -0,0 +1,10 @@ +DESCRIPTION = "The database interface driver for the MySQL database." +SECTION = "libs" +LICENSE = "Artistic|GPL" +PR = "r0" + +SRC_URI = "http://search.cpan.org/CPAN/authors/id/C/CA/CAPTTOFU/DBD-mysql-${PV}.tar.gz" + +S = "${WORKDIR}/DBD-mysql-${PV}" + +inherit cpan diff --git a/packages/perl/libdbd-mysql-perl_4.010.bb b/packages/perl/libdbd-mysql-perl_4.010.bb new file mode 100644 index 0000000000..95aa53b14b --- /dev/null +++ b/packages/perl/libdbd-mysql-perl_4.010.bb @@ -0,0 +1,13 @@ +require libdbd-mysql-perl.inc + +DEPENDS = "libdbi-perl mysql" +RDEPENDS = "perl-module-data-dumper \ + libdbi-perl \ + perl-module-scalar-util \ + perl-module-file-spec \ + perl-module-storable \ + perl-module-test-simple" + +EXTRA_OECONF = " --mysql_config=${STAGING_BINDIR_CROSS}/mysql_config" + +CFLAGS_append = " -I${STAGING_INCDIR}/mysql" diff --git a/packages/perl/libdbi-perl-native_1.607.bb b/packages/perl/libdbi-perl-native_1.607.bb new file mode 100644 index 0000000000..c5e3b1dea7 --- /dev/null +++ b/packages/perl/libdbi-perl-native_1.607.bb @@ -0,0 +1,5 @@ +SECTION = "libs" + +inherit native + +require libdbi-perl_${PV}.bb diff --git a/packages/perl/libdbi-perl_1.607.bb b/packages/perl/libdbi-perl_1.607.bb new file mode 100644 index 0000000000..af6853544c --- /dev/null +++ b/packages/perl/libdbi-perl_1.607.bb @@ -0,0 +1,15 @@ +DESCRIPTION = "Various MIME modules." +SECTION = "libs" +LICENSE = "Artistic|GPL" +PR = "r0" + +RDEPENDS = "perl-module-scalar-util \ + perl-module-file-spec \ + perl-module-storable \ + perl-module-test-simple" + +SRC_URI = "http://search.cpan.org/CPAN/authors/id/T/TI/TIMB/DBI-1.607.tar.gz" + +S = "${WORKDIR}/DBI-${PV}" + +inherit cpan diff --git a/packages/perl/libdevice-serialport-perl-native_1.04.bb b/packages/perl/libdevice-serialport-perl-native_1.04.bb new file mode 100644 index 0000000000..af3b2dfeec --- /dev/null +++ b/packages/perl/libdevice-serialport-perl-native_1.04.bb @@ -0,0 +1,5 @@ +SECTION = "libs" + +inherit native + +require libdevice-serialport-perl_${PV}.bb diff --git a/packages/perl/libemail-date-format-perl-native_1.002.bb b/packages/perl/libemail-date-format-perl-native_1.002.bb new file mode 100644 index 0000000000..ebae345876 --- /dev/null +++ b/packages/perl/libemail-date-format-perl-native_1.002.bb @@ -0,0 +1,5 @@ +SECTION = "libs" + +inherit native + +require libemail-date-format-perl_${PV}.bb diff --git a/packages/perl/libemail-date-format-perl_1.002.bb b/packages/perl/libemail-date-format-perl_1.002.bb new file mode 100644 index 0000000000..d83dac00bd --- /dev/null +++ b/packages/perl/libemail-date-format-perl_1.002.bb @@ -0,0 +1,13 @@ +DESCRIPTION = "Various MIME modules." +SECTION = "libs" +LICENSE = "Artistic|GPL" +PR = "r0" + +RDEPENDS = "perl-module-test-more \ + perl-module-time-local" + +SRC_URI = "http://search.cpan.org/CPAN/authors/id/R/RJ/RJBS/Email-Date-Format-${PV}.tar.gz" + +S = "${WORKDIR}/Email-Date-Format-${PV}" + +inherit cpan diff --git a/packages/perl/libhtml-parser-perl_3.60.bb b/packages/perl/libhtml-parser-perl_3.60.bb new file mode 100644 index 0000000000..08525331db --- /dev/null +++ b/packages/perl/libhtml-parser-perl_3.60.bb @@ -0,0 +1,15 @@ +DESCRIPTION = "HTML Parser bits." +SECTION = "libs" +LICENSE = "Artistic|GPL" +PR = "r0" + +RDEPENDS = "perl-module-test-more \ + perl-module-xsloader \ + perl-module-test-simple \ + libhtml-tagset-perl" + +SRC_URI = "http://search.cpan.org/CPAN/authors/id/G/GA/GAAS/HTML-Parser-3.60.tar.gz" + +S = "${WORKDIR}/HTML-Parser-${PV}" + +inherit cpan diff --git a/packages/perl/libhtml-tagset-perl_3.20.bb b/packages/perl/libhtml-tagset-perl_3.20.bb new file mode 100644 index 0000000000..788c37e094 --- /dev/null +++ b/packages/perl/libhtml-tagset-perl_3.20.bb @@ -0,0 +1,10 @@ +DESCRIPTION = "HTML Tagset bits." +SECTION = "libs" +LICENSE = "Artistic|GPL" +PR = "r0" + +SRC_URI = "http://search.cpan.org/CPAN/authors/id/P/PE/PETDANCE/HTML-Tagset-3.20.tar.gz" + +S = "${WORKDIR}/HTML-Tagset-${PV}" + +inherit cpan diff --git a/packages/perl/libmime-lite-perl-native_3.024.bb b/packages/perl/libmime-lite-perl-native_3.024.bb new file mode 100644 index 0000000000..50be9e11ff --- /dev/null +++ b/packages/perl/libmime-lite-perl-native_3.024.bb @@ -0,0 +1,5 @@ +SECTION = "libs" + +inherit native + +require libmime-lite-perl_${PV}.bb diff --git a/packages/perl/libmime-lite-perl_3.024.bb b/packages/perl/libmime-lite-perl_3.024.bb new file mode 100644 index 0000000000..80de33330f --- /dev/null +++ b/packages/perl/libmime-lite-perl_3.024.bb @@ -0,0 +1,15 @@ +DESCRIPTION = "Simple standalone module for generating MIME messages." +SECTION = "libs" +LICENSE = "Artistic|GPL" +PR = "r0" + +RDEPENDS = "perl-module-file-spec \ + libemail-date-format-perl \ + perl-module-test-more \ + perl-module-time-local" + +SRC_URI = "http://search.cpan.org/CPAN/authors/id/R/RJ/RJBS/MIME-Lite-3.024.tar.gz" + +S = "${WORKDIR}/MIME-Lite-${PV}" + +inherit cpan diff --git a/packages/perl/libmodule-load-perl-native_0.16.bb b/packages/perl/libmodule-load-perl-native_0.16.bb new file mode 100644 index 0000000000..f09c3f9741 --- /dev/null +++ b/packages/perl/libmodule-load-perl-native_0.16.bb @@ -0,0 +1,5 @@ +SECTION = "libs" + +inherit native + +require libmodule-load-perl_${PV}.bb diff --git a/packages/perl/libmodule-load-perl_0.16.bb b/packages/perl/libmodule-load-perl_0.16.bb new file mode 100644 index 0000000000..1d5a3ebeab --- /dev/null +++ b/packages/perl/libmodule-load-perl_0.16.bb @@ -0,0 +1,12 @@ +DESCRIPTION = "A module loading thingy for perl." +SECTION = "libs" +LICENSE = "Artistic|GPL" +PR = "r0" + +RDEPENDS = "perl-module-test-more" + +SRC_URI = "http://search.cpan.org/CPAN/authors/id/K/KA/KANE/Module-Load-0.16.tar.gz" + +S = "${WORKDIR}/Module-Load-${PV}" + +inherit cpan diff --git a/packages/perl/libphp-serialization-perl-native_0.30.bb b/packages/perl/libphp-serialization-perl-native_0.30.bb new file mode 100644 index 0000000000..9f83c5cc5a --- /dev/null +++ b/packages/perl/libphp-serialization-perl-native_0.30.bb @@ -0,0 +1,5 @@ +SECTION = "libs" + +inherit native + +require libphp-serialization-perl_${PV}.bb diff --git a/packages/perl/libphp-serialization-perl_0.30.bb b/packages/perl/libphp-serialization-perl_0.30.bb new file mode 100644 index 0000000000..07dd7de7e5 --- /dev/null +++ b/packages/perl/libphp-serialization-perl_0.30.bb @@ -0,0 +1,10 @@ +DESCRIPTION = "The standard database interface module for Perl." +SECTION = "libs" +LICENSE = "Artistic|GPL" +PR = "r0" + +SRC_URI = "http://search.cpan.org/CPAN/authors/id/B/BO/BOBTFISH/PHP-Serialization-0.30.tar.gz" + +S = "${WORKDIR}/PHP-Serialization-${PV}" + +inherit cpan diff --git a/packages/perl/libsys-mmap-perl-native_0.13.bb b/packages/perl/libsys-mmap-perl-native_0.13.bb new file mode 100644 index 0000000000..15eb6308f1 --- /dev/null +++ b/packages/perl/libsys-mmap-perl-native_0.13.bb @@ -0,0 +1,5 @@ +SECTION = "libs" + +inherit native + +require libsys-mmap-perl_${PV}.bb diff --git a/packages/perl/libsys-mmap-perl_0.13.bb b/packages/perl/libsys-mmap-perl_0.13.bb new file mode 100644 index 0000000000..e3037a2092 --- /dev/null +++ b/packages/perl/libsys-mmap-perl_0.13.bb @@ -0,0 +1,10 @@ +DESCRIPTION = "Uses mmap to map in a file as a perl variable." +SECTION = "libs" +LICENSE = "Artistic|GPL" +PR = "r0" + +SRC_URI = "http://search.cpan.org/CPAN/authors/id/S/SW/SWALTERS/Sys-Mmap-0.13.tar.gz" + +S = "${WORKDIR}/Sys-Mmap-${PV}" + +inherit cpan diff --git a/packages/perl/libx10-perl-native_0.03.bb b/packages/perl/libx10-perl-native_0.03.bb new file mode 100644 index 0000000000..bc5702d42f --- /dev/null +++ b/packages/perl/libx10-perl-native_0.03.bb @@ -0,0 +1,5 @@ +SECTION = "libs" + +inherit native + +require libx10-perl_${PV}.bb diff --git a/packages/perl/libx10-perl_0.03.bb b/packages/perl/libx10-perl_0.03.bb new file mode 100644 index 0000000000..bd76e2060d --- /dev/null +++ b/packages/perl/libx10-perl_0.03.bb @@ -0,0 +1,10 @@ +DESCRIPTION = "X10 support for Perl." +SECTION = "libs" +LICENSE = "Artistic|GPL" +PR = "r0" + +SRC_URI = "http://search.cpan.org/CPAN/authors/id/R/RO/ROBF/X10-0.03.tar.gz" + +S = "${WORKDIR}/X10-${PV}" + +inherit cpan diff --git a/packages/popt/popt-1.13/iconv.patch b/packages/popt/popt-1.13/iconv.patch deleted file mode 100644 index 4faf4c4a1d..0000000000 --- a/packages/popt/popt-1.13/iconv.patch +++ /dev/null @@ -1,25 +0,0 @@ -Index: popt-1.13/Makefile.am -=================================================================== ---- popt-1.13.orig/Makefile.am 2007-11-14 20:42:27.000000000 +0000 -+++ popt-1.13/Makefile.am 2008-03-26 22:14:05.000000000 +0000 -@@ -39,7 +39,7 @@ - usrlib_LTLIBRARIES = libpopt.la - - libpopt_la_SOURCES = popt.c findme.c poptparse.c poptconfig.c popthelp.c poptint.c --libpopt_la_LDFLAGS = -no-undefined @LTLIBINTL@ -+libpopt_la_LDFLAGS = -no-undefined @LTLIBINTL@ @LTLIBICONV@ - - if HAVE_LD_VERSION_SCRIPT - libpopt_la_LDFLAGS += -Wl,--version-script=$(srcdir)/libpopt.vers -Index: popt-1.13/configure.ac -=================================================================== ---- popt-1.13.orig/configure.ac 2007-11-14 20:42:27.000000000 +0000 -+++ popt-1.13/configure.ac 2008-03-26 22:20:16.000000000 +0000 -@@ -95,6 +95,7 @@ - AC_CHECK_FUNCS(getuid geteuid mtrace __secure_getenv setregid strerror iconv) - - AM_GNU_GETTEXT([external]) -+AM_ICONV_LINK - - popt_sysconfdir="${sysconfdir}" - eval "popt_sysconfdir=\"${popt_sysconfdir}\"" # expand contained ${prefix} diff --git a/packages/popt/popt-native_1.14.bb b/packages/popt/popt-native_1.14.bb deleted file mode 100644 index 54712ab812..0000000000 --- a/packages/popt/popt-native_1.14.bb +++ /dev/null @@ -1,16 +0,0 @@ -require popt.inc - -DEPENDS = "gettext-native" - -PR = "r0" - -inherit native autotools - -SRC_URI = "http://rpm5.org/files/popt/popt-${PV}.tar.gz" - -S = "${WORKDIR}/popt-${PV}" - -do_install() { - oe_libinstall -a -so libpopt ${STAGING_LIBDIR_NATIVE} - install -m 0644 popt.h ${STAGING_INCDIR_NATIVE} -} diff --git a/packages/popt/popt-native_1.7.bb b/packages/popt/popt-native_1.7.bb index a83d384eee..320a2112e8 100644 --- a/packages/popt/popt-native_1.7.bb +++ b/packages/popt/popt-native_1.7.bb @@ -1,20 +1,7 @@ -require popt.inc - +require popt_${PV}.bb DEPENDS = "gettext-native" - -PR = "r5" - -inherit native autotools - -SRC_URI = "ftp://ftp.rpm.org/pub/rpm/dist/rpm-4.1.x/popt-${PV}.tar.gz \ - file://m4.patch;patch=1 \ - file://intl.patch;patch=1" +inherit native S = "${WORKDIR}/popt-${PV}" FILESDIR = "${@os.path.dirname(bb.data.getVar('FILE',d,1))}/popt-${PV}" - -do_install() { - oe_libinstall -a -so libpopt ${STAGING_LIBDIR_NATIVE} - install -m 0644 popt.h ${STAGING_INCDIR_NATIVE} -} diff --git a/packages/popt/popt_1.14.bb b/packages/popt/popt_1.14.bb deleted file mode 100644 index 240ac52275..0000000000 --- a/packages/popt/popt_1.14.bb +++ /dev/null @@ -1,17 +0,0 @@ -require popt.inc - -DEPENDS = "gettext-native virtual/libintl" - -PR = "r1" - -inherit autotools - -SRC_URI = "http://rpm5.org/files/popt/popt-${PV}.tar.gz" - - -do_stage() { - oe_libinstall -a -so libpopt ${STAGING_LIBDIR} - install -m 0644 popt.h ${STAGING_INCDIR} -} - - diff --git a/packages/popt/popt_1.7.bb b/packages/popt/popt_1.7.bb index 7992db56e7..313e31b8fc 100644 --- a/packages/popt/popt_1.7.bb +++ b/packages/popt/popt_1.7.bb @@ -2,15 +2,10 @@ require popt.inc DEPENDS = "gettext virtual/libintl" -PR = "r5" +inherit autotools autotools_stage -inherit autotools - -SRC_URI = "ftp://ftp.rpm.org/pub/rpm/dist/rpm-4.1.x/popt-${PV}.tar.gz \ - file://m4.patch;patch=1 \ - file://intl.patch;patch=1" - -do_stage() { - oe_libinstall -a -so libpopt ${STAGING_LIBDIR} - install -m 0644 popt.h ${STAGING_INCDIR} -} +SRC_URI = "\ + http://rpm.org/releases/historical/rpm-4.1.x/popt-${PV}.tar.gz \ + file://m4.patch;patch=1 \ + file://intl.patch;patch=1 \ +" diff --git a/packages/powervr-drivers/libgles-omap3_3.00.00.06.bb b/packages/powervr-drivers/libgles-omap3_3.00.00.06.bb index 9fae1ff149..aba613c14b 100644 --- a/packages/powervr-drivers/libgles-omap3_3.00.00.06.bb +++ b/packages/powervr-drivers/libgles-omap3_3.00.00.06.bb @@ -1,7 +1,7 @@ require libgles-omap3.inc # Not released yet -DEFAULT_PREFERENCE = "-1" +#DEFAULT_PREFERENCE = "-1" PR = "r5" SGXPV = "3_00_00_06" diff --git a/packages/psplash/files/kaeilos/psplash-hand-img.h b/packages/psplash/files/kaeilos/psplash-hand-img.h new file mode 100644 index 0000000000..d262d6cc17 --- /dev/null +++ b/packages/psplash/files/kaeilos/psplash-hand-img.h @@ -0,0 +1,958 @@ +/* GdkPixbuf RGB C-Source image dump 1-byte-run-length-encoded */ + +#define HAND_IMG_ROWSTRIDE (720) +#define HAND_IMG_WIDTH (240) +#define HAND_IMG_HEIGHT (136) +#define HAND_IMG_BYTES_PER_PIXEL (3) /* 3:RGB, 4:RGBA */ +#define HAND_IMG_RLE_PIXEL_DATA ((uint8*) \ + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" \ + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" \ + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" \ + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" \ + "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" \ + "\377\377\377\377\377\377\235\377\377\377\13\350\351\351\246\247\247\200" \ + "\201\202efgIJK0238:;IJKhjj\233\234\234\335\336\336\377\377\377\377\343" \ + "\377\377\377\4\374\374\374\257\260\260JKL\25\27\30\211\23\25\26\4\24" \ + "\26\27RTT\257\260\260\371\371\371\377\377\377\377\337\377\377\377\2\270" \ + "\271\271345\217\23\25\26\2""567\270\271\271\377\377\377\377\334\377\377" \ + "\377\2\372\372\372mno\223\23\25\26\2efg\367\367\367\377\377\377\377\331" \ + "\377\377\377\2\374\374\374YZ[\217\23\25\26\4\"&'6=@6<\77\32\35\37\202" \ + "\23\25\26\2KLM\356\356\356\377\377\377\377\330\377\377\377\1\203\204" \ + "\205\220\23\25\26\5""7=A^dgagkJQT!%'\202\23\25\26\2""8:;\354\354\354" \ + "\377\377\377\377\326\377\377\377\2\333\333\333\26\30\31\220\23\25\26" \ + "\6@GJcimeko_ei9\77B\30\32\33\202\23\25\26\2Y[\\\376\376\376\377\377\377" \ + "\377\325\377\377\377\1ijk\221\23\25\26\1ELO\202djn\3[ae=DG\35!#\203\23" \ + "\25\26\1\252\252\253\377\377\377\377\324\377\377\377\2\366\366\366\36" \ + "\37\40\221\23\25\26\5""5;>W]`KQU6<\77\40#%\204\23\25\26\2/12\367\367" \ + "\367\377\377\377\377\323\377\377\377\1\271\272\272\222\23\25\26\2\27" \ + "\31\32\34\37!\210\23\25\26\1\243\244\244\377\377\377\377\323\377\377" \ + "\377\1\211\212\212\234\23\25\26\1EGH\377\377\377\377\323\377\377\377" \ + "\1^_`\235\23\25\26\1\332\332\332\377\377\377\377\322\377\377\377\1IJ" \ + "K\235\23\25\26\1\226\227\230\377\377\377\377\322\377\377\377\1<>>\205" \ + "\23\25\26\3&*,058\27\31\33\213\23\25\26\3BHKmswKPT\207\23\25\26\1UVW" \ + "\377\377\377\377\322\377\377\377\1.01\205\23\25\26\4\24\27\31EKOZ`c!" \ + "%(\206\23\25\26\10\27\32\33FKMbgj\\be<@B>ADuz~SX[\206\23\25\26\1*+,\377" \ + "\377\377\377\322\377\377\377\1!#$\203\23\25\26\6ntw\226\232\236\212\216" \ + "\222BEGKQTQWZ\205\23\25\26\11""7:=\215\221\224\245\250\253\255\256\262" \ + "\246\251\254\227\232\236|\201\204\37\"#agk\206\23\25\26\2\24\26\27\363" \ + "\363\363\377\377\377\377\320\377\377\377\2\376\376\376\25\27\30\202\23" \ + "\25\26\7glo\276\277\303\357\360\361\355\355\357\305\307\312cgj(-0\204" \ + "\23\25\26\13\36!\"\241\244\250\332\333\335\351\351\353\355\355\357\346" \ + "\347\350\327\330\332\274\276\301}\200\204\33\37!\36\40#\206\23\25\26" \ + "\1\321\322\322\377\377\377\377\321\377\377\377\1\26\30\31\202\23\25\26" \ + "\2\260\262\266\363\364\365\202\376\376\376\3\374\374\374\335\336\340" \ + "\36\40!\204\23\25\26\3\213\216\222\357\360\361\376\376\376\202\377\377" \ + "\377\5\376\376\376\375\375\375\364\365\366\303\305\310,02\207\23\25\26" \ + "\1\260\261\261\377\377\377\377\321\377\377\377\12\37!\"\23\25\26CGJ\363" \ + "\363\364\332\332\332\207\210\210\272\273\273\377\377\377\374\374\374" \ + "\235\240\244\204\23\25\26\12\326\327\331\376\376\376\377\377\377\274" \ + "\275\275qrrwxy\347\350\350\377\377\377\370\370\370\224\230\233\207\23" \ + "\25\26\1\237\237\240\377\377\377\377\321\377\377\377\12)*+\23\25\26\206" \ + "\213\216\375\375\375244\\bew{\177\243\244\244\377\377\377\327\330\333" \ + "\203\23\25\26\13\35\40!\356\357\357\377\377\377\311\311\312\25\27\30" \ + "\23\25\26\215\221\225^cg\365\365\365\376\376\376\344\345\346\207\23\25" \ + "\26\1\255\256\256\377\377\377\377\321\377\377\377\12""134\23\25\26\221" \ + "\224\230\332\332\332\23\25\26]ae\226\231\235-13\377\377\377\356\357\357" \ + "\203\23\25\26\4\34\37\40\363\363\364\377\377\377stu\202\23\25\26\6sy" \ + "|\207\212\216\240\240\241\377\377\377\367\367\370\27\31\32\206\23\25" \ + "\26\1\275\276\276\377\377\377\377\321\377\377\377\4:<=\23\25\26cfj\322" \ + "\323\323\202\23\25\26\4\217\222\226NSU\375\375\375\361\361\362\204\23" \ + "\25\26\3\357\357\360\377\377\377WXY\204\23\25\26\4egg\377\377\377\372" \ + "\372\373$()\206\23\25\26\1\307\310\310\377\377\377\377\321\377\377\377" \ + "\12CEF\23\25\26*-/\371\371\371\40\"#\23\25\26""7=>\36\40!\346\331\311" \ + "\304\216\40\202\342\257\13\5\344\263\10\333\247\20\301\213*\373\373\372" \ + "abc\204\23\25\26\3qrr\377\377\377\373\373\373\207\23\25\26\1\271\272" \ + "\272\377\377\377\377\321\377\377\377\1MNO\202\23\25\26\2\366\366\367" \ + "\204\205\205\202\23\25\26\3\221c(\321\236\15\301\211\36\202\365\306\0" \ + "\6\324\234\22\246i)\320\227\22\361\301\0\325\241\23\24\25\26\202\23\25" \ + "\26\4\30\32\33\312\312\313\377\377\377\370\370\371\207\23\25\26\1\244" \ + "\245\245\377\377\377\377\321\377\377\377\1Z\\\\\202\23\25\26\25\327\331" \ + "\333\370\370\370ede\260w&\352\270\4\243g)\264{#\365\306\0\365\306\30" \ + "\363\304\11\255r'\263z%\365\306\0\364\305\0\360\300\1\326\242\22mZD\305" \ + "\306\306\377\377\377\376\376\376\336\337\341\207\23\25\26\1|}}\377\377" \ + "\377\377\321\377\377\377\1lmn\202\23\25\26\5$')\346\333\322\274\202%" \ + "\352\270\4\364\305\0\203\365\306\0\2\365\312+\365\307\35\205\365\306" \ + "\0\5\364\305\0\363\304\0\357\277\1\335\251\20\333\316\302\210\23\25\26" \ + "\1OQR\377\377\377\377\321\377\377\377\1}~~\202\23\25\26\4\77,\32\276" \ + "\205%\351\267\6\364\305\0\203\365\306\0\3\365\306\14\365\312,\365\306" \ + "\2\203\365\306\0\3\365\306\2\365\310\31\365\310\33\202\365\306\0\3\364" \ + "\305\0\360\300\1\243q\35\207\23\25\26\2$&'\376\376\376\377\377\377\377" \ + "\320\377\377\377\6\215\216\217\23\25\26'\40\27\272\200&\345\263\10\364" \ + "\305\0\204\365\306\0\2\365\310\"\365\311$\203\365\306\0\11\365\306\1" \ + "\365\311'\365\313,\365\312)\365\307\2\361\302\0\310\227\30\337\254\11" \ + "\352\270\5\210\23\25\26\1\325\325\326\377\377\377\377\320\377\377\377" \ + "\5\236\237\237\23\25\26\211X$\320\231\40\361\301\0\205\365\306\0\1\365" \ + "\310\25\204\365\306\0\11\365\311%\365\312,\365\312*\365\307\15\265\204" \ + "\31tD*uE*\335\254\11\353\271\3\210\23\25\26\1\225\226\227\377\377\377" \ + "\377\320\377\377\377\5\256\257\257\23\25\26\227b&\306\222\31\363\304" \ + "\0\211\365\306\0\12\365\311$\365\312,\365\311&\310\227\20wG*o\77*}M*" \ + "\351\272\0\364\305\0\337\251\20\210\23\25\26\1UVW\377\377\377\377\320" \ + "\377\377\377\5\277\277\300\23\25\26[=\36\202Q*\215]*\210\365\306\0\7" \ + "\365\310\31\365\312)\324\244\23yI*n>*wG*\317\236\15\202\365\306\0\2\361" \ + "\301\0\253t#\202\23\25\26\3\33\36\37\\be7=@\203\23\25\26\2\30\32\33\352" \ + "\352\352\377\377\377\377\317\377\377\377\1\317\320\320\202\23\25\26\4" \ + "\236g)\200O*uD*\310\230\21\205\365\306\0\6\364\305\0\320\237\20|L*n>" \ + "*sD*\264\203\34\202\365\306\0\4\364\305\0\360\300\0\315\227\32_^[\203" \ + "\23\25\26\4cimdjn]cg'-/\202\23\25\26\1\230\231\231\377\377\377\377\317" \ + "\377\377\377\1\334\335\335\202\23\25\26\26x|~\245n+{J*\237m\35tD*zK*" \ + "\205U)\202R)zK*qB*pA*wG*\262\201\35\362\303\0\365\306\0\364\304\0\357" \ + "\276\1\333\246\22\265{'\251\243\237\221\224\230\23\26\27\202\23\25\26" \ + "\1^dh\202eko\1bhl\202\23\25\26\2""9;<\374\374\374\212\377\377\377\1\257" \ + "\270\306\204Ym\211\1\213\231\254\215\377\377\377\2\267\300\314ex\221" \ + "\226\377\377\377\2\216\233\256\217\234\257\207\377\377\377\2\226\243" \ + "\264\207\226\252\217\377\377\377\3\371\371\373Ym\211\312\321\332\204" \ + "\377\377\377\6\362\363\366Ym\211\324\331\340\354\357\362Ym\211\331\336" \ + "\344\361\377\377\377\1\312\312\313\202\23\25\26\26\214\220\223\223\225" \ + "\230\243l,\302\213%\222b\"zJ*xH*zJ*\207W)\260~\40\344\264\4\365\306\0" \ + "\364\305\0\363\304\0\355\275\2\330\242\26\262y(\303\274\266\324\326\331" \ + "\321\322\325\271\273\276Y]`\202\23\25\26\5!$'cimekodjnCHL\202\23\25\26" \ + "\1\252\252\253\212\377\377\377\2\224\240\262#=b\203Ka\177\1\200\217\245" \ + "\215\377\377\377\2\237\252\2723Km\226\377\377\377\2gy\223j{\225\207\377" \ + "\377\377\2s\203\233_q\214\217\377\377\377\3\366\367\371\"<a\271\301\315" \ + "\204\377\377\377\6\355\357\362\"<a\305\314\326\345\350\355\"<a\315\323" \ + "\333\361\377\377\377\1\242\243\243\202\23\25\26\26\232\234\240\261\263" \ + "\266\226\232\235\232i4\303\212%\345\262\10\363\304\0\364\305\0\365\306" \ + "\0\364\305\0\364\304\0\362\302\0\353\272\3\327\240\30\266|'\266\240\213" \ + "\335\336\340\354\355\357\365\366\366\365\365\365\344\345\350\244\250" \ + "\253\203\23\25\26\4>DGagk`fj\26\32\34\202\23\25\26\2""567\372\372\372" \ + "\211\377\377\377\2\224\240\262*Cg\221\377\377\377\2\237\252\2723Km\202" \ + "\377\377\377\1\363\365\367\207\377\377\377\2\371\372\373\355\357\362" \ + "\207\377\377\377\1\365\366\370\202\377\377\377\2gy\223j{\225\204\377" \ + "\377\377\1\365\366\370\202\377\377\377\2s\203\233_q\214\204\377\377\377" \ + "\2\360\362\364\367\370\371\207\377\377\377\5\364\366\367\377\377\377" \ + "\366\367\371\"<a\271\301\315\204\377\377\377\6\355\357\362\"<a\305\314" \ + "\326\376\376\376\356\360\363\373\374\374\361\377\377\377\1QSS\202\23" \ + "\25\26\22\246\250\254\315\316\321\267\270\274\222\225\231\217lF\274\203" \ + "&\333\246\23\346\262\7\351\267\5\347\263\7\336\250\21\320\230\37\270" \ + "\177'\251\200\\\317\320\323\347\350\351\370\370\371\376\376\376\202\377" \ + "\377\377\3\375\375\375\340\341\343CGJ\211\23\25\26\1\242\243\243\211" \ + "\377\377\377\2\224\240\262*Cg\205\377\377\377\23\216\234\257\200\217" \ + "\244o\200\230-FiUi\206\345\350\354\266\277\313F\\{0Hkz\212\240\371\372" \ + "\373\377\377\377\237\252\2723Km\301\310\323@Ww\"<a9Pr\241\254\274\203" \ + "\377\377\377\6\365\366\370m\177\227)Bf\"<aMb\200\325\332\341\203\377" \ + "\377\377\7\310\316\330F\\{#=b3Km\231\245\266fx\222j{\225\202\377\377" \ + "\377\7\316\324\334J_}#=b2Jm\220\235\260q\202\231_q\214\202\377\377\377" \ + "\6\322\330\337F\\{#=b%\77cw\207\236\366\367\371\202\377\377\377\10\376" \ + "\376\376\216\234\2573Km#=bJ_}\310\316\330\"<a\271\301\315\204\377\377" \ + "\377\21\355\357\362\"<a\305\314\326\351\354\357=Tu\323\330\340\342\345" \ + "\352=Tu\255\267\304E[z,Eh_r\215\346\351\355\377\377\377\347\352\356=" \ + "Tu\322\330\337\202\377\377\377\12\345\350\355=Tu\327\333\342\224\240" \ + "\262Mb\200\371\371\373\377\377\377\301\310\323=Tu\323\330\340\331\377" \ + "\377\377\2\301\301\302\24\26\27\202\23\25\26\20\271\273\276\352\353\355" \ + "\332\333\335\260\262\265\221\224\230\203sb\243l,\254q+\262x*\261w*\247" \ + "o,\243}Z\273\273\276\324\325\330\353\354\355\373\373\374\205\377\377" \ + "\377\2\374\374\374\277\301\303\211\23\25\26\2/12\367\367\367\210\377" \ + "\377\377\2\224\240\262*Cg\205\377\377\377\24\177\216\243$>cRg\204\223" \ + "\240\262>UuH^|,Eh\203\222\247\200\217\244#=b\223\240\262\377\377\377" \ + "\237\252\272$>c#=b_q\214\216\234\257Sg\204\"<a\235\251\271\202\377\377" \ + "\377!Vj\206*Cg\204\222\247\225\242\264\77Vv/Gj\344\347\354\377\377\377" \ + "\316\324\334&@d\77Vv\213\231\254u\205\235$>c'@ej{\225\377\377\377\327" \ + "\333\342)Bf;Rs\210\226\252z\211\240&@d'@e_q\214\377\377\377\333\337\345" \ + "*CgE[z\227\243\265\200\217\245(Aeat\216\202\377\377\377\10\204\222\247" \ + "\"<a_r\215\216\234\257Sg\204'@e\"<a\271\301\315\204\377\377\377\21\355" \ + "\357\362\"<a\305\314\326\345\350\355\"<a\315\323\333\336\342\347\"<a" \ + "#=bfx\222{\213\241*CgTh\205\377\377\377\344\347\354\"<a\313\321\332\202" \ + "\377\377\377\11\342\345\352\"<a\321\327\337\352\354\360*Cg\236\252\272" \ + "\376\376\376Ka\177ew\221\331\377\377\377\2\367\367\367689\203\23\25\26" \ + "\17\345\345\347\375\375\375\367\370\370\321\322\325\256\260\263\223\226" \ + "\232\207\212\216\207\213\217\216\221\225\233\236\242\256\260\263\303" \ + "\305\310\332\333\336\360\360\361\375\375\375\207\377\377\377\2\367\367" \ + "\370JOP\211\23\25\26\1{||\210\377\377\377\2\224\240\262$>c\203k|\225" \ + "\11\227\243\265\377\377\377\177\216\243)Cf\362\364\366\377\377\377\307" \ + "\316\327\"<au\205\235\202\377\377\377\6u\205\235DZz\377\377\377\237\252" \ + "\272\"<az\211\240\202\377\377\377\7\375\375\376hz\2230Hk\362\363\366" \ + "\266\277\313\"<a\304\313\325\202\377\377\377\7\354\357\3625Mo}\214\242" \ + "\377\377\377Xk\207AWw\362\363\366\202\377\377\377\7\257\270\306\"<aj" \ + "{\225\377\377\377cu\220:Qr\355\357\362\202\377\377\377\7\272\302\316" \ + "\"<a_q\214\377\377\377gy\223@Ww\364\366\367\202\377\377\377\6\260\272" \ + "\307\"<a\314\322\333\342\345\352&@d\202\221\246\202\377\377\377\4\374" \ + "\374\375cu\220\"<a\271\301\315\204\377\377\377\11\355\357\362\"<a\305" \ + "\314\326\345\350\355\"<a\315\323\333\336\342\347\"<as\203\233\202\377" \ + "\377\377\6\254\266\304\"<a\336\342\350\344\347\354\"<a\313\321\332\202" \ + "\377\377\377\11\342\345\352\"<a\321\327\337\377\377\377\212\230\2546" \ + "Mo\251\263\302'@e\336\342\350\331\377\377\377\1\210\211\211\203\23\25" \ + "\26\17\244\245\251\374\374\374\377\377\377\376\376\376\357\360\361\311" \ + "\312\316\256\260\263\240\243\246\241\244\247\250\253\256\266\270\273" \ + "\311\312\316\337\340\342\364\364\365\375\375\376\210\377\377\377\2\376" \ + "\376\376\331\332\334\211\23\25\26\2\24\26\27\274\276\274\207\372\374" \ + "\371\2\221\237\257\"<a\203@Wv\4x\210\235\372\374\371}\215\241Pe\202\202" \ + "\372\374\371\3\364\366\365\"<a\237\253\271\202\372\374\371\6\240\254" \ + "\272)Cf\372\374\371\234\251\267\"<a\350\354\354\203\372\374\371\5\325" \ + "\333\337\"<a\301\311\321w\207\235;Ss\204\301\310\323\5bu\217=Tt\371\371" \ + "\373$>c\246\260\277\204\377\377\377\5F\\{j{\225\376\376\376*Cg\233\246" \ + "\267\204\377\377\377\5Qe\202_q\214\377\377\377+Dht\205\234\203\301\310" \ + "\323\6\277\307\321+Dh\214\231\255\254\266\304#=b\362\364\366\202\377" \ + "\377\377\4\376\374\374\323\326\335\"<a\270\276\312\204\375\372\372\11" \ + "\353\353\356\"<a\304\310\322\344\344\350\"<a\313\317\330\334\335\343" \ + "\"<a\265\274\310\202\375\372\372\6\345\346\352\"<a\301\306\320\342\343" \ + "\347\"<a\312\316\326\202\375\372\372\10\340\341\346\"<a\320\323\333\375" \ + "\372\372\357\356\3600Hk%\77c\202\220\244\203\375\372\372\1\375\373\373" \ + "\325\377\377\377\2\312\312\313\30\32\33\202\23\25\26\2\40\"$\362\363" \ + "\364\203\377\377\377\12\375\375\375\346\347\351\310\312\315\272\273\277" \ + "\273\274\300\302\304\307\321\322\325\345\346\347\367\367\370\376\376" \ + "\376\212\377\377\377\2\371\372\3729>@\211\23\25\26\2+-.\346\350\343\206" \ + "\366\370\363\2\217\235\254*Cg\205\366\370\363\2{\213\236^q\212\203\366" \ + "\370\363\2)Bf\251\264\276\202\366\370\363\5\246\261\274%\77c\366\370" \ + "\363\232\246\2642Kl\204\366\370\363\4\361\363\357\"<a\244\257\273[o\211" \ + "\206\"<a\4'@e\336\342\350\"<a\305\314\326\204\377\377\377\202j{\225\3" \ + "\353\355\361\"<a\272\302\316\204\377\377\377\3u\205\235_q\214\355\357" \ + "\362\207\"<a\3t\205\234\221\236\2616Mo\203\377\377\377\4\374\367\367" \ + "\363\355\356\"<a\265\270\304\204\371\362\362\11\350\343\346\"<a\301\302" \ + "\314\340\335\341\"<a\310\311\321\330\327\334\"<a\306\307\320\202\371" \ + "\362\362\6\360\353\354\"<a\262\266\302\336\334\340\"<a\307\307\320\202" \ + "\371\362\362\3\331\327\335\"<a\315\314\324\202\371\362\362\3hw\220\"" \ + "<a\307\307\320\203\371\362\362\1\373\365\365\324\377\377\377\2\356\356" \ + "\356/12\203\23\25\26\2\322\323\325\376\376\376\204\377\377\377\10\373" \ + "\373\373\343\344\346\324\325\330\326\327\332\336\337\341\353\354\355" \ + "\372\372\373\376\376\376\213\377\377\377\2\376\376\376\311\312\315\212" \ + "\23\25\26\1\\_]\206\361\365\354\2\214\233\251*Cf\205\361\365\354\2y\212" \ + "\233^r\211\203\361\365\354\2+Dg\246\262\272\202\361\365\354\6\242\257" \ + "\267%\77c\361\365\354\227\245\260#=b\350\355\346\203\361\365\354\5\322" \ + "\332\330\"<a\270\302\306s\205\230G]{\206\335\341\347\3\366\367\371#=" \ + "b\250\263\301\204\377\377\377\5Qe\202j{\225\375\375\376(Ae\235\251\271" \ + "\204\377\377\377\5\\o\213_q\214\376\376\376+Dh\213\231\254\205\335\341" \ + "\347\4\351\354\357\251\263\302#=b\365\366\370\202\377\377\377\4\372\364" \ + "\364\330\323\330\"<a\264\264\300\204\367\354\354\11\346\336\341\"<a\277" \ + "\276\310\336\330\334\"<a\307\304\315\327\321\327\"<a\313\310\317\202" \ + "\367\354\354\6\357\345\347\"<a\261\262\276\344\334\340\"<a\270\270\303" \ + "\202\367\354\354\10\315\311\321\"<a\313\310\317\367\354\354\325\320\326" \ + "%\77c0Hjcr\214\203\367\354\354\1\371\360\360\323\377\377\377\2\376\376" \ + "\376[]]\203\23\25\26\2\200\204\207\371\372\372\206\377\377\377\5\371" \ + "\372\372\356\357\360\357\357\360\367\367\367\375\375\375\216\377\377" \ + "\377\1\364\364\365\213\23\25\26\1\233\237\231\205\354\362\347\2\212\232" \ + "\246*Cf\205\354\362\347\2w\210\231\\q\210\203\354\362\347\2*Dg\243\261" \ + "\267\202\354\362\347\6\237\255\264%\77c\354\362\347\224\243\255\"<a\205" \ + "\225\243\203\354\362\347\6p\203\225*Cf\334\343\334\244\261\267$>c\317" \ + "\325\335\202\377\377\377\7\351\354\357Th\205\226\243\264\377\377\377" \ + "Od\201I^}\371\371\373\202\377\377\377\7\305\314\326\"<aj{\225\377\377" \ + "\377Zn\211@Ww\366\367\371\202\377\377\377\7\320\325\335#=b_q\214\377" \ + "\377\377at\216H^|\371\372\373\202\377\377\377\6\260\272\307Ka\177\326" \ + "\333\342\334\340\346#=b\221\236\261\202\377\377\377\4\371\357\357s}\224" \ + "\"<a\262\260\273\204\365\345\345\11\344\327\332\"<a\276\271\303\335\321" \ + "\326\"<a\305\277\307\325\313\321\"<a\311\302\312\202\365\345\345\6\355" \ + "\337\340\"<a\260\256\272\365\345\345(Ae\210\216\241\202\365\345\345\11" \ + "\217\224\245\"<a\311\302\312\365\345\345bo\211Qb\177\264\261\274\"<a" \ + "\311\301\311\202\365\345\345\1\367\352\352\323\377\377\377\1\227\230" \ + "\231\203\23\25\26\3\26\30\31\344\345\347\376\376\376\207\377\377\377" \ + "\202\376\376\376\220\377\377\377\2\375\375\375nqt\212\23\25\26\2\37!" \ + "!\312\322\305\204\346\357\340\2\207\230\242%\77c\203l\177\221\4\220\241" \ + "\250\346\357\340t\207\226[p\206\203\346\357\340\2*Cf\237\257\262\202" \ + "\346\357\340\4\234\253\260%\77c\346\357\340\221\241\251\202\"<a(o\202" \ + "\223\233\252\257dx\214\"<a\204\226\241\346\357\340\345\356\337I_{/Gj" \ + "\217\234\257\226\243\264BXx,Eh\336\342\350\377\377\377\306\315\326#=" \ + "bPd\202\245\260\277\222\237\261+Dh#=bj{\225\377\377\377\320\325\335$" \ + ">cK`~\244\257\276\224\241\263/Gj#=b_q\214\377\377\377\325\332\341%\77" \ + "cNc\201\241\254\274\200\217\244)BfYm\211\202\377\377\377\5y\211\237#" \ + "=by\211\237\251\263\302jw\220\202\"<a\1\261\253\267\204\364\337\337\11" \ + "\343\322\325\"<a\275\264\276\334\314\320\"<a\305\272\303\324\306\314" \ + "\"<a\311\275\305\202\364\337\337\21\354\331\332\"<a\257\251\266\364\337" \ + "\337ku\215)Be\217\220\242\204\210\234'@d\"<a\311\275\305\300\266\300" \ + "\"<a\302\270\301\364\337\337N^|[h\203\202\364\337\337\1\367\345\345\322" \ + "\377\377\377\2\316\316\316\31\33\34\203\23\25\26\2z\177\202\371\371\372" \ + "\233\377\377\377\1\343\344\345\213\23\25\26\2CGD\335\350\326\203\340" \ + "\353\331\1\204\226\237\204\"<a\4Zp\205\340\353\331r\205\223Yo\204\203" \ + "\340\353\331\2*Cf\234\254\256\202\340\353\331\12\230\251\254%>c\340\353" \ + "\331\215\237\245.Gh\230\251\254+Dg\"<a*Cf\203\225\236\203\340\353\331" \ + "\2\334\344\336Xl\210\202\"<a\2;Rs\304\313\325\203\377\377\377\7\275\304" \ + "\3207Np\"<a&@d\201\220\245at\216j{\225\202\377\377\377\7\303\313\325" \ + ":Qr\"<a$>cy\211\237j{\225_q\214\202\377\377\377\2\303\312\3244Ln\202" \ + "\"<a\2`s\216\357\361\364\202\377\377\377\10\372\373\374\200\217\245(" \ + "Ae\"<a3Ik\255\243\260\"<a\261\247\262\204\364\330\330\11\343\313\317" \ + "\"<a\275\257\271\334\306\312\"<a\305\265\275\324\300\306\"<a\311\270" \ + "\300\202\364\330\330\15\354\322\324\"<a\257\245\261\364\330\330\336\310" \ + "\314KZx\"<a%>c\211\211\233\"<a\307\267\277L[ybl\205\202\364\330\330\5" \ + "\273\256\270\"<a\300\261\272\364\330\330\367\340\340\321\377\377\377" \ + "\2\360\360\360244\204\23\25\26\2\246\250\254\374\374\374\233\377\377" \ + "\377\2\371\371\371\27\31\32\213\23\25\26\1{\203x\231\332\350\323\3\327" \ + "\345\321\277\317\302\327\345\321\204\332\350\323\5\351\362\345\377\377" \ + "\377\353\356\361\333\337\345\373\374\374\206\377\377\377\2\343\346\353" \ + "\366\367\371\207\377\377\377\2\345\350\354\364\366\367\206\377\377\377" \ + "\3\376\376\376\333\337\345\346\351\355\206\377\377\377\3\371\372\373" \ + "\340\344\351\370\342\342\230\364\322\322\2\333\300\305\351\312\314\213" \ + "\364\322\322\1\367\333\333\321\377\377\377\1`ab\204\23\25\26\3""8;=\262" \ + "\264\267\372\372\372\224\377\377\377\11\376\376\376\373\374\374\367\370" \ + "\371\361\362\363\354\354\355\355\356\357\374\374\374\376\376\376\253" \ + "\255\260\213\23\25\26\2\27\31\32\257\275\252\237\324\346\316\1\346\360" \ + "\342\246\377\377\377\1\371\340\340\245\364\314\314\1\367\326\326\320" \ + "\377\377\377\1\254\254\255\205\23\25\26\4_eh\234\237\242\345\346\347" \ + "\376\376\376\205\377\377\377\6\345\345\346\330\331\332\370\370\370\356" \ + "\357\360\333\334\335\361\362\363\205\377\377\377\14\374\374\374\360\361" \ + "\362\342\343\346\323\324\327\307\310\313\276\300\303\271\272\276\263" \ + "\265\270\264\265\271\320\322\325\374\374\374\360\360\361\214\23\25\26" \ + "\2:@;\313\340\305\236\316\343\310\1\342\357\336\246\377\377\377\1\370" \ + "\334\334\245\363\307\307\1\366\322\322\317\377\377\377\2\371\371\371" \ + "345\204\23\25\26\6\23\26\27ouy\220\223\227\266\267\273\346\347\350\374" \ + "\374\374\204\377\377\377\6\362\362\362\304\305\311\277\300\304\301\302" \ + "\306\316\317\323\372\372\372\204\377\377\377\7\375\375\375\354\354\356" \ + "\325\326\331\277\300\304\250\252\255\234\237\243\231\234\240\203\230" \ + "\233\237\4\236\240\244\314\315\320\373\373\374;=@\214\23\25\26\1z\211" \ + "x\225\307\340\302\2\247\301\260\277\330\275\207\307\340\302\1\336\355" \ + "\333\202\377\377\377\2\324\331\340\374\374\375\211\377\377\377\1\321" \ + "\326\336\211\377\377\377\2\346\351\355\352\354\360\203\377\377\377\2" \ + "\326\333\342\373\374\374\205\377\377\377\4\364\366\367\334\340\346\377" \ + "\377\377\370\331\331\222\363\302\302\3\314\251\260\357\277\300\307\246" \ + "\256\214\363\302\302\5\317\253\261\353\275\276\326\257\265\345\271\273" \ + "\366\316\316\317\377\377\377\1\231\232\232\205\23\25\26\7),.}\201\205" \ + "\235\237\243\274\276\301\330\331\333\361\362\363\376\376\376\204\377" \ + "\377\377\3\365\365\365\315\317\322\361\361\361\207\377\377\377\10\374" \ + "\374\374\356\357\361\331\332\334\302\304\307\257\261\265\242\245\251" \ + "\234\237\242\231\234\240\202\230\233\237\3\235\240\244\337\341\342\337" \ + "\340\343\202\23\25\26\2""179069\210\23\25\26\2\35\40\37\257\310\254\223" \ + "\302\336\276\3\231\264\246:Uo\264\320\266\207\302\336\276\1\333\354\330" \ + "\202\377\377\377\2fx\222\365\366\370\210\377\377\377\2\375\375\376DZ" \ + "z\211\377\377\377\2\233\247\270\247\261\300\203\377\377\377\2l~\226\357" \ + "\361\364\205\377\377\377\4\321\327\337r\202\232\377\377\377\367\326\325" \ + "\222\362\274\273\3U[w\337\260\263X]x\214\362\274\273\5bc}\323\251\255" \ + "\215~\217\276\234\245\365\311\310\316\377\377\377\2\363\363\363(**\205" \ + "\23\25\26\6nrv\254\256\261\340\341\342\366\367\367\375\375\375\376\376" \ + "\376\222\377\377\377\13\374\374\374\360\361\363\336\340\342\314\315\321" \ + "\270\272\275\245\250\254\232\235\241\230\233\237\241\243\246\362\362" \ + "\363\77BD\202\23\25\26\3FLOHNR\40%(\207\23\25\26\1JVK\223\274\334\270" \ + "\13NjzPl{\261\320\262\253\312\256g\204\210l\211\213\261\320\262\274\334" \ + "\270\200\236\226\210\246\233\321\344\321\202\377\377\377%\253\265\303" \ + "\371\372\373\250\262\301\271\301\315\220\235\260\344\347\354\377\377" \ + "\377\376\376\376\250\262\301\203\222\247\315\323\333DZz\353\355\361\270" \ + "\301\314\377\377\377\371\372\373\253\265\303\377\377\377\257\271\306" \ + "\224\240\262\354\357\362`s\216fx\222\327\334\343\272\302\316\275\305" \ + "\320\256\267\305\366\367\371\375\375\376\243\256\276\203\222\247\316" \ + "\324\334\251\263\302\321\327\337r\202\232\377\377\377\366\321\321\202" \ + "\360\265\265\30\242\207\225|q\206\301\231\242\232\202\222\341\254\257" \ + "\251\213\230\250\213\230\202t\210\303\233\243\360\265\265\301\232\242" \ + "\275\227\240\216|\215\213z\214\337\253\256\360\265\265UZv\335\252\255" \ + "\234\204\223\360\265\265\352\261\263\221}\216xo\204\312\236\245\202\360" \ + "\265\265\26\260\220\233{p\205\262\221\234\234\204\223\312\236\245BOn" \ + "\215{\215\270\224\236\323\244\251\363\303\303\264\275\311{\213\241\271" \ + "\301\315\377\377\377\333\337\345\277\307\321\224\241\263\250\263\301" \ + "\376\376\376\377\377\377\243\256\276\234\250\271\302\377\377\377\1\213" \ + "\214\215\203\23\25\26\6\24\26\27\23\25\26\24\26\27\254\256\262\357\357" \ + "\360\375\375\375\230\377\377\377\10\374\374\374\360\361\363\333\333\335" \ + "\270\271\275\234\237\242\230\233\237\256\261\264\334\335\336\203\23\25" \ + "\26\3;ADGNQ'-0\207\23\25\26\1\214\247\212\222\266\332\262\13Us}Xv\177" \ + "\246\312\2528Smq\220\214j\211\210>Zq\264\330\2617SmFcu\317\344\316\202" \ + "\377\377\377XQe\202\363\365\3675Mon\177\230\221\236\261DZz\376\376\376" \ + "\205\223\250at\216\247\261\300Mb\200DZz\325\332\341l~\226\377\377\377" \ + "\362\364\366Qe\202\342\345\352Ym\211z\211\240\267\300\314hz\223o\200" \ + "\230\266\276\313-Fi\252\264\303Xk\207\354\357\362|\214\242fx\222\246" \ + "\260\277H^|Nc\201\321\327\337r\202\232\377\377\377\366\316\315\360\260" \ + "\257\206t\207Y[v\236\202\220MTq;Jj\321\236\243&>chc|\232\200\217<Kk\277" \ + "\224\234\220z\213,Be\213w\211\205t\207@Mm\350\254\254UYt\335\245\250" \ + "BNm\360\260\257^^xzn\202\221z\213>Ll\343\251\252\244\205\222IRp\236\202" \ + "\220Z\\v&>b\313\233\241FPo\226}\215}o\204\265\217\231\237\212\231Xk\207" \ + "\251\263\302Rg\204\256\267\305\264\275\311/Gj\233\246\267[n\212\236\252" \ + "\272\316\324\334hz\223l~\226\326\333\342\300\377\377\377\2\373\373\373" \ + ",./\202\23\25\26\6)/1\30\32\34\23\25\26tx|\352\353\355\376\376\376\233" \ + "\377\377\377\7\375\375\375\356\356\357\303\304\307\236\241\244\233\236" \ + "\242\333\335\337245\203\23\25\26\3+0339<\32\35\37\206\23\25\26\1<H=\222" \ + "\260\330\254\4r\224\213u\230\215{\236\220b\202\203\202\260\330\254\5" \ + "Ut|\212\256\2306Rl\242\311\245\320\350\316\202\377\377\3773Qe\202\363" \ + "\365\3672Jm\350\353\357\377\377\377E[z\347\352\356:Qr\370\371\372\377" \ + "\377\377\333\337\345DZz\325\332\341l~\226\377\377\377\362\364\366Qe\202" \ + "\332\336\345DZy\322\330\337\377\377\377\233\247\270\247\261\300\275\304" \ + "\320n\177\230\377\377\377Xk\207\345\350\355<St\372\373\374\377\377\377" \ + "\322\330\337Nc\201\321\327\337r\202\232\377\377\377\365\312\312\357\252" \ + "\251:Ii\346\245\246\357\252\251\326\234\240;Ij\320\231\236BMl\356\251" \ + "\251\357\252\251\265\213\225haz\217w\207\200n\202\202\357\252\251\7u" \ + "h~\250\204\220TWs\334\240\242BMl\317\231\236BMl\202\357\252\251\31\305" \ + "\224\232\325\234\240LSp\322\233\237\357\252\251\347\245\246/Ce\353\250" \ + "\247a^w\320\231\236}m\201\265\213\224DQo\355\357\362\377\377\377\345" \ + "\350\355Nc\201\264\275\311fx\222\377\377\377\307\316\327gy\223\307\316" \ + "\327Nc\201\334\340\346\301\377\377\377\1\267\267\270\202\23\25\26\2$" \ + ")+069\202\23\25\26\2\325\327\331\375\375\375\236\377\377\377\5\371\371" \ + "\371\313\314\317\247\251\255\271\273\276\324\325\330\204\23\25\26\2\33" \ + "\40\"\34\37!\207\23\25\26\1\211\253\210\221\253\326\250\4o\222\211s\227" \ + "\213n\221\210p\224\211\202\253\326\250\5b\204\202|\242\2206Rk\253\326" \ + "\250\315\347\313\202\377\377\377\3Qe\202\363\365\367=Tu\202\377\377\377" \ + "\3at\216\324\331\340E[z\202\377\377\377\23\371\371\373E[z\326\333\342" \ + "ew\221\377\377\377\356\360\363Qe\202\377\377\377\272\302\316DZz\312\320" \ + "\331\233\247\270\247\261\300\275\304\320\205\223\250\377\377\377Xk\207" \ + "\331\336\344Nc\201\202\377\377\377\10\361\362\365Nc\201\321\327\337r" \ + "\202\232\377\377\377\365\307\307\353\243\243=Jj\202\357\245\244\4\355" \ + "\244\243\77Kj\320\225\232ZYs\202\357\245\244\4\321\225\232XWs\217t\205" \ + "\233z\210\202\357\245\244\7\220t\205\227x\207TVq\334\233\236BLk\300\215" \ + "\225iax\204\357\245\244\2\77Kj\352\242\242\202\357\245\244\7ALk\353\243" \ + "\243a\\u\320\225\232}j\177\265\207\221;Kk\202\377\377\377\13\374\374" \ + "\375AWw\264\275\311\210\226\252\377\377\377\343\346\353^q\214\377\377" \ + "\377\255\267\304@Ww\332\336\345\300\377\377\377\10Y[\\\23\25\26\25\27" \ + "\30""39<%)+\23\25\26\205\211\214\373\373\373\240\377\377\377\13\373\373" \ + "\373\327\330\333\311\312\315\353\353\355\23\26\27\23\25\26\40$%*/1\"" \ + "')\23\25\26\34\37!\206\23\25\26\1\77N@\221\246\324\242\13l\221\205p\225" \ + "\207\212\264\224\77^o\241\316\240\235\312\2368Ul\227\302\2325Rj\246\324" \ + "\242\312\346\307\202\377\377\377\3Qe\202\363\365\367BXx\202\377\377\377" \ + "Sat\216\337\343\350Ka\177\310\316\330\377\377\377\240\253\273DZz\355" \ + "\357\362:Qr\372\373\374\271\301\315Qe\202\275\305\320\267\300\314\256" \ + "\267\305\234\250\271\233\247\270\247\261\300\275\304\320\205\223\250" \ + "\377\377\377Xk\207\354\357\362DZz\317\325\335\377\377\377\226\243\264" \ + "Nc\201\321\327\337r\202\232\377\377\377\365\303\303\356\237\236ORo\264" \ + "\203\215\356\237\236\236x\206;Hh\317\220\225)\77c\315\217\224\356\237" \ + "\236~i|\205l\177\217q\202ORn\347\234\234\344\232\233HNl\305\213\222T" \ + "Tp\333\226\230BKj\343\232\233>Ii\330\224\227\353\236\235e\\u\307\214" \ + "\222l`w\227u\204\356\237\236\271\205\216\"<a\352\235\235`Zt\317\220\225" \ + "|h|\264\203\215daz\263\274\311\377\377\377\251\263\302u\205\235\264\275" \ + "\311\216\233\256\377\377\377\343\346\353^q\214\255\267\304\310\316\330" \ + "\231\245\266\261\272\310\277\377\377\377\10\345\345\345\26\30\31\23\25" \ + "\26'-.4:=\23\25\26\23\26\27\356\357\360\242\377\377\377\13\375\375\375" \ + "\355\356\357\354\354\356\255\257\262\23\25\26(-/-24+02\25\30\31""28;" \ + "\40$&\205\23\25\26\2\24\26\27\206\256\203\220\241\322\235\13i\220\203" \ + "m\224\204\241\322\235`\205~,Hf+Gem\225\205\241\322\2354Rj\241\322\235" \ + "\307\344\304\202\377\377\377\3Qe\202\363\365\367BXx\202\377\377\377\3" \ + "at\216\337\343\350\323\330\340\202>Uu\5at\216DZz\377\377\377|\214\242" \ + "3Km\202Qe\202G\351\354\3578Pq<St\340\344\351\233\247\270\247\261\300" \ + "\275\304\320\205\223\250\377\377\377Xk\207\354\357\362\315\323\333;R" \ + "s=Tuat\216Nc\201\321\327\337r\202\232\377\377\377\364\300\300\355\232" \ + "\231\311\211\217>Ii<HhZVq=Hh\316\214\221BKj@Ji:GgSSo\341\225\226\216" \ + "n\177VTo7Fg1Ce\205j|\355\232\231TSo\332\221\224BKj\355\232\231\252{\207" \ + "2Ce0Besaw\355\232\231\331\220\223JOl;HhLOm6Ef\351\230\230`Yr\316\214" \ + "\221|fz\263\177\211\326\236\242E[z;RsLa\177\352\354\360\264\275\311\216" \ + "\233\256\377\377\377\343\346\353^q\214\332\336\3457Np=Tu\357\361\364" \ + "\277\377\377\377\10\217\220\220\23\25\26\25\27\30""3:<+14\23\25\26\241" \ + "\243\246\375\375\375\244\377\377\377\11\376\376\376\361\361\362\23\25" \ + "\26'*,,13).0\23\25\26:ADEKO\206\23\25\26\1BVB\224\235\320\227\2\226\310" \ + "\224\230\312\225\204\235\320\227\1\304\343\301\213\377\377\377\1\361" \ + "\362\365\204\377\377\377\1\361\362\365\203\377\377\377\202\365\366\370" \ + "\211\377\377\377\2\376\376\376\362\363\366\205\377\377\377\1\364\275" \ + "\274\203\354\225\223\1\337\217\220\202\354\225\223\4\315\207\213_Wp\353" \ + "\224\223\334\216\217\202\354\225\223\4\216k|\236r\200\345\222\221\342" \ + "\221\221\207\354\225\223\2\347\223\222\334\216\217\204\354\225\223\1" \ + "\336\217\220\207\354\225\223\3\360\251\247\377\377\377\352\354\360\210" \ + "\377\377\377\2\362\364\366\370\371\372\300\377\377\377\7""8:;\23\25\26" \ + "\"&(4;=\23\25\26\24\26\27\357\357\357\246\377\377\377\1\371\371\372\202" \ + "\23\25\26\1\34\40!\203\23\25\26\2KQT\23\25\27\205\23\25\26\2\27\33\32" \ + "\221\303\214\231\231\316\223\1\302\342\276\246\377\377\377\1\363\272" \ + "\270\206\353\220\215\2\323\206\210}bu\204\353\220\215\2\242q}\256w\200" \ + "\227\353\220\215\1\357\245\243\271\377\377\377\3\340\341\341\353\353" \ + "\353\374\374\374\205\377\377\377\3\364\364\364\350\351\351\373\373\373" \ + "\207\377\377\377\1\314\314\314\202\23\25\26\5,2527:\23\25\26\201\205" \ + "\210\373\373\373\246\377\377\377\2\375\375\375)+,\205\23\25\26\2JPT-" \ + "25\206\23\25\26\1f\212c\231\225\314\216\1\300\341\273\246\377\377\377" \ + "\1\362\267\265\245\352\213\210\1\356\241\237\270\377\377\377\6Z\\`02" \ + "5-/28;>npr\360\360\360\202\377\377\377\5ORT>AF8;\77""024\353\353\354" \ + "\206\377\377\377\10qss\23\25\26\27\32\33+13\32\36\40\23\25\26\332\333" \ + "\335\376\376\376\246\377\377\377\2\376\376\376\303\306\310\205\23\25" \ + "\26\2GNQ7>A\206\23\25\26\1""9L9\231\220\312\211\1\275\340\270\246\377" \ + "\377\377\1\362\263\262\245\351\205\203\1\356\234\232\266\377\377\377" \ + "\17\256\257\2617:\77VZe\207\210\212\276\277\300>@D\203\213\237jmr\347" \ + "\347\347;=Amu\210HKO\203\205\211\224\225\227RTU\205\377\377\377\10\347" \ + "\350\350\33\35\36\23\25\26\33\35\37#&(\23\25\26\26\30\31\365\366\366" \ + "\215\377\377\377\1\372\372\372\232\377\377\377\1\354\355\356\205\23\25" \ + "\26\2:AD4:=\206\23\25\26\2\26\32\31\205\276~\230\215\311\205\1\273\337" \ + "\266\246\377\377\377\1\362\260\256\245\351\200}\1\356\230\226\265\377" \ + "\377\377\4\267\267\270lp{QVd\300\301\303\203\377\377\377\7<\77B\203\214" \ + "\244.15\233\245\303)+-\277\277\300\343\343\343\207\377\377\377\1}~~\202" \ + "\23\25\26\202\26\31\32\3\23\25\26egk\373\373\374\214\377\377\377\2\371" \ + "\371\371\325\326\331\232\377\377\377\1\363\363\364\205\23\25\26\2).1" \ + "*02\207\23\25\26\1]\205X\230\211\307\177\1\270\336\262\246\377\377\377" \ + "\1\361\254\252\245\350zw\1\355\223\221\265\377\377\377\4TVY\215\227\262" \ + ";>C\374\374\374\203\377\377\377\7\201\202\204MR``fx;>C\266\267\267\33" \ + "\35\37\345\346\351\206\377\377\377\5\354\354\354\36\40!\23\25\26\24\26" \ + "\30\32\35\36\202\23\25\26\2\302\303\306\376\376\376\214\377\377\377\2" \ + "\340\341\344\257\261\265\232\377\377\377\1\366\366\367\205\23\25\26\2" \ + "\34\37!\40#%\207\23\25\26\1:R8\230\204\305z\1\265\335\257\246\377\377" \ + "\377\1\360\250\247\245\347tq\1\354\216\214\237\377\377\377\2\345\345" \ + "\344\357\356\356\213\377\377\377\2\327\326\325\316\314\314\207\377\377" \ + "\377\3=\77C\222\233\267HJO\204\377\377\377\10\307\310\31003:ho\202MP" \ + "T\377\377\377~\200\203036\374\374\374\205\377\377\377\1\202\203\204\202" \ + "\23\25\26\2\33\36\40""5<>\202\23\25\26\1\355\355\356\215\377\377\377" \ + "\2\304\306\311\241\244\247\232\377\377\377\1\370\371\371\206\23\25\26" \ + "\1\25\27\31\207\23\25\26\1#.$\230\200\303v\1\263\333\255\246\377\377" \ + "\377\1\360\246\244\245\346pm\1\353\213\211\236\377\377\377\3\334\334" \ + "\333742\354\354\353\213\377\377\377\2FB@.*'\206\377\377\377\4\373\373" \ + "\373\77AE\217\230\264MOS\204\377\377\377\10\316\316\316.17ho\202OQU\377" \ + "\377\377\204\206\2108;@\347\347\347\204\377\377\377\2\345\345\345\34" \ + "\36\37\202\23\25\26\2#'*ELO\202\23\25\26\1\365\366\367\215\377\377\377" \ + "\2\254\257\263\237\242\246\232\377\377\377\1\372\372\373\205\23\25\26" \ + "\2$)+\30\33\34\207\23\25\26\2\23\26\26v\267m\227|\301s\1\261\332\253" \ + "\246\377\377\377\1\357\242\240\245\345jg\1\352\206\204\236\377\377\377" \ + "\32\316\315\315($\"853jgfMJH@=<nlk\214\213\213>;9QML\222\223\223VSR\345" \ + "\345\344NKJkjkNLL\377\377\377\321\321\322842][Y\245\244\244DA@da_X[^" \ + "\210\221\253<\77D\204\377\377\377\7\247\247\250>BLhn\202=@D\361\361\361" \ + "=@Cjlp\205\377\377\377\1nop\203\23\25\26\5+12HOR\23\25\26\25\30\31\371" \ + "\371\372\215\377\377\377\2\244\247\252\241\244\250\232\377\377\377\1" \ + "\373\373\373\205\23\25\26\2<CF\32\35\37\210\23\25\26\1g\243_\227x\277" \ + "n\1\256\331\250\246\377\377\377\1\356\236\235\245\343db\1\351\201\200" \ + "\236\377\377\377\33\316\315\315+'%952-*(A\77>kih732+(&62151/531BAA=:" \ + "7:76A=;:76\373\373\373;98WUT421.*(842520\264\265\266Z^kDHR\333\333\334" \ + "\203\377\377\377\6CEI\226\240\275(+0ek{;=>[]`\205\377\377\377\2\344\344" \ + "\344\26\30\31\203\23\25\26\5-36IOR\23\25\26""267\373\373\374\215\377" \ + "\377\377\2\241\244\250\243\246\251\232\377\377\377\1\372\372\373\205" \ + "\23\25\26\1SY]\211\23\25\26\1\\\224U\227s\275i\1\253\330\245\246\377" \ + "\377\377\1\355\233\231\245\342_\\\1\350}{\236\377\377\377'\316\314\314" \ + "CBA\236\235\235*%#A\77>\263\263\263/-+EA\77\77==($\"'#!LJH620853GDBL" \ + "IH\333\332\331B@\77\223\221\220.+)0,*\233\231\227520\356\356\355\212" \ + "\214\220\177\206\232NQW\340\340\340\371\371\371\177\200\202|\203\226" \ + "8;@\334\335\33758>w}\216|~\202\321\322\322\336\337\337\222\223\223\202" \ + "\377\377\377\1\246\247\247\204\23\25\26\5$)+GMQ\23\25\26ilo\375\375\375" \ + "\215\377\377\377\2\236\241\245\246\251\254\232\377\377\377\1\371\371" \ + "\372\204\23\25\26\2)/1Y_c\211\23\25\26\1W\220P\227o\274e\1\251\327\243" \ + "\246\377\377\377\1\355\230\226\245\342ZW\1\350yw\237\377\377\377&YVT" \ + "1.,\207\206\206\237\237\240DCC;75=;951/\353\355\356LKJ742\234\232\230" \ + "\\[[621\217\215\213\377\377\377\267\266\26641/YWVLJH\233\231\227XVU\356" \ + "\356\355\377\377\377}\177\200:=A/15+.1PT\\CEH\377\377\377\364\364\364" \ + "\245\246\247>AEKOZ7;BRV\\\246\250\254\202\377\377\377\1\207\210\210\204" \ + "\23\25\26\5\32\34\35ELO;BE\177\203\206\374\374\374\215\377\377\377\2" \ + "\235\240\244\251\254\257\232\377\377\377\2\371\371\372\25\27\30\203\23" \ + "\25\26\2W^a>DH\211\23\25\26\1]\240U\227k\272a\1\246\326\240\246\377\377" \ + "\377\1\355\226\223\245\341VR\1\347vs\240\377\377\377\1\370\367\367\202" \ + "\377\377\377\1\362\360\360\203\376\376\376\202\377\377\377\1\366\366" \ + "\365\202\377\377\377\1\366\366\365\203\377\377\377\5\370\367\367\373" \ + "\373\373\376\376\376\353\353\353\376\376\376\203\377\377\377\4\361\361" \ + "\361\270\270\270\252\252\253\334\335\335\204\377\377\377\4\372\372\372" \ + "\270\270\270\246\247\247\325\325\326\203\377\377\377\1\265\265\266\205" \ + "\23\25\26\4""39<HORqvy\374\374\374\215\377\377\377\2\233\236\242\254" \ + "\257\262\232\377\377\377\2\371\371\372\24\26\27\203\23\25\26\1FLO\211" \ + "\23\25\26\2\23\26\26b\261Y\227f\271]\1\243\325\236\246\377\377\377\1" \ + "\355\223\220\245\341QM\1\347rn\233\377\377\377\1\363\362\362\253\347" \ + "\346\346\1\331\331\331\202WXX\7\256\226U\324\265P\206wUXYZtwyimo\345" \ + "\344\345\215\347\346\346\2\252\254\256\262\264\266\232\347\346\346\1" \ + "\342\342\343\202WXX\10\177\202\205\202\205\207{~\201WXXptvwz}vy{jno\204" \ + "WXX\1boa\230\207\272\201\1\255\314\251\246\347\346\346\1\333\243\241" \ + "\245\324zw\1\327\216\213\224\347\346\346\1\350\347\347\206\377\377\377" \ + "\1\340\340\340\377\302\301\301\351\302\301\301\12\304\303\303\377\377" \ + "\377\371\371\371\311\310\307\270\266\266\351\351\350\377\377\377\340" \ + "\340\340\302\301\301\305\304\304\254\320\317\317\1\314\313\313\377\302" \ + "\301\301\272\302\301\301\12\304\303\303\370\370\370\221\217\216\265\264" \ + "\263\317\316\316\237\235\235\324\323\323\340\340\340\302\301\301\322" \ + "\321\321\254\377\377\377\1\362\317\315\377\323PK\270\323PK\14\306\240" \ + "\237\302\301\301\304\303\303\275\273\273\322\321\321\203\201\200\226" \ + "\224\223\325\324\324\235\232\232\340\340\340\302\301\301\322\321\321" \ + "\254\377\377\377\1\364\303\301\377\332%\35\270\332%\35\14\310\223\221" \ + "\302\301\301\304\303\303\243\241\240\355\355\355urrxtt\367\367\367\236" \ + "\234\233\340\340\340\302\301\301\322\321\321\254\377\377\377\1\364\303" \ + "\301\377\332%\35\270\332%\35\14\310\223\221\302\301\301\304\303\303\321" \ + "\320\320\262\261\260\260\256\255\276\274\274\307\306\306\235\233\233" \ + "\340\340\340\302\301\301\322\321\321\254\377\377\377\1\364\303\301\310" \ + "\332%\35\212\333(\40\1\333&\36\206\332%\35\1\333'\37\211\333(\40\324" \ + "\332%\35\14\310\223\221\302\301\301\304\303\303\377\377\377\264\262\262" \ + "\237\235\234\247\245\245\227\225\224\364\364\364\340\340\340\302\301" \ + "\301\322\321\321\254\377\377\377\1\364\303\301\307\332%\35\1\334.&\212" \ + "\377\377\377\1\341KE\206\332%\35\1\364\274\271\210\377\377\377\1\377" \ + "\373\373\230\332%\35\3\333&\36\334.&\333&\36\271\332%\35\3\310\223\221" \ + "\302\301\301\304\303\303\202\377\377\377\2\375\375\375\366\366\366\202" \ + "\377\377\377\3\340\340\340\302\301\301\322\321\321\204\377\377\377\1" \ + "\375\363\363\207\367\317\316\1\376\370\367\222\377\377\377\1\374\353" \ + "\352\210\367\317\316\1\374\351\350\203\377\377\377\1\364\303\301\307" \ + "\332%\35\1\334.&\212\377\377\377\1\341KE\206\332%\35\1\364\274\271\210" \ + "\377\377\377\1\377\373\373\222\332%\35\17\3352*\346hb\357\241\236\366" \ + "\312\310\371\333\332\374\355\354\377\374\374\377\377\377\377\372\372" \ + "\374\351\350\371\330\327\366\307\305\357\234\230\345d^\334.&\232\332" \ + "%\35\20\333*\"\342SM\352\200{\361\253\250\367\313\311\371\332\330\373" \ + "\347\347\375\363\362\374\355\354\373\342\341\371\330\327\366\310\306" \ + "\360\246\243\353\206\202\345f`\336:3\211\332%\35\3\310\223\221\302\301" \ + "\301\304\303\303\206\377\377\377\3\340\340\340\302\301\301\322\321\321" \ + "\204\377\377\377\1\366\312\310\207\332%\35\1\372\335\334\221\377\377" \ + "\377\2\373\344\343\337>6\207\332%\35\2\342QK\375\362\361\203\377\377" \ + "\377\1\364\303\301\307\332%\35\1\334.&\212\377\377\377\1\341KE\206\332" \ + "%\35\1\364\274\271\210\377\377\377\1\377\373\373\217\332%\35\4\333'\37" \ + "\350tn\367\317\315\377\374\374\215\377\377\377\4\377\372\372\366\311" \ + "\307\346id\333&\36\225\332%\35\3\342SM\360\243\237\375\357\357\217\377" \ + "\377\377\4\372\337\336\361\253\250\347rm\334/'\205\332%\35\3\310\223" \ + "\221\302\301\301\304\303\303\206\377\377\377\3\340\340\340\302\301\301" \ + "\322\321\321\204\377\377\377\1\366\312\310\207\332%\35\1\372\335\334" \ + "\220\377\377\377\2\374\352\351\340D=\207\332%\35\2\342PJ\375\361\360" \ + "\204\377\377\377\1\364\303\301\307\332%\35\1\334.&\212\377\377\377\1" \ + "\341KE\206\332%\35\1\364\274\271\210\377\377\377\1\377\373\373\215\332" \ + "%\35\3\333&\36\347rm\372\336\335\223\377\377\377\3\370\325\324\346id" \ + "\333&\36\221\332%\35\2\341KE\366\307\305\225\377\377\377\3\376\366\366" \ + "\362\262\257\341JC\203\332%\35\3\310\223\221\302\301\301\304\303\303" \ + "\206\377\377\377\3\340\340\340\302\301\301\322\321\321\204\377\377\377" \ + "\1\366\312\310\207\332%\35\1\372\335\334\217\377\377\377\2\375\356\356" \ + "\341JC\207\332%\35\2\341OH\375\360\357\205\377\377\377\1\364\303\301" \ + "\307\332%\35\1\334.&\212\377\377\377\1\341KE\206\332%\35\1\364\274\271" \ + "\210\377\377\377\1\377\373\373\214\332%\35\2\3355.\366\307\305\227\377" \ + "\377\377\2\364\275\273\3341)\216\332%\35\3\333)!\357\240\235\377\375" \ + "\375\230\377\377\377\1\352\203~\203\332%\35\3\310\223\221\302\301\301" \ + "\304\303\303\206\377\377\377\3\340\340\340\302\301\301\322\321\321\204" \ + "\377\377\377\1\366\312\310\207\332%\35\1\372\335\334\216\377\377\377" \ + "\2\375\363\362\342PI\207\332%\35\2\341NG\375\357\357\206\377\377\377" \ + "\1\364\303\301\307\332%\35\1\334.&\212\377\377\377\1\341KE\206\332%\35" \ + "\1\364\274\271\210\377\377\377\1\377\373\373\213\332%\35\2\340HA\372" \ + "\341\337\231\377\377\377\2\371\333\331\337B;\214\332%\35\2\3352+\366" \ + "\306\304\232\377\377\377\1\352\203~\203\332%\35\3\310\223\221\302\301" \ + "\301\304\303\303\206\377\377\377\3\340\340\340\302\301\301\322\321\321" \ + "\204\377\377\377\1\366\312\310\207\332%\35\1\372\335\334\215\377\377" \ + "\377\2\376\366\366\343XR\207\332%\35\2\341MF\375\357\357\207\377\377" \ + "\377\1\364\303\301\307\332%\35\1\334.&\212\377\377\377\1\341KE\206\332" \ + "%\35\1\364\274\271\210\377\377\377\1\377\373\373\212\332%\35\2\343UN" \ + "\375\363\362\233\377\377\377\2\375\357\357\341LF\212\332%\35\2\334.&" \ + "\371\331\327\233\377\377\377\1\352\203~\203\332%\35\3\310\223\221\302" \ + "\301\301\304\303\303\206\377\377\377\3\340\340\340\302\301\301\322\321" \ + "\321\204\377\377\377\1\366\312\310\207\332%\35\1\372\335\334\214\377" \ + "\377\377\2\376\371\370\344_Y\207\332%\35\2\341KE\374\355\355\210\377" \ + "\377\377\1\364\303\301\307\332%\35\1\333&\36\212\341NG\1\334,%\206\332" \ + "%\35\1\364\274\271\210\377\377\377\1\377\373\373\211\332%\35\2\33680" \ + "\373\347\347\235\377\377\377\2\372\341\340\3352+\211\332%\35\1\361\253" \ + "\247\234\377\377\377\1\352\203~\203\332%\35\3\310\223\221\302\301\301" \ + "\304\303\303\206\377\377\377\3\340\340\340\302\301\301\322\321\321\204" \ + "\377\377\377\1\366\312\310\207\332%\35\1\372\335\334\213\377\377\377" \ + "\2\377\373\373\346hb\207\332%\35\2\341JD\374\355\355\211\377\377\377" \ + "\1\364\303\301\331\332%\35\1\364\274\271\210\377\377\377\1\377\373\373" \ + "\210\332%\35\2\333'\37\366\307\305\214\377\377\377\7\372\336\335\357" \ + "\240\235\352\203~\350up\353\205\200\361\250\245\374\351\350\214\377\377" \ + "\377\2\364\276\274\333&\36\207\332%\35\1\345b\\\213\377\377\377\13\377" \ + "\374\374\366\311\307\353\207\203\346kf\343ZT\343VO\346id\352~y\356\230" \ + "\224\367\317\316\377\375\375\207\377\377\377\1\352\203~\203\332%\35\3" \ + "\310\223\221\302\301\301\304\303\303\206\377\377\377\3\340\340\340\302" \ + "\301\301\322\321\321\204\377\377\377\1\366\312\310\207\332%\35\1\372" \ + "\335\334\212\377\377\377\2\377\376\376\347ql\207\332%\35\2\340IB\374" \ + "\355\354\212\377\377\377\1\364\303\301\331\332%\35\1\364\274\271\210" \ + "\377\377\377\1\377\373\373\210\332%\35\1\354\215\211\213\377\377\377" \ + "\2\373\342\341\345f`\206\332%\35\3\333&\36\350up\374\351\350\213\377" \ + "\377\377\1\353\204\177\207\332%\35\1\364\274\271\212\377\377\377\2\367" \ + "\316\314\337\77""8\211\332%\35\3\3357/\350to\366\311\307\205\377\377" \ + "\377\1\352\203~\203\332%\35\3\310\223\221\302\301\301\304\303\303\206" \ + "\377\377\377\3\340\340\340\302\301\301\322\321\321\204\377\377\377\1" \ + "\366\312\310\207\332%\35\1\372\335\334\212\377\377\377\1\351zv\207\332" \ + "%\35\2\340IB\374\354\353\213\377\377\377\1\364\303\301\212\332%\35\14" \ + "\333(\40\337@9\344[U\346kf\350up\352\200{\352\201}\351yt\347ni\345e_" \ + "\341NG\334-&\232\332%\35\4\3354-\344]W\347ni\352\200{\202\354\217\213" \ + "\4\352\200{\347pk\343YS\334,%\237\332%\35\1\364\274\271\210\377\377\377" \ + "\1\377\373\373\207\332%\35\2\3340(\375\361\360\212\377\377\377\2\370" \ + "\323\321\3355.\211\332%\35\2\33681\371\332\330\212\377\377\377\2\374" \ + "\352\351\334,$\205\332%\35\2\33680\377\374\374\211\377\377\377\2\364" \ + "\275\273\333(\40\215\332%\35\2\343WQ\364\276\274\203\377\377\377\1\352" \ + "\203~\203\332%\35\3\310\223\221\302\301\301\304\303\303\206\377\377\377" \ + "\3\340\340\340\302\301\301\322\321\321\204\377\377\377\1\366\312\310" \ + "\207\332%\35\1\372\335\334\211\377\377\377\1\353\206\201\207\332%\35" \ + "\2\340G@\374\353\352\214\377\377\377\1\364\303\301\205\332%\35\6\335" \ + "2+\344]W\354\212\206\363\266\263\373\342\341\377\375\375\212\377\377" \ + "\377\5\377\376\376\373\346\345\363\267\264\350up\3357/\223\332%\35\4" \ + "\342TN\357\237\234\371\326\325\377\376\376\210\377\377\377\4\377\372" \ + "\372\367\316\314\354\212\206\3352*\213\332%\35\1\353\210\204\210\360" \ + "\246\243\1\356\231\226\207\332%\35\1\364\274\271\210\377\377\377\1\377" \ + "\373\373\207\332%\35\1\353\211\205\212\377\377\377\2\373\343\342\335" \ + "2*\213\332%\35\2\3356.\373\347\347\212\377\377\377\1\352\177z\205\332" \ + "%\35\1\344^X\212\377\377\377\1\342RL\220\332%\35\4\345b\\\373\347\346" \ + "\377\377\377\352\203~\203\332%\35\3\310\223\221\302\301\301\304\303\303" \ + "\206\377\377\377\3\340\340\340\302\301\301\322\321\321\204\377\377\377" \ + "\1\366\312\310\207\332%\35\1\372\335\334\210\377\377\377\1\354\217\213" \ + "\207\332%\35\2\340F\77\374\352\351\215\377\377\377\1\364\303\301\205" \ + "\332%\35\1\376\370\367\223\377\377\377\3\377\373\373\360\246\243\336" \ + ":3\217\332%\35\2\344^X\366\307\305\217\377\377\377\3\375\363\362\355" \ + "\223\217\333)!\211\332%\35\1\367\315\313\210\377\377\377\1\374\352\351" \ + "\207\332%\35\1\364\274\271\210\377\377\377\1\377\373\373\206\332%\35" \ + "\2\334,$\374\352\351\212\377\377\377\1\344`Z\215\332%\35\1\346je\212" \ + "\377\377\377\2\373\343\342\333(\40\204\332%\35\1\350xs\212\377\377\377" \ + "\1\340D>\221\332%\35\3\3352*\357\234\230\345b\\\203\332%\35\3\310\223" \ + "\221\302\301\301\304\303\303\206\377\377\377\3\340\340\340\302\301\301" \ + "\322\321\321\204\377\377\377\1\366\312\310\207\332%\35\1\372\335\334" \ + "\207\377\377\377\1\356\232\227\207\332%\35\2\340E>\374\351\350\216\377" \ + "\377\377\1\364\303\301\205\332%\35\1\376\370\367\225\377\377\377\2\376" \ + "\365\365\345d^\214\332%\35\2\333*\"\360\245\241\223\377\377\377\2\367" \ + "\314\312\33692\210\332%\35\1\367\315\313\210\377\377\377\1\374\352\351" \ + "\207\332%\35\1\364\274\271\210\377\377\377\1\377\373\373\206\332%\35" \ + "\1\345b]\212\377\377\377\1\365\304\302\217\332%\35\1\367\316\314\212" \ + "\377\377\377\1\343VP\204\332%\35\1\354\212\206\212\377\377\377\1\351" \ + "}x\227\332%\35\3\310\223\221\302\301\301\304\303\303\206\377\377\377" \ + "\3\340\340\340\302\301\301\322\321\321\204\377\377\377\1\366\312\310" \ + "\207\332%\35\1\372\335\334\206\377\377\377\1\360\245\241\207\332%\35" \ + "\2\340D=\374\350\347\217\377\377\377\1\364\303\301\205\332%\35\1\376" \ + "\370\367\226\377\377\377\2\377\374\374\347mg\212\332%\35\2\33692\367" \ + "\317\315\225\377\377\377\2\373\343\342\3355.\207\332%\35\1\367\315\313" \ + "\210\377\377\377\1\374\352\351\207\332%\35\1\364\274\271\210\377\377" \ + "\377\1\377\373\373\206\332%\35\1\356\231\225\212\377\377\377\1\347nh" \ + "\217\332%\35\1\350vq\212\377\377\377\1\354\214\210\204\332%\35\1\352" \ + "\177z\212\377\377\377\2\376\365\365\345a[\226\332%\35\3\310\223\221\302" \ + "\301\301\304\303\303\206\377\377\377\3\340\340\340\302\301\301\322\321" \ + "\321\204\377\377\377\1\366\312\310\207\332%\35\1\372\335\334\205\377" \ + "\377\377\2\362\257\254\333&\36\206\332%\35\2\337C<\373\347\347\220\377" \ + "\377\377\1\364\303\301\205\332%\35\1\376\370\367\227\377\377\377\2\375" \ + "\361\360\336:3\210\332%\35\2\334,%\370\323\321\227\377\377\377\2\365" \ + "\301\277\333&\36\206\332%\35\1\367\315\313\210\377\377\377\1\374\352" \ + "\351\207\332%\35\1\364\274\271\210\377\377\377\1\377\373\373\206\332" \ + "%\35\1\367\317\316\211\377\377\377\2\376\364\364\333*\"\217\332%\35\2" \ + "\334-&\376\371\371\211\377\377\377\1\365\303\301\204\332%\35\1\346id" \ + "\214\377\377\377\3\366\311\307\351zv\337>6\223\332%\35\3\310\223\221" \ + "\302\301\301\304\303\303\206\377\377\377\3\340\340\340\302\301\301\322" \ + "\321\321\204\377\377\377\1\366\312\310\207\332%\35\1\372\335\334\204" \ + "\377\377\377\2\363\270\266\333(\40\206\332%\35\2\337B;\373\347\346\221" \ + "\377\377\377\1\364\303\301\205\332%\35\1\376\370\367\230\377\377\377" \ + "\1\361\251\246\207\332%\35\2\333&\36\363\263\260\211\377\377\377\6\374" \ + "\351\350\364\271\267\355\225\221\353\211\205\361\253\250\370\325\324" \ + "\212\377\377\377\1\351zu\206\332%\35\1\367\315\313\210\377\377\377\1" \ + "\374\352\351\207\332%\35\1\364\274\271\210\377\377\377\1\377\373\373" \ + "\205\332%\35\2\334/'\377\373\373\211\377\377\377\1\366\310\306\221\332" \ + "%\35\1\370\321\317\211\377\377\377\2\376\366\366\333)!\203\332%\35\1" \ + "\336;4\217\377\377\377\5\372\334\333\361\252\247\351zv\341JD\333&\36" \ + "\216\332%\35\3\310\223\221\302\301\301\304\303\303\206\377\377\377\3" \ + "\340\340\340\302\301\301\322\321\321\204\377\377\377\1\366\312\310\207" \ + "\332%\35\1\372\335\334\203\377\377\377\2\365\300\276\333*\"\206\332%" \ + "\35\2\337A:\373\346\345\222\377\377\377\1\364\303\301\205\332%\35\1\376" \ + "\370\367\203\377\377\377\13\375\360\357\363\265\262\355\223\217\347r" \ + "m\342QK\336;4\340G@\343VP\346je\357\241\236\372\341\340\212\377\377\377" \ + "\2\375\357\357\333(\40\206\332%\35\1\350sn\210\377\377\377\3\377\374" \ + "\374\354\212\206\333*\"\205\332%\35\2\345c^\375\363\362\210\377\377\377" \ + "\2\372\336\335\333&\36\205\332%\35\1\367\315\313\210\377\377\377\1\374" \ + "\352\351\207\332%\35\1\364\274\271\210\377\377\377\1\377\373\373\205" \ + "\332%\35\1\341KE\212\377\377\377\1\356\231\226\221\332%\35\1\360\243" \ + "\237\212\377\377\377\1\337>7\204\332%\35\1\371\327\326\222\377\377\377" \ + "\4\375\362\361\363\267\265\351zv\336=6\213\332%\35\3\310\223\221\302" \ + "\301\301\304\303\303\206\377\377\377\3\340\340\340\302\301\301\322\321" \ + "\321\204\377\377\377\1\366\312\310\207\332%\35\1\372\335\334\202\377" \ + "\377\377\2\366\311\307\334,%\206\332%\35\2\337@9\373\345\344\223\377" \ + "\377\377\1\364\303\301\205\332%\35\5\376\370\367\375\363\362\362\257" \ + "\254\345f`\333*\"\212\332%\35\2\347ni\377\372\372\211\377\377\377\1\343" \ + "WQ\205\332%\35\2\333'\37\372\336\335\210\377\377\377\1\354\215\211\210" \ + "\332%\35\1\351zv\211\377\377\377\1\345f`\205\332%\35\1\367\315\313\210" \ + "\377\377\377\1\374\352\351\207\332%\35\1\364\274\271\210\377\377\377" \ + "\1\377\373\373\205\332%\35\1\344\\V\212\377\377\377\1\350wr\221\332%" \ + "\35\1\352\202~\212\377\377\377\1\341OH\204\332%\35\1\352~y\226\377\377" \ + "\377\3\371\326\325\351yt\333*\"\210\332%\35\3\310\223\221\302\301\301" \ + "\304\303\303\206\377\377\377\3\340\340\340\302\301\301\322\321\321\204" \ + "\377\377\377\1\366\312\310\207\332%\35\4\372\335\334\377\377\377\367" \ + "\320\317\3340(\206\332%\35\2\337\77""8\373\344\343\224\377\377\377\1" \ + "\364\303\301\205\332%\35\2\341KE\334,$\216\332%\35\1\355\224\220\211" \ + "\377\377\377\1\347pk\205\332%\35\1\350sn\210\377\377\377\2\371\326\325" \ + "\333)!\210\332%\35\2\333'\37\372\334\333\210\377\377\377\1\360\243\237" \ + "\205\332%\35\1\367\315\313\210\377\377\377\1\374\352\351\207\332%\35" \ + "\1\364\274\271\210\377\377\377\1\377\373\373\205\332%\35\1\346kf\212" \ + "\377\377\377\1\346id\221\332%\35\1\350to\212\377\377\377\1\344_Y\204" \ + "\332%\35\2\333)!\371\327\326\227\377\377\377\3\374\350\347\353\210\204" \ + "\3340(\206\332%\35\3\310\223\221\302\301\301\304\303\303\206\377\377" \ + "\377\3\340\340\340\302\301\301\322\321\321\204\377\377\377\1\366\312" \ + "\310\207\332%\35\3\372\335\334\371\327\326\3353,\206\332%\35\2\337>7" \ + "\373\342\341\225\377\377\377\1\364\303\301\225\332%\35\1\341MF\211\377" \ + "\377\377\1\353\205\200\205\332%\35\1\365\300\276\210\377\377\377\1\353" \ + "\204\177\212\332%\35\1\357\241\236\210\377\377\377\1\371\327\326\205" \ + "\332%\35\1\367\315\313\210\377\377\377\1\374\352\351\207\332%\35\1\364" \ + "\274\271\210\377\377\377\1\377\373\373\205\332%\35\1\351{v\212\377\377" \ + "\377\1\344\\V\221\332%\35\1\346hb\212\377\377\377\1\347oj\205\332%\35" \ + "\2\341JC\375\360\357\230\377\377\377\2\373\346\345\343ZT\205\332%\35" \ + "\3\310\223\221\302\301\301\304\303\303\206\377\377\377\3\340\340\340" \ + "\302\301\301\322\321\321\204\377\377\377\1\366\312\310\207\332%\35\2" \ + "\364\275\272\33681\206\332%\35\2\3340(\372\341\340\226\377\377\377\1" \ + "\364\303\301\221\332%\35\5\334,$\337@9\343UN\346id\354\212\206\211\377" \ + "\377\377\1\354\214\210\204\332%\35\2\333*\"\376\365\365\210\377\377\377" \ + "\1\343VP\212\332%\35\1\352\200{\210\377\377\377\2\377\376\376\334,$\204" \ + "\332%\35\1\367\315\313\210\377\377\377\1\374\352\351\207\332%\35\1\364" \ + "\274\271\210\377\377\377\1\377\373\373\205\332%\35\1\353\206\201\212" \ + "\377\377\377\1\342TN\221\332%\35\1\344`Z\212\377\377\377\1\351zu\206" \ + "\332%\35\2\342TN\374\352\351\230\377\377\377\2\377\374\374\346lf\204" \ + "\332%\35\3\310\223\221\302\301\301\304\303\303\206\377\377\377\3\340" \ + "\340\340\302\301\301\322\321\321\204\377\377\377\1\366\312\310\207\332" \ + "%\35\2\363\263\260\3341)\207\332%\35\1\355\224\220\226\377\377\377\1" \ + "\364\303\301\212\332%\35\7\333+#\342QK\351|w\360\246\243\366\310\306" \ + "\372\335\334\375\362\361\216\377\377\377\1\354\214\210\204\332%\35\1" \ + "\343ZT\211\377\377\377\1\362\261\256\212\361\252\247\1\365\304\302\211" \ + "\377\377\377\1\336=6\204\332%\35\1\367\315\313\210\377\377\377\1\374" \ + "\352\351\207\332%\35\1\364\274\271\210\377\377\377\1\377\373\373\205" \ + "\332%\35\1\350xs\212\377\377\377\1\344^X\221\332%\35\1\346je\212\377" \ + "\377\377\1\346lf\207\332%\35\2\33680\364\273\270\230\377\377\377\2\377" \ + "\373\373\342TN\203\332%\35\3\310\223\221\302\301\301\304\303\303\206" \ + "\377\377\377\3\340\340\340\302\301\301\322\321\321\204\377\377\377\1" \ + "\366\312\310\207\332%\35\3\372\335\334\366\311\307\334,$\207\332%\35" \ + "\1\357\236\232\225\377\377\377\1\364\303\301\207\332%\35\4\333'\37\345" \ + "a[\362\257\254\376\364\364\224\377\377\377\1\354\214\210\204\332%\35" \ + "\1\351}x\236\377\377\377\1\341KE\204\332%\35\1\367\315\313\210\377\377" \ + "\377\1\374\352\351\207\332%\35\1\364\274\271\210\377\377\377\1\377\373" \ + "\373\205\332%\35\1\346hb\212\377\377\377\1\346je\221\332%\35\1\350up" \ + "\212\377\377\377\1\344\\V\211\332%\35\2\343XR\366\305\303\227\377\377" \ + "\377\2\371\333\332\333'\37\202\332%\35\3\310\223\221\302\301\301\304" \ + "\303\303\206\377\377\377\3\340\340\340\302\301\301\322\321\321\204\377" \ + "\377\377\1\366\312\310\207\332%\35\4\372\335\334\377\377\377\364\273" \ + "\270\333(\40\206\332%\35\2\333&\36\360\247\244\224\377\377\377\1\364" \ + "\303\301\206\332%\35\2\343ZT\371\333\331\227\377\377\377\1\354\214\210" \ + "\204\332%\35\1\354\216\212\236\377\377\377\1\343ZT\204\332%\35\1\367" \ + "\315\313\210\377\377\377\1\374\352\351\207\332%\35\1\364\274\271\210" \ + "\377\377\377\1\377\373\373\205\332%\35\1\343WQ\212\377\377\377\1\350" \ + "xs\221\332%\35\1\352\203~\212\377\377\377\1\341KE\213\332%\35\4\337C" \ + "<\355\223\217\367\316\314\377\374\374\224\377\377\377\1\346hb\202\332" \ + "%\35\3\310\223\221\302\301\301\304\303\303\206\377\377\377\3\340\340" \ + "\340\302\301\301\322\321\321\204\377\377\377\1\366\312\310\207\332%\35" \ + "\1\372\335\334\202\377\377\377\2\361\254\251\333&\36\206\332%\35\2\333" \ + "&\36\362\261\256\223\377\377\377\1\364\303\301\204\332%\35\2\333&\36" \ + "\357\237\234\231\377\377\377\1\354\214\210\204\332%\35\1\357\237\234" \ + "\236\377\377\377\1\344\\V\204\332%\35\1\367\315\313\210\377\377\377\1" \ + "\374\352\351\207\332%\35\1\364\274\271\210\377\377\377\1\377\373\373" \ + "\205\332%\35\1\340G@\212\377\377\377\1\357\235\231\221\332%\35\1\360" \ + "\247\244\212\377\377\377\1\336;4\216\332%\35\5\3340(\345d^\357\236\232" \ + "\370\321\317\377\373\373\220\377\377\377\1\362\261\256\202\332%\35\3" \ + "\310\223\221\302\301\301\304\303\303\206\377\377\377\3\340\340\340\302" \ + "\301\301\322\321\321\204\377\377\377\1\366\312\310\207\332%\35\1\372" \ + "\335\334\203\377\377\377\1\356\233\227\207\332%\35\2\333(\40\364\272" \ + "\267\222\377\377\377\1\364\303\301\204\332%\35\1\356\232\227\232\377" \ + "\377\377\1\354\214\210\204\332%\35\1\361\252\247\236\377\377\377\1\344" \ + "\\V\204\332%\35\1\367\315\313\210\377\377\377\1\374\352\351\207\332%" \ + "\35\1\364\274\271\210\377\377\377\1\377\373\373\205\332%\35\2\333(\40" \ + "\376\364\364\211\377\377\377\1\366\312\310\221\332%\35\1\370\324\322" \ + "\211\377\377\377\2\374\355\355\333&\36\222\332%\35\5\334,%\343XR\353" \ + "\210\204\365\277\275\377\372\372\214\377\377\377\1\372\341\340\202\332" \ + "%\35\3\310\223\221\302\301\301\304\303\303\206\377\377\377\3\340\340" \ + "\340\302\301\301\322\321\321\204\377\377\377\1\366\312\310\207\332%\35" \ + "\1\372\335\334\204\377\377\377\1\354\212\206\207\332%\35\2\333+#\365" \ + "\302\277\221\377\377\377\1\364\303\301\203\332%\35\1\346hb\214\377\377" \ + "\377\6\372\335\334\361\254\251\354\212\206\350tn\344]W\344`Z\211\377" \ + "\377\377\1\354\214\210\204\332%\35\1\356\232\227\211\377\377\377\1\376" \ + "\366\366\224\376\365\365\1\343ZT\204\332%\35\1\367\315\313\210\377\377" \ + "\377\1\374\352\351\207\332%\35\1\364\274\271\210\377\377\377\1\377\373" \ + "\373\206\332%\35\1\365\302\277\211\377\377\377\2\376\366\366\334.&\217" \ + "\332%\35\2\3355.\377\373\373\211\377\377\377\1\363\267\265\227\332%\35" \ + "\3\3353,\356\231\225\377\372\372\212\377\377\377\1\377\373\373\202\332" \ + "%\35\3\310\223\221\302\301\301\304\303\303\206\377\377\377\3\340\340" \ + "\340\302\301\301\322\321\321\204\377\377\377\1\366\312\310\207\332%\35" \ + "\1\372\335\334\205\377\377\377\1\351zu\207\332%\35\2\334-&\366\311\307" \ + "\220\377\377\377\1\364\303\301\203\332%\35\1\367\313\311\211\377\377" \ + "\377\3\373\347\346\351zv\3355.\205\332%\35\1\337C<\211\377\377\377\1" \ + "\354\214\210\204\332%\35\1\353\207\203\211\377\377\377\1\340F\77\231" \ + "\332%\35\1\367\315\313\210\377\377\377\1\374\352\351\207\332%\35\1\364" \ + "\274\271\210\377\377\377\1\377\373\373\206\332%\35\1\354\213\206\212" \ + "\377\377\377\1\351zv\217\332%\35\1\353\206\202\212\377\377\377\1\352" \ + "\200|\231\332%\35\2\345d^\377\375\375\212\377\377\377\5\334.&\332%\35" \ + "\310\223\221\302\301\301\304\303\303\206\377\377\377\3\340\340\340\302" \ + "\301\301\322\321\321\204\377\377\377\1\366\312\310\207\332%\35\1\372" \ + "\335\334\205\377\377\377\2\377\375\375\346id\207\332%\35\2\3340(\367" \ + "\320\317\217\377\377\377\1\364\303\301\202\332%\35\1\341JC\211\377\377" \ + "\377\2\373\347\346\33692\207\332%\35\1\337C<\211\377\377\377\1\354\214" \ + "\210\204\332%\35\1\350to\211\377\377\377\1\346id\231\332%\35\1\367\315" \ + "\313\210\377\377\377\1\374\352\351\207\332%\35\1\364\274\271\210\377" \ + "\377\377\1\377\373\373\206\332%\35\1\342SM\212\377\377\377\2\371\326" \ + "\325\333&\36\215\332%\35\2\333*\"\372\341\340\212\377\377\377\1\341J" \ + "C\204\332%\35\3\354\216\212\353\205\200\333&\36\223\332%\35\1\364\275" \ + "\273\211\377\377\377\6\377\372\372\333&\36\332%\35\310\223\221\302\301" \ + "\301\304\303\303\206\377\377\377\3\340\340\340\302\301\301\322\321\321" \ + "\204\377\377\377\1\366\312\310\207\332%\35\1\372\335\334\206\377\377" \ + "\377\2\376\371\370\344\\V\207\332%\35\2\3353,\371\327\326\216\377\377" \ + "\377\1\364\303\301\202\332%\35\1\347mg\211\377\377\377\1\353\205\200" \ + "\210\332%\35\1\337C<\211\377\377\377\1\354\214\210\204\332%\35\1\340" \ + "F\77\211\377\377\377\1\362\256\253\231\332%\35\1\367\315\313\210\377" \ + "\377\377\1\374\352\351\207\332%\35\1\364\274\271\210\377\377\377\1\377" \ + "\373\373\206\332%\35\2\333&\36\370\325\324\212\377\377\377\1\352\200" \ + "{\215\332%\35\1\355\222\216\212\377\377\377\1\367\317\316\205\332%\35" \ + "\4\366\305\303\377\377\377\367\314\312\337C<\222\332%\35\1\356\232\227" \ + "\211\377\377\377\1\373\344\343\202\332%\35\3\310\223\221\302\301\301" \ + "\304\303\303\206\377\377\377\3\340\340\340\302\301\301\322\321\321\204" \ + "\377\377\377\1\366\312\310\207\332%\35\1\372\335\334\207\377\377\377" \ + "\2\375\363\363\342PI\207\332%\35\2\33680\372\335\334\215\377\377\377" \ + "\1\364\303\301\202\332%\35\1\353\206\201\211\377\377\377\1\344_Y\210" \ + "\332%\35\1\337C<\211\377\377\377\1\354\214\210\205\332%\35\1\373\342" \ + "\341\210\377\377\377\2\376\370\367\337@9\221\332%\35\2\340F\77\342PI" \ + "\205\332%\35\1\367\315\313\210\377\377\377\1\374\352\351\207\332%\35" \ + "\1\364\274\271\210\377\377\377\1\377\373\373\207\332%\35\1\347nh\212" \ + "\377\377\377\2\375\363\363\341LF\213\332%\35\2\343YS\376\371\371\212" \ + "\377\377\377\1\346ga\205\332%\35\1\366\305\303\202\377\377\377\3\376" \ + "\365\365\353\206\201\334-&\220\332%\35\1\364\276\274\211\377\377\377" \ + "\1\366\306\304\202\332%\35\3\310\223\221\302\301\301\304\303\303\206" \ + "\377\377\377\3\340\340\340\302\301\301\322\321\321\204\377\377\377\1" \ + "\366\312\310\207\332%\35\1\372\335\334\210\377\377\377\2\374\355\354" \ + "\340D>\207\332%\35\2\336<5\373\342\341\214\377\377\377\1\364\303\301" \ + "\202\332%\35\1\356\232\227\211\377\377\377\1\347pk\210\332%\35\1\337" \ + "C<\211\377\377\377\1\354\214\210\205\332%\35\1\360\244\240\211\377\377" \ + "\377\2\367\315\313\334.&\216\332%\35\4\3341)\356\233\227\377\374\374" \ + "\364\276\274\205\332%\35\1\367\315\313\210\377\377\377\1\374\352\351" \ + "\207\332%\35\1\364\274\271\210\377\377\377\1\377\373\373\207\332%\35" \ + "\2\333&\36\372\336\335\212\377\377\377\2\375\356\356\342RL\211\332%\35" \ + "\2\344]W\376\364\364\212\377\377\377\2\371\331\327\333&\36\205\332%\35" \ + "\1\366\305\303\204\377\377\377\3\375\356\356\355\223\217\3356.\215\332" \ + "%\35\1\347mg\212\377\377\377\1\352\177z\202\332%\35\3\310\223\221\302" \ + "\301\301\304\303\303\206\377\377\377\3\340\340\340\302\301\301\322\321" \ + "\321\204\377\377\377\1\366\312\310\207\332%\35\1\372\335\334\211\377" \ + "\377\377\2\373\344\343\336<5\207\332%\35\2\337B;\374\350\347\213\377" \ + "\377\377\1\364\303\301\202\332%\35\1\354\214\210\211\377\377\377\1\360" \ + "\245\242\210\332%\35\1\354\213\206\211\377\377\377\1\354\214\210\205" \ + "\332%\35\2\340HA\377\374\374\211\377\377\377\2\370\324\322\341JC\213" \ + "\332%\35\3\3356.\355\221\215\375\360\357\202\377\377\377\1\364\276\274" \ + "\205\332%\35\1\367\315\313\210\377\377\377\1\374\352\351\207\332%\35" \ + "\1\364\274\271\210\377\377\377\1\377\373\373\210\332%\35\1\346id\213" \ + "\377\377\377\3\377\374\374\360\243\237\337B;\205\332%\35\2\340IB\362" \ + "\255\252\214\377\377\377\1\345d^\206\332%\35\1\366\305\303\206\377\377" \ + "\377\4\376\367\367\363\267\264\351|w\337A:\210\332%\35\2\336=6\361\252" \ + "\247\212\377\377\377\2\377\372\372\3354-\202\332%\35\3\310\223\221\302" \ + "\301\301\304\303\303\206\377\377\377\3\340\340\340\302\301\301\322\321" \ + "\321\204\377\377\377\1\366\312\310\207\332%\35\1\372\335\334\212\377" \ + "\377\377\2\371\333\331\3354-\207\332%\35\2\340G@\374\355\354\212\377" \ + "\377\377\1\364\303\301\202\332%\35\1\347rm\211\377\377\377\3\377\376" \ + "\376\351}x\333*\"\204\332%\35\2\342TN\365\303\300\212\377\377\377\1\354" \ + "\214\210\206\332%\35\1\360\246\243\212\377\377\377\15\377\375\375\364" \ + "\271\267\350to\341LF\3356.\333&\36\332%\35\333&\36\33680\342PI\353\205" \ + "\200\366\311\307\377\374\374\204\377\377\377\1\364\276\274\205\332%\35" \ + "\1\367\315\313\210\377\377\377\1\374\352\351\207\332%\35\1\364\274\271" \ + "\210\377\377\377\1\377\373\373\211\332%\35\1\357\235\231\215\377\377" \ + "\377\5\372\334\333\364\271\267\361\250\245\364\271\267\372\336\335\215" \ + "\377\377\377\1\356\230\224\207\332%\35\1\366\305\303\212\377\377\377" \ + "\10\372\341\337\365\302\277\362\255\252\356\231\225\354\215\211\357\236" \ + "\232\362\262\257\372\341\337\214\377\377\377\1\356\231\226\203\332%\35" \ + "\3\310\223\221\302\301\301\304\303\303\206\377\377\377\3\340\340\340" \ + "\302\301\301\322\321\321\204\377\377\377\1\366\312\310\207\332%\35\1" \ + "\372\335\334\213\377\377\377\2\367\317\315\334.&\207\332%\35\2\341MF" \ + "\375\361\360\211\377\377\377\1\364\303\301\202\332%\35\2\33680\377\376" \ + "\376\212\377\377\377\5\374\355\355\366\305\303\362\261\257\364\271\267" \ + "\373\342\341\214\377\377\377\1\354\214\210\206\332%\35\2\33680\374\355" \ + "\354\216\377\377\377\3\376\371\371\374\351\350\376\371\371\211\377\377" \ + "\377\1\364\276\274\205\332%\35\1\367\315\313\210\377\377\377\1\374\352" \ + "\351\207\332%\35\1\364\274\271\210\377\377\377\1\377\373\373\211\332" \ + "%\35\2\333(\40\366\312\310\235\377\377\377\2\366\305\303\333'\37\207" \ + "\332%\35\1\366\305\303\235\377\377\377\2\371\331\327\333+#\203\332%\35" \ + "\3\310\223\221\302\301\301\304\303\303\206\377\377\377\3\340\340\340" \ + "\302\301\301\322\321\321\204\377\377\377\1\366\312\310\207\332%\35\1" \ + "\372\335\334\214\377\377\377\2\365\302\277\333*\"\207\332%\35\2\342T" \ + "N\376\364\364\210\377\377\377\1\364\303\301\203\332%\35\1\364\276\274" \ + "\233\377\377\377\1\354\214\210\207\332%\35\2\341OH\375\363\362\231\377" \ + "\377\377\1\364\276\274\205\332%\35\1\367\315\313\210\377\377\377\1\374" \ + "\352\351\207\332%\35\1\364\274\271\210\377\377\377\1\377\373\373\212" \ + "\332%\35\2\33681\370\324\322\233\377\377\377\2\370\323\321\3356.\210" \ + "\332%\35\1\366\305\303\234\377\377\377\2\374\350\347\340HA\204\332%\35" \ + "\3\310\223\221\302\301\301\304\303\303\206\377\377\377\3\340\340\340" \ + "\302\301\301\322\321\321\204\377\377\377\1\366\312\310\207\332%\35\1" \ + "\372\335\334\215\377\377\377\2\363\263\260\333&\36\207\332%\35\2\344" \ + "[U\376\367\367\207\377\377\377\1\364\303\301\203\332%\35\2\341KE\377" \ + "\373\373\220\377\377\377\1\377\375\375\211\377\377\377\1\354\214\210" \ + "\210\332%\35\2\343YS\376\364\364\230\377\377\377\1\364\276\274\205\332" \ + "%\35\1\367\315\313\210\377\377\377\1\374\352\351\207\332%\35\1\364\274" \ + "\271\210\377\377\377\1\377\373\373\213\332%\35\2\334.&\363\270\266\231" \ + "\377\377\377\2\362\261\257\334,%\211\332%\35\1\366\305\303\233\377\377" \ + "\377\2\372\335\334\337\77""8\205\332%\35\3\310\223\221\302\301\301\304" \ + "\303\303\206\377\377\377\3\340\340\340\302\301\301\322\321\321\204\377" \ + "\377\377\1\366\312\310\207\332%\35\1\372\335\334\216\377\377\377\1\360" \ + "\244\240\210\332%\35\2\345b]\376\371\371\206\377\377\377\1\364\303\301" \ + "\204\332%\35\1\351{v\217\377\377\377\2\373\343\342\347mg\211\377\377" \ + "\377\1\354\214\210\211\332%\35\2\337A:\366\311\307\227\377\377\377\1" \ + "\364\276\274\205\332%\35\1\367\315\313\210\377\377\377\1\374\352\351" \ + "\207\332%\35\1\364\274\271\210\377\377\377\1\377\373\373\214\332%\35" \ + "\3\333&\36\355\223\217\377\372\372\225\377\377\377\3\376\371\371\354" \ + "\213\206\333&\36\212\332%\35\1\360\245\242\231\377\377\377\3\377\375" \ + "\375\360\246\243\3354-\206\332%\35\3\310\223\221\302\301\301\304\303" \ + "\303\206\377\377\377\3\340\340\340\302\301\301\322\321\321\204\377\377" \ + "\377\1\366\312\310\207\332%\35\1\372\335\334\217\377\377\377\1\355\222" \ + "\216\210\332%\35\2\346je\377\374\374\205\377\377\377\1\364\303\301\205" \ + "\332%\35\2\352\201}\377\373\373\214\377\377\377\3\362\255\252\3355.\337" \ + "C<\211\377\377\377\1\354\214\210\212\332%\35\3\333&\36\352\177z\373\342" \ + "\341\224\377\377\377\2\370\325\323\347nh\205\332%\35\1\367\315\313\210" \ + "\377\377\377\1\374\352\351\207\332%\35\1\364\274\271\210\377\377\377" \ + "\1\377\373\373\216\332%\35\3\337@9\361\252\247\377\373\373\221\377\377" \ + "\377\3\376\371\371\360\243\237\336=6\215\332%\35\3\337B;\355\223\217" \ + "\372\341\340\225\377\377\377\2\366\305\303\342PI\210\332%\35\3\310\223" \ + "\221\302\301\301\304\303\303\206\377\377\377\3\340\340\340\302\301\301" \ + "\322\321\321\204\377\377\377\1\366\312\310\207\332%\35\1\372\335\334" \ + "\220\377\377\377\1\352\200|\210\332%\35\2\350tn\377\376\376\204\377\377" \ + "\377\1\364\303\301\206\332%\35\2\343VO\367\315\313\210\377\377\377\3" \ + "\377\375\375\365\303\300\343XR\202\332%\35\1\337C<\211\377\377\377\1" \ + "\354\214\210\214\332%\35\4\333&\36\345b]\364\272\267\375\363\362\215" \ + "\377\377\377\4\377\372\372\366\311\307\354\214\207\341JD\207\332%\35" \ + "\1\367\315\313\210\377\377\377\1\374\352\351\207\332%\35\1\364\274\271" \ + "\210\377\377\377\1\377\373\373\220\332%\35\4\337A:\356\230\224\370\321" \ + "\317\377\375\375\213\377\377\377\4\377\375\375\370\321\317\355\225\221" \ + "\336=6\222\332%\35\4\340G@\353\205\200\365\303\300\375\363\362\215\377" \ + "\377\377\4\377\375\375\371\332\330\354\217\213\337\77""8\212\332%\35" \ + "\3\310\223\221\302\301\301\304\303\303\206\377\377\377\3\340\340\340" \ + "\302\301\301\322\321\321\204\377\377\377\1\366\312\310\207\332%\35\1" \ + "\372\335\334\220\377\377\377\2\377\376\376\347ql\210\332%\35\1\351}x" \ + "\204\377\377\377\1\364\303\301\210\332%\35\3\342RL\354\217\213\363\266" \ + "\263\202\366\311\307\4\363\264\261\357\237\234\352\201}\336:3\236\332" \ + "%\35\17\333&\36\340G@\350up\356\233\227\361\252\247\363\267\265\366\305" \ + "\303\367\317\316\366\307\305\364\273\270\362\255\252\357\237\233\351" \ + "zv\342PI\333*\"\270\332%\35\15\3353,\346kf\355\223\217\360\245\241\363" \ + "\266\263\366\307\305\370\322\320\366\305\303\363\266\263\360\245\241" \ + "\355\223\217\346id\3352+\230\332%\35\17\333&\36\336=6\345a[\353\205\200" \ + "\356\227\223\357\241\236\361\253\250\363\266\263\364\272\267\362\257" \ + "\254\360\243\237\355\225\221\352~y\343UN\334.&\215\332%\35\3\310\223" \ + "\221\302\301\301\304\303\303\206\377\377\377\3\340\340\340\302\301\301" \ + "\322\321\321\254\377\377\377\1\364\303\301\377\332%\35\270\332%\35\3" \ + "\310\223\221\302\301\301\304\303\303\206\377\377\377\3\340\340\340\302" \ + "\301\301\322\321\321\254\377\377\377\1\364\303\301\377\332%\35\270\332" \ + "%\35\3\310\223\221\302\301\301\304\303\303\206\377\377\377\3\340\340" \ + "\340\302\301\301\322\321\321\254\377\377\377\1\363\313\311\377\325B;" \ + "\270\325B;\3\307\234\232\302\301\301\304\303\303\206\377\377\377\3\340" \ + "\340\340\302\301\301\307\306\306\254\326\325\325\1\320\317\317\377\302" \ + "\301\301\272\302\301\301\1\304\303\303\206\377\377\377\1\340\340\340" \ + "\377\302\301\301\351\302\301\301\1\304\303\303\206\377\377\377\1\357" \ + "\357\357\377\340\340\340\351\340\340\340\1\341\341\341\206\377\377\377") + + diff --git a/packages/psplash/psplash_svn.bb b/packages/psplash/psplash_svn.bb index 7e0d7c6177..e7cbda5641 100644 --- a/packages/psplash/psplash_svn.bb +++ b/packages/psplash/psplash_svn.bb @@ -3,7 +3,7 @@ require psplash-ua.inc ALTERNATIVE_PRIORITY = "10" -PR = "r16" +PR = "r17" SRC_URI = "svn://svn.o-hand.com/repos/misc/trunk;module=psplash;proto=http \ file://psplash-hand-img.h \ diff --git a/packages/python/python-coherence_svn.bb b/packages/python/python-coherence_svn.bb index e6f5fafb53..031067672e 100644 --- a/packages/python/python-coherence_svn.bb +++ b/packages/python/python-coherence_svn.bb @@ -3,17 +3,23 @@ SECTION = "devel/python" LICENSE = "MIT" HOMEPAGE = "http://coherence.beebits.net/wiki" -PR = "r6" +PR = "r1" + PV = "0.6.0+svnr${SRCREV}" inherit setuptools +DISTUTILS_INSTALL_ARGS = "--root=${D} \ + --prefix=${prefix} \ + --install-data=${datadir}" + SRC_URI = "svn://coherence.beebits.net/svn/trunk;module=Coherence;proto=https" S = "${WORKDIR}/Coherence" FILES_${PN} += "${datadir}" RDEPENDS_${PN} += "python-twisted-pair python-divmodepsilon python-nevow python-gst python-dbus \ - python-configobj python-twisted python-twisted-core python-misc python-zopeinterface \ - zope python-modules python-pygobject python-gdata python-inotify" + python-configobj python-twisted python-twisted-core python-twisted-protocols python-misc \ + python-zopeinterface zope python-modules python-pygobject python-gdata python-inotify \ + python-divmodaxiom" diff --git a/packages/python/python-divmodaxiom_0.5.30.bb b/packages/python/python-divmodaxiom_0.5.30.bb new file mode 100644 index 0000000000..94c8a5317b --- /dev/null +++ b/packages/python/python-divmodaxiom_0.5.30.bb @@ -0,0 +1,8 @@ +DESCRIPTION = "An object oriented database" +LICENSE = "MIT" + +REALPN = "Axiom" + +DEPENDS += "python-divmodepsilon-native" + +require divmod.inc diff --git a/packages/python/python-divmodepsilon-native_0.5.11.bb b/packages/python/python-divmodepsilon-native_0.5.11.bb new file mode 100644 index 0000000000..185708b611 --- /dev/null +++ b/packages/python/python-divmodepsilon-native_0.5.11.bb @@ -0,0 +1,11 @@ +require python-divmodepsilon_${PV}.bb +inherit native + +DEPENDS = "python-native python-twisted-native zope-native" + +do_stage() { + BUILD_SYS=${BUILD_SYS} HOST_SYS=${HOST_SYS} \ + STAGING_LIBDIR=${STAGING_LIBDIR} STAGING_INCDIR=${STAGING_INCDIR} \ + ${STAGING_BINDIR}/python setup.py install --prefix=${STAGING_BINDIR}/.. --install-data=${STAGING_DATADIR} +} + diff --git a/packages/python/python-pycrypto_git.bb b/packages/python/python-pycrypto_git.bb new file mode 100644 index 0000000000..9e6eecbebd --- /dev/null +++ b/packages/python/python-pycrypto_git.bb @@ -0,0 +1,13 @@ +DESCRIPTION = "A collection of cryptographic algorithms and protocols" +SECTION = "devel/python" +PRIORITY = "optional" +DEPENDS = "gmp" +SRCNAME = "pycrypto" +LICENSE = "pycrypto" +PR = "ml0" + +PV = "2.0.1+gitr${SRCREV}" +SRC_URI = "git://git.pycrypto.org:9419/crypto/pycrypto-2.x.git;protocol=git;branch=master" +S = "${WORKDIR}/git" + +inherit distutils diff --git a/packages/python/python-pyflakes_0.2.1.bb b/packages/python/python-pyflakes_0.3.0.bb index 8be6d54478..4a6580ea05 100644 --- a/packages/python/python-pyflakes_0.2.1.bb +++ b/packages/python/python-pyflakes_0.3.0.bb @@ -4,9 +4,9 @@ HOMEPAGE = "http://divmod.org/projects/pyflakes" PRIORITY = "optional" LICENSE = "BSD" SRCNAME = "pyflakes" -PR = "ml1" +PR = "ml0" -SRC_URI = "http://www.divmod.org/static/projects/pyflakes/pyflakes-${PV}.tar.gz" +SRC_URI = "http://pypi.python.org/packages/source/p/pyflakes/${SRCNAME}-${PV}.tar.gz" S = "${WORKDIR}/${SRCNAME}-${PV}" inherit distutils diff --git a/packages/python/python-pygobject_2.16.0.bb b/packages/python/python-pygobject_2.16.0.bb index ef9fe0e6c8..d7bd1c041f 100644 --- a/packages/python/python-pygobject_2.16.0.bb +++ b/packages/python/python-pygobject_2.16.0.bb @@ -2,9 +2,7 @@ DESCRIPTION = "Python GObject bindings" SECTION = "devel/python" LICENSE = "LGPL" DEPENDS = "python-pygobject-native-${PV}" -PR = "ml1" - -DEFAULT_PREFERENCE = "-1" +PR = "ml2" MAJ_VER = "${@bb.data.getVar('PV',d,1).split('.')[0]}.${@bb.data.getVar('PV',d,1).split('.')[1]}" @@ -32,6 +30,8 @@ do_stage() { PACKAGES += "${PN}-lib" +RDEPENDS_${PN} += "python-textutils" + FILES_${PN} = "${libdir}/python*" FILES_${PN}-lib = "${libdir}/lib*.so.*" FILES_${PN}-dev += "${bindir} ${datadir}" diff --git a/packages/python/python_2.6.1.bb b/packages/python/python_2.6.1.bb index 8c3f3544a8..ae9f8ee725 100644 --- a/packages/python/python_2.6.1.bb +++ b/packages/python/python_2.6.1.bb @@ -1,7 +1,7 @@ require python.inc DEPENDS = "python-native db gdbm openssl readline sqlite3 tcl tk zlib" DEPENDS_sharprom = "python-native db readline zlib gdbm openssl" -PR = "ml2" +PR = "ml3" SRC_URI = "\ http://www.python.org/ftp/python/${PV}/Python-${PV}.tar.bz2 \ @@ -27,6 +27,11 @@ S = "${WORKDIR}/Python-${PV}" inherit autotools +# The 3 lines below are copied from the libffi recipe, ctypes ships its own copy of the libffi sources +#Somehow gcc doesn't set __SOFTFP__ when passing -mfloatabi=softp :( +TARGET_CC_ARCH_append_armv6 = " -D__SOFTFP__" +TARGET_CC_ARCH_append_armv7a = " -D__SOFTFP__" + # # copy config.h and an appropriate Makefile for distutils.sysconfig # which laters uses the information out of these to compile extensions diff --git a/packages/qhull/qhull_2003.1.bb b/packages/qhull/qhull_2003.1.bb new file mode 100644 index 0000000000..9e19749ce1 --- /dev/null +++ b/packages/qhull/qhull_2003.1.bb @@ -0,0 +1,10 @@ +DESCRIPTION = "Qhull computes the convex hull, Delaunay triangulation, Voronoi diagram, halfspace intersection about a point, furthest-site Delaunay triangulation, and furthest-site Voronoi diagram. " +LICENSE = "unknown" + +SRC_URI = "http://www.qhull.org/download/qhull-${PV}.tar.gz" + +inherit autotools_stage lib_package + + + + diff --git a/packages/qhull/tetgen_1.4.2.bb b/packages/qhull/tetgen_1.4.2.bb new file mode 100644 index 0000000000..ce6feb54e7 --- /dev/null +++ b/packages/qhull/tetgen_1.4.2.bb @@ -0,0 +1,18 @@ +DESCRIPTION = "A Quality Tetrahedral Mesh Generator and Three-Dimensional Delaunay Triangulator." +LICENSE = "MIT" + +SRC_URI = "http://www.wias-berlin.de/people/si/tetgen${PV}.tar.gz" + +S = "${WORKDIR}/tetgen${PV}" + +CXX += " ${LDFLAGS}" + +do_configure() { + sed -i -e s:ar\ :'${AR}'\ :g makefile +} + +do_install() { + install -d ${D}${bindir} + install -m 0755 tetgen ${D}${bindir}/ +} + diff --git a/packages/qi/files/sanitize-makefile.patch b/packages/qi/files/sanitize-makefile.patch new file mode 100644 index 0000000000..cd1abf3f58 --- /dev/null +++ b/packages/qi/files/sanitize-makefile.patch @@ -0,0 +1,27 @@ +Index: git/Makefile +=================================================================== +--- git.orig/Makefile ++++ git/Makefile +@@ -16,12 +16,6 @@ + + include config.mk + +-BUILD_DATE := $(shell date) +-BUILD_HOST := $(shell hostname) +-BUILD_BRANCH := $(shell git branch | grep ^\* | cut -d' ' -f2) +-BUILD_HEAD := $(shell git show --pretty=oneline | head -n1 | cut -d' ' -f1 | cut -b1-16) +-BUILD_VERSION := ${BUILD_BRANCH}_${BUILD_HEAD} +- + LDS = src/cpu/$(CPU)/qi.lds + INCLUDE = include + IMAGE_DIR = image +@@ -73,7 +67,7 @@ all:${UDFU_IMAGE} + ${OBJS}:${SRCS} ${INCLUDE}/*.h + + ${MKUDFU}: +- make -C $(TOOLS) ++ gcc tools/mkudfu.c -o ${MKUDFU} -Itools/ + + ${UDFU_IMAGE}:${OBJS} ${MKUDFU} + mkdir -p image + diff --git a/packages/qi/qi.inc b/packages/qi/qi.inc index ce28508fec..3de44ded0b 100644 --- a/packages/qi/qi.inc +++ b/packages/qi/qi.inc @@ -1,45 +1,52 @@ -DESCRIPTION = "Qi bootloader w/ Openmoko GTA02 and GTA03 support" +DESCRIPTION = "Qi bootloader w/ Openmoko GTA01, GTA02, and GTA03 support" LICENSE = "GPL" SECTION = "bootloader" PROVIDES = "virtual/bootloader" LOCALVERSION = "gitr${SRCREV}" -PV = "0.0.0+${LOCALVERSION}" +PV = "1.0.0+${LOCALVERSION}" EXTRA_OEMAKE = "" PARALLEL_MAKE = "" -BUILD_BRANCH ?= "master" - -QI_MACHINES = "s3c2442 s3c6410" do_configure() { echo >config.mk - #sed -i s,@,, Makefile + # uncomment to debug +# sed -i s,@,, Makefile + cat >config.mk <<EOF + +BUILD_HOST=\$(shell hostname) +BUILD_VERSION=${PV} +BUILD_DATE=\$(shell date) + +GCCV="`${CC} -dumpversion`" +COMPILER_LIB_PATH_PRE=${CROSS_DIR}/lib/gcc/${TARGET_SYS}/$(GCCV) +COMPILER_LIB_PATH=\$(COMPILER_LIB_PATH_PRE)/\$(shell ls \$(COMPILER_LIB_PATH_PRE)) + +AS=${AS} +LD=${LD} +CC=${CC} +OBJCOPY=${OBJCOPY} +OBJDUMP=${OBJDUMP} +HOSTCC=${BUILD_CC} + +export HOSTCC BUILD_HOST BUILD_VERSION BUILD_DATE CROSS_COMPILE AD LD CC OBJCOPY OBJDUMP MKUDFU +EOF } -do_compile () { - gccv=`${CC} -dumpversion` - for mach in ${QI_MACHINES} - do - ${MAKE} clean - ${MAKE} CPU=$mach \ - HOSTCC="${BUILD_CC}" \ - COMPILER_LIB_PATH="${CROSS_DIR}/lib/gcc/${TARGET_SYS}/$gccv/" \ - BUILD_BRANCH="master" \ - BUILD_HEAD="${LOCALVERSION}" - cp -f image/qi-$mach* ${S} - done +do_compile() { + make clean && \ + make CPU=s3c2442 && \ + make CPU=s3c2410 && \ + make CPU=s3c6410 } do_deploy () { install -d ${DEPLOY_DIR_IMAGE} - for mach in ${QI_MACHINES} - do - cat qi-$mach-${BUILD_BRANCH}_${LOCALVERSION} >> qi-$mach-${BUILD_BRANCH}_${LOCALVERSION}.udfu - install -m 0644 qi-$mach-${BUILD_BRANCH}_${LOCALVERSION}.udfu ${DEPLOY_DIR_IMAGE}/qi-$mach-${BUILD_BRANCH}-${PV}-${PR}.bin - ln -sf ${DEPLOY_DIR_IMAGE}/qi-${mach}-${PV}-${PR}.bin ${DEPLOY_DIR_IMAGE}/qi-${mach}-${BUILD_BRANCH}-latest.bin - done + cp -f image/qi-*.udfu ${DEPLOY_DIR_IMAGE} } +PACKAGE_ARCH = "${MACHINE_ARCH}" + do_deploy[dirs] = "${S}" addtask deploy before do_package after do_install addtask quilt before do_patch after do_unpack diff --git a/packages/qi/qi_git.bb b/packages/qi/qi_git.bb index 37bf9af11f..968f688da4 100644 --- a/packages/qi/qi_git.bb +++ b/packages/qi/qi_git.bb @@ -1,7 +1,9 @@ require qi.inc -BUILD_BRANCH = "master" PR = "r0" -SRC_URI = "git://git.openmoko.org/git/qi.git;protocol=git;branch=${BUILD_BRANCH}" +SRC_URI = "\ + git://git.openmoko.org/git/qi.git;protocol=git;branch=master \ + file://sanitize-makefile.patch;patch=1 \ +" S = "${WORKDIR}/git" diff --git a/packages/rpm2cpio/rpm2cpio-native_1.2_2.bb b/packages/rpm2cpio/rpm2cpio-native_1.2_2.bb index 3a12fba3ca..6670896a5e 100644 --- a/packages/rpm2cpio/rpm2cpio-native_1.2_2.bb +++ b/packages/rpm2cpio/rpm2cpio-native_1.2_2.bb @@ -4,7 +4,7 @@ DEPENDS="perl-native" LICENSE="BSD" -SRC_URI="${FREEBSD_MIRROR}/ports/packages/archivers/rpm2cpio-1.2_2.tbz" +SRC_URI="http://www.freebsd.org/cgi/cvsweb.cgi/%7Echeckout%7E/ports/archivers/rpm2cpio/files/rpm2cpio?rev=1.2" inherit native @@ -15,7 +15,7 @@ do_compile() { do_stage() { install -d ${STAGING_BINDIR} - sed -e '1,1s|${bindir}/|${bindir}/env |' bin/rpm2cpio.pl \ + sed -e '1,1s|${bindir}/|${bindir}/env |' "rpm2cpio?rev=1.2" \ > ${STAGING_BINDIR}/rpm2cpio.pl my_PERL="/usr/bin/env perl" diff --git a/packages/rt2x00/rt61-firmware_1.2.bb b/packages/rt2x00/rt61-firmware_1.2.bb new file mode 100644 index 0000000000..ae683c8060 --- /dev/null +++ b/packages/rt2x00/rt61-firmware_1.2.bb @@ -0,0 +1,14 @@ +DESCRIPTION = "Firmware for rt61 based USB wifi adaptors" +LICENSE = "unknown" + +SRC_URI = "http://www.ralinktech.com.tw/data/RT61_Firmware_V${PV}.zip" + +S = "${WORKDIR}/RT61_Firmware_V${PV}" + +do_install() { + install -d ${D}/${base_libdir}/firmware + install -m 0644 rt61.bin ${D}/${base_libdir}/firmware/ +} + +FILES_${PN} = "${base_libdir}/firmware/" +PACKAGE_ARCH = "all" diff --git a/packages/ruby/files/openssl.patch b/packages/ruby/files/openssl.patch new file mode 100644 index 0000000000..9de37ef3e7 --- /dev/null +++ b/packages/ruby/files/openssl.patch @@ -0,0 +1,156 @@ +This patch backports changes from ruby 1.8.7 which only includes the +openssl prototypes for functions that are not in the system openssl +library. + +diff -u ruby-1.8.5.orig/ext/openssl/extconf.rb ruby-1.8.5/ext/openssl/extconf.rb +--- ruby-1.8.5.orig/ext/openssl/openssl_missing.c 2007-02-13 00:01:19.000000000 +0100 ++++ ruby-1.8.5/ext/openssl/openssl_missing.c 2008-05-19 05:00:52.000000000 +0200 +@@ -22,17 +22,15 @@ + #include "openssl_missing.h" + + #if !defined(HAVE_HMAC_CTX_COPY) +-int ++void + HMAC_CTX_copy(HMAC_CTX *out, HMAC_CTX *in) + { +- if (!out || !in) return 0; ++ if (!out || !in) return; + memcpy(out, in, sizeof(HMAC_CTX)); + +- if (!EVP_MD_CTX_copy(&out->md_ctx, &in->md_ctx) +- || !EVP_MD_CTX_copy(&out->i_ctx, &in->i_ctx) +- || !EVP_MD_CTX_copy(&out->o_ctx, &in->o_ctx)) +- return 0; +- return 1; ++ EVP_MD_CTX_copy(&out->md_ctx, &in->md_ctx); ++ EVP_MD_CTX_copy(&out->i_ctx, &in->i_ctx); ++ EVP_MD_CTX_copy(&out->o_ctx, &in->o_ctx); + } + #endif /* HAVE_HMAC_CTX_COPY */ + #endif /* NO_HMAC */ +diff -u ruby-1.8.5.orig/ext/openssl/openssl_missing.h ruby-1.8.5/ext/openssl/openssl_missing.h +--- ruby-1.8.5.orig/ext/openssl/openssl_missing.h 2008-08-04 06:43:34.000000000 +0200 ++++ ruby-1.8.5/ext/openssl/openssl_missing.h 2008-08-04 06:44:17.000000000 +0200 +@@ -60,14 +60,33 @@ + (char *(*)())d2i_PKCS7_RECIP_INFO, (char *)ri) + #endif + ++#if !defined(HAVE_EVP_MD_CTX_INIT) + void HMAC_CTX_init(HMAC_CTX *ctx); +-int HMAC_CTX_copy(HMAC_CTX *out, HMAC_CTX *in); ++#endif ++ ++#if !defined(HAVE_HMAC_CTX_COPY) ++void HMAC_CTX_copy(HMAC_CTX *out, HMAC_CTX *in); ++#endif ++ ++#if !defined(HAVE_HMAC_CTX_CLEANUP) + void HMAC_CTX_cleanup(HMAC_CTX *ctx); ++#endif + ++#if !defined(HAVE_EVP_MD_CTX_CREATE) + EVP_MD_CTX *EVP_MD_CTX_create(void); ++#endif ++ ++#if !defined(HAVE_EVP_MD_CTX_INIT) + void EVP_MD_CTX_init(EVP_MD_CTX *ctx); ++#endif ++ ++#if !defined(HAVE_EVP_MD_CTX_CLEANUP) + int EVP_MD_CTX_cleanup(EVP_MD_CTX *ctx); ++#endif ++ ++#if !defined(HAVE_EVP_MD_CTX_DESTROY) + void EVP_MD_CTX_destroy(EVP_MD_CTX *ctx); ++#endif + + #if !defined(HAVE_EVP_CIPHER_CTX_COPY) + int EVP_CIPHER_CTX_copy(EVP_CIPHER_CTX *out, EVP_CIPHER_CTX *in); +@@ -111,19 +130,54 @@ + #define OPENSSL_cleanse(p, l) memset(p, 0, l) + #endif + ++#if !defined(HAVE_X509_STORE_SET_EX_DATA) + void *X509_STORE_get_ex_data(X509_STORE *str, int idx); + int X509_STORE_set_ex_data(X509_STORE *str, int idx, void *data); ++#endif ++ ++#if !defined(HAVE_X509_CRL_SET_VERSION) + int X509_CRL_set_version(X509_CRL *x, long version); ++#endif ++ ++#if !defined(HAVE_X509_CRL_SET_ISSUER_NAME) + int X509_CRL_set_issuer_name(X509_CRL *x, X509_NAME *name); ++#endif ++ ++#if !defined(HAVE_X509_CRL_SORT) + int X509_CRL_sort(X509_CRL *c); ++#endif ++ ++#if !defined(HAVE_X509_CRL_ADD0_REVOKED) + int X509_CRL_add0_revoked(X509_CRL *crl, X509_REVOKED *rev); ++#endif ++ ++#if !defined(HAVE_BN_MOD_SQR) + int BN_mod_sqr(BIGNUM *r, const BIGNUM *a, const BIGNUM *m, BN_CTX *ctx); ++#endif ++ ++#if !defined(HAVE_BN_MOD_ADD) + int BN_mod_add(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, const BIGNUM *m, BN_CTX *ctx); ++#endif ++ ++#if !defined(HAVE_BN_MOD_SUB) + int BN_mod_sub(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, const BIGNUM *m, BN_CTX *ctx); ++#endif ++ ++#if !defined(HAVE_BN_RAND_RANGE) + int BN_rand_range(BIGNUM *r, BIGNUM *range); ++#endif ++ ++#if !defined(HAVE_BN_PSEUDO_RAND_RANGE) + int BN_pseudo_rand_range(BIGNUM *r, BIGNUM *range); ++#endif ++ ++#if !defined(HAVE_CONF_GET1_DEFAULT_CONFIG_FILE) + char *CONF_get1_default_config_file(void); ++#endif ++ ++#if !defined(HAVE_PEM_DEF_CALLBACK) + int PEM_def_callback(char *buf, int num, int w, void *key); ++#endif + + #if defined(__cplusplus) + } +diff -u ruby-1.8.5.orig/ext/openssl/ossl_hmac.c ruby-1.8.5/ext/openssl/ossl_hmac.c +--- ruby-1.8.5.orig/ext/openssl/ossl_hmac.c 2007-03-12 05:12:32.000000000 +0100 ++++ ruby-1.8.5/ext/openssl/ossl_hmac.c 2008-05-19 05:00:52.000000000 +0200 +@@ -81,12 +87,15 @@ + GetHMAC(self, ctx1); + SafeGetHMAC(other, ctx2); + +- if (!HMAC_CTX_copy(ctx1, ctx2)) { +- ossl_raise(eHMACError, NULL); +- } ++ HMAC_CTX_copy(ctx1, ctx2); + return self; + } + ++/* ++ * call-seq: ++ * hmac.update(string) -> self ++ * ++ */ + static VALUE + ossl_hmac_update(VALUE self, VALUE data) + { +@@ -104,9 +113,7 @@ + { + HMAC_CTX final; + +- if (!HMAC_CTX_copy(&final, ctx)) { +- ossl_raise(eHMACError, NULL); +- } ++ HMAC_CTX_copy(&final, ctx); + if (!(*buf = OPENSSL_malloc(HMAC_size(&final)))) { + HMAC_CTX_cleanup(&final); + OSSL_Debug("Allocating %d mem", HMAC_size(&final)); diff --git a/packages/ruby/ruby.inc b/packages/ruby/ruby.inc index 9fe8333f6f..978bf4b229 100644 --- a/packages/ruby/ruby.inc +++ b/packages/ruby/ruby.inc @@ -6,6 +6,7 @@ LICENSE = "GPL" SRC_URI = "ftp://ftp.ruby-lang.org/pub/ruby/ruby-${PV}.tar.gz \ file://extmk_run.patch;patch=1 \ + file://openssl.patch;patch=1 \ file://disable_wide_getaddrinfo_check.patch;patch=1" S = "${WORKDIR}/ruby-${PV}" diff --git a/packages/samba/files/configure-3.2.7.patch b/packages/samba/files/configure-3.2.8.patch index 94d684813e..2668b9d632 100644 --- a/packages/samba/files/configure-3.2.7.patch +++ b/packages/samba/files/configure-3.2.8.patch @@ -1,25 +1,31 @@ -diff -urN source.old/configure source/configure ---- source.old/configure 2008-11-20 14:45:08.000000000 +0000 -+++ source/configure 2008-11-30 17:53:02.116791281 +0000 -@@ -40777,11 +40777,10 @@ +diff -urN source.old//configure source//configure +--- source.old//configure 2009-02-03 16:34:41.000000000 +0000 ++++ source//configure 2009-02-06 00:25:49.502205687 +0000 +@@ -43860,13 +43860,14 @@ *linux*) # glibc <= 2.3.2 has a broken getgrouplist if test "$cross_compiling" = yes; then -- { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling +- { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 +-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +-{ { $as_echo "$as_me:$LINENO: error: cannot run test program while cross compiling -See \`config.log' for more details." >&5 --echo "$as_me: error: cannot run test program while cross compiling +-$as_echo "$as_me: error: cannot run test program while cross compiling -See \`config.log' for more details." >&2;} -- { (exit 1); exit 1; }; } -+# { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling See \`config.log' for more details." >&5 -+# echo "$as_me: error: cannot run test program while cross compiling See \`config.log' for more details." >&2;} -+# { (exit 1); exit 1; }; } +- { (exit 1); exit 1; }; }; } ++# { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 ++#$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} ++#{ { $as_echo "$as_me:$LINENO: error: cannot run test program while cross compiling ++#See \`config.log' for more details." >&5 ++#$as_echo "$as_me: error: cannot run test program while cross compiling ++#See \`config.log' for more details." >&2;} ++# { (exit 1); exit 1; }; }; } +linux_getgrouplist_ok=no else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ -diff -urN source.old/configure.in source/configure.in ---- source.old/configure.in 2008-11-18 15:17:17.000000000 +0000 -+++ source/configure.in 2008-11-30 17:33:10.960791551 +0000 +diff -urN source.old//configure.in source//configure.in +--- source.old//configure.in 2009-02-03 16:10:07.000000000 +0000 ++++ source//configure.in 2009-02-06 00:23:27.346211236 +0000 @@ -275,6 +275,8 @@ fi AC_SUBST(BROKEN_CC) @@ -58,7 +64,7 @@ diff -urN source.old/configure.in source/configure.in ], samba_cv_CC_NEGATIVE_ENUM_VALUES=yes,samba_cv__CC_NEGATIVE_ENUM_VALUES=no)]) if test x"$samba_cv_CC_NEGATIVE_ENUM_VALUES" != x"yes"; then -@@ -1187,22 +1175,12 @@ +@@ -1204,22 +1192,12 @@ case "$host_os" in *linux*) # glibc <= 2.3.2 has a broken getgrouplist diff --git a/packages/samba/files/smb.conf b/packages/samba/files/smb.conf index 3854621c3e..f07e3e4ec7 100644 --- a/packages/samba/files/smb.conf +++ b/packages/samba/files/smb.conf @@ -160,7 +160,7 @@ #============================ Share Definitions ============================== [homes] comment = Home Directories - browseable = no + browseable = yes writable = yes # Un-comment the following and create the netlogon directory for Domain Logons diff --git a/packages/samba/samba-ads-3.3.0/wbstatic.patch b/packages/samba/samba-ads-3.3.0/wbstatic.patch new file mode 100644 index 0000000000..1d2260cb55 --- /dev/null +++ b/packages/samba/samba-ads-3.3.0/wbstatic.patch @@ -0,0 +1,194 @@ +diff -urN source.old//Makefile.in source//Makefile.in +--- source.old//Makefile.in 2009-01-26 13:56:34.000000000 +0000 ++++ source//Makefile.in 2009-02-13 22:53:43.197061293 +0000 +@@ -690,7 +690,7 @@ + $(LIBMSRPC_OBJ) $(LIBMSRPC_GEN_OBJ) \ + $(LIBADS_OBJ) $(KRBCLIENT_OBJ) $(LIBADS_SERVER_OBJ) \ + $(REG_FULL_OBJ) $(POPT_LIB_OBJ) $(BUILDOPT_OBJ) \ +- $(SMBLDAP_OBJ) $(LDB_OBJ) $(LIBNET_OBJ) @LIBWBCLIENT_STATIC@ \ ++ $(SMBLDAP_OBJ) $(LDB_OBJ) $(LIBNET_OBJ) bin/libwbclient.a \ + $(LIBSMBCONF_OBJ) \ + $(PRIVILEGES_BASIC_OBJ) + +@@ -725,7 +725,7 @@ + web/swat.o web/neg_lang.o + + SWAT_OBJ = $(SWAT_OBJ1) $(PARAM_OBJ) $(PRINTING_OBJ) $(PRINTBASE_OBJ) $(LIBSMB_OBJ) \ +- $(LOCKING_OBJ) $(PASSDB_OBJ) @LIBWBCLIENT_STATIC@ $(KRBCLIENT_OBJ) \ ++ $(LOCKING_OBJ) $(PASSDB_OBJ) bin/libwbclient.a $(KRBCLIENT_OBJ) \ + $(LIB_NONSMBD_OBJ) $(GROUPDB_OBJ) $(PLAINTEXT_AUTH_OBJ) \ + $(POPT_LIB_OBJ) $(SMBLDAP_OBJ) $(RPC_PARSE_OBJ) $(LIBMSRPC_GEN_OBJ) $(LIBMSRPC_OBJ) \ + $(PASSCHANGE_OBJ) $(LDB_OBJ) +@@ -745,7 +745,7 @@ + $(KRBCLIENT_OBJ) $(POPT_LIB_OBJ) \ + rpc_client/cli_pipe.o librpc/rpc/binding.o $(RPC_PARSE_OBJ2) \ + $(RPC_CLIENT_OBJ1) \ +- $(PASSDB_OBJ) @LIBWBCLIENT_STATIC@ $(SMBLDAP_OBJ) $(LDB_OBJ) $(GROUPDB_OBJ) \ ++ $(PASSDB_OBJ) bin/libwbclient.a $(SMBLDAP_OBJ) $(LDB_OBJ) $(GROUPDB_OBJ) \ + $(LIBMSRPC_GEN_OBJ) + + TESTPARM_OBJ = utils/testparm.o \ +@@ -755,18 +755,18 @@ + PASSWD_UTIL_OBJ = utils/passwd_util.o + + SMBPASSWD_OBJ = utils/smbpasswd.o $(PASSWD_UTIL_OBJ) $(PASSCHANGE_OBJ) \ +- $(PARAM_OBJ) $(LIBSMB_OBJ) $(PASSDB_OBJ) @LIBWBCLIENT_STATIC@ \ ++ $(PARAM_OBJ) $(LIBSMB_OBJ) $(PASSDB_OBJ) bin/libwbclient.a \ + $(GROUPDB_OBJ) $(LIB_NONSMBD_OBJ) $(KRBCLIENT_OBJ) \ + $(POPT_LIB_OBJ) $(SMBLDAP_OBJ) $(RPC_PARSE_OBJ) \ + $(LIBMSRPC_GEN_OBJ) $(LIBMSRPC_OBJ) $(LDB_OBJ) + +-PDBEDIT_OBJ = utils/pdbedit.o $(PASSWD_UTIL_OBJ) $(PARAM_OBJ) $(PASSDB_OBJ) @LIBWBCLIENT_STATIC@ \ ++PDBEDIT_OBJ = utils/pdbedit.o $(PASSWD_UTIL_OBJ) $(PARAM_OBJ) $(PASSDB_OBJ) bin/libwbclient.a \ + $(LIBSAMBA_OBJ) \ + $(LIB_NONSMBD_OBJ) $(GROUPDB_OBJ) \ + $(POPT_LIB_OBJ) $(SMBLDAP_OBJ) libsmb/asn1.o \ + $(LDB_OBJ) + +-SMBGET_OBJ = utils/smbget.o $(POPT_LIB_OBJ) $(LIBSMBCLIENT_OBJ1) @LIBWBCLIENT_STATIC@ ++SMBGET_OBJ = utils/smbget.o $(POPT_LIB_OBJ) $(LIBSMBCLIENT_OBJ1) bin/libwbclient.a + + DISPLAY_SEC_OBJ= lib/display_sec.o + +@@ -782,7 +782,7 @@ + + RPCCLIENT_OBJ = $(RPCCLIENT_OBJ1) \ + $(PARAM_OBJ) $(LIBSMB_OBJ) $(LIB_NONSMBD_OBJ) \ +- $(RPC_PARSE_OBJ) $(PASSDB_OBJ) @LIBWBCLIENT_STATIC@ $(LIBMSRPC_GEN_OBJ) $(LIBMSRPC_OBJ) \ ++ $(RPC_PARSE_OBJ) $(PASSDB_OBJ) bin/libwbclient.a $(LIBMSRPC_GEN_OBJ) $(LIBMSRPC_OBJ) \ + $(READLINE_OBJ) $(GROUPDB_OBJ) $(KRBCLIENT_OBJ) \ + $(LIBADS_OBJ) $(POPT_LIB_OBJ) \ + $(SMBLDAP_OBJ) $(DCUTIL_OBJ) $(LDB_OBJ) +@@ -810,7 +810,7 @@ + $(LIBMSRPC_OBJ) $(LIBMSRPC_GEN_OBJ) $(RPC_PARSE_OBJ) \ + $(PASSDB_OBJ) $(SMBLDAP_OBJ) $(GROUPDB_OBJ) $(LDB_OBJ) + +-LIBSMBCLIENT_OBJ = $(LIBSMBCLIENT_OBJ1) @LIBWBCLIENT_STATIC@ ++LIBSMBCLIENT_OBJ = $(LIBSMBCLIENT_OBJ1) bin/libwbclient.a + + # This shared library is intended for linking with unit test programs + # to test Samba internals. It's called libbigballofmud.so to +@@ -819,7 +819,7 @@ + LIBBIGBALLOFMUD_MAJOR = 0 + + LIBBIGBALLOFMUD_OBJ = $(PARAM_OBJ) $(LIB_NONSMBD_OBJ) \ +- $(LIBSMB_OBJ) $(LIBMSRPC_OBJ) $(LIBMSRPC_GEN_OBJ) $(RPC_PARSE_OBJ) $(PASSDB_OBJ) @LIBWBCLIENT_STATIC@ \ ++ $(LIBSMB_OBJ) $(LIBMSRPC_OBJ) $(LIBMSRPC_GEN_OBJ) $(RPC_PARSE_OBJ) $(PASSDB_OBJ) bin/libwbclient.a \ + $(GROUPDB_OBJ) $(KRBCLIENT_OBJ) $(SMBLDAP_OBJ) $(LDB_OBJ) + + CLIENT_OBJ1 = client/client.o client/clitar.o rpc_client/cli_pipe.o \ +@@ -831,7 +831,7 @@ + CLIENT_OBJ = $(CLIENT_OBJ1) $(PARAM_OBJ) $(LIBSMB_OBJ) \ + $(LIB_NONSMBD_OBJ) $(KRBCLIENT_OBJ) $(LIBMSRPC_GEN_OBJ) \ + $(READLINE_OBJ) $(POPT_LIB_OBJ) \ +- $(PASSDB_OBJ) @LIBWBCLIENT_STATIC@ $(SMBLDAP_OBJ) $(GROUPDB_OBJ) $(LDB_OBJ) \ ++ $(PASSDB_OBJ) bin/libwbclient.a $(SMBLDAP_OBJ) $(GROUPDB_OBJ) $(LDB_OBJ) \ + $(DISPLAY_SEC_OBJ) + + LIBSMBCONF_OBJ = lib/smbconf/smbconf.o lib/smbconf/smbconf_util.o \ +@@ -886,7 +886,7 @@ + $(LDB_OBJ) $(LIBGPO_OBJ) @BUILD_INIPARSER@ $(DISPLAY_SEC_OBJ) \ + $(REG_SMBCONF_OBJ) @LIBNETAPI_STATIC@ $(LIBNET_OBJ) \ + $(LIBSMBCONF_OBJ) \ +- @LIBWBCLIENT_STATIC@ \ ++ bin/libwbclient.a \ + $(PRIVILEGES_BASIC_OBJ) + + CUPS_OBJ = client/smbspool.o $(PARAM_OBJ) $(LIBSMB_OBJ) \ +@@ -926,7 +926,7 @@ + $(LIBNDR_GEN_OBJ0) + + PDBTEST_OBJ = torture/pdbtest.o $(PARAM_OBJ) $(LIBSMB_OBJ) $(KRBCLIENT_OBJ) \ +- $(LIB_NONSMBD_OBJ) $(PASSDB_OBJ) @LIBWBCLIENT_STATIC@ $(GROUPDB_OBJ) \ ++ $(LIB_NONSMBD_OBJ) $(PASSDB_OBJ) bin/libwbclient.a $(GROUPDB_OBJ) \ + $(SMBLDAP_OBJ) $(POPT_LIB_OBJ) $(LDB_OBJ) \ + $(LIBNDR_GEN_OBJ0) + +@@ -942,14 +942,14 @@ + + SMBCACLS_OBJ = utils/smbcacls.o $(PARAM_OBJ) $(LIBSMB_OBJ) \ + $(KRBCLIENT_OBJ) $(LIB_NONSMBD_OBJ) $(RPC_PARSE_OBJ) \ +- $(PASSDB_OBJ) @LIBWBCLIENT_STATIC@ $(GROUPDB_OBJ) $(LIBMSRPC_OBJ) $(LIBMSRPC_GEN_OBJ) \ ++ $(PASSDB_OBJ) bin/libwbclient.a $(GROUPDB_OBJ) $(LIBMSRPC_OBJ) $(LIBMSRPC_GEN_OBJ) \ + $(POPT_LIB_OBJ) $(DCUTIL_OBJ) $(LIBADS_OBJ) $(SMBLDAP_OBJ) $(LDB_OBJ) + + SMBCQUOTAS_OBJ = utils/smbcquotas.o $(LIBSMB_OBJ) $(KRBCLIENT_OBJ) \ + $(PARAM_OBJ) \ + $(LIB_NONSMBD_OBJ) $(RPC_PARSE_OBJ) \ + $(LIBMSRPC_OBJ) $(LIBMSRPC_GEN_OBJ) $(POPT_LIB_OBJ) \ +- $(PASSDB_OBJ) @LIBWBCLIENT_STATIC@ $(SMBLDAP_OBJ) $(GROUPDB_OBJ) $(LDB_OBJ) ++ $(PASSDB_OBJ) bin/libwbclient.a $(SMBLDAP_OBJ) $(GROUPDB_OBJ) $(LDB_OBJ) + + EVTLOGADM_OBJ0 = utils/eventlogadm.o + +@@ -988,7 +988,7 @@ + + PAM_SMBPASS_OBJ_0 = pam_smbpass/pam_smb_auth.o pam_smbpass/pam_smb_passwd.o \ + pam_smbpass/pam_smb_acct.o pam_smbpass/support.o +-PAM_SMBPASS_OBJ = $(PAM_SMBPASS_OBJ_0) $(PARAM_OBJ) $(LIB_NONSMBD_OBJ) $(PASSDB_OBJ) @LIBWBCLIENT_STATIC@ $(GROUPDB_OBJ) \ ++PAM_SMBPASS_OBJ = $(PAM_SMBPASS_OBJ_0) $(PARAM_OBJ) $(LIB_NONSMBD_OBJ) $(PASSDB_OBJ) bin/libwbclient.a $(GROUPDB_OBJ) \ + $(SMBLDAP_OBJ) $(LIBSAMBA_OBJ) \ + $(LDB_OBJ) + +@@ -1036,7 +1036,7 @@ + smbd/connection.o + + WINBINDD_OBJ = \ +- $(WINBINDD_OBJ1) $(PASSDB_OBJ) @LIBWBCLIENT_STATIC@ $(GROUPDB_OBJ) \ ++ $(WINBINDD_OBJ1) $(PASSDB_OBJ) bin/libwbclient.a $(GROUPDB_OBJ) \ + $(PARAM_OBJ) $(LIB_NONSMBD_OBJ) \ + $(LIBSMB_OBJ) $(LIBMSRPC_OBJ) $(LIBMSRPC_GEN_OBJ) $(RPC_PARSE_OBJ) \ + $(PROFILE_OBJ) $(SLCACHE_OBJ) $(SMBLDAP_OBJ) \ +@@ -1047,7 +1047,7 @@ + + WBINFO_OBJ = nsswitch/wbinfo.o $(LIBSAMBA_OBJ) $(PARAM_OBJ) $(LIB_NONSMBD_OBJ) \ + $(POPT_LIB_OBJ) $(AFS_SETTOKEN_OBJ) \ +- lib/winbind_util.o $(WBCOMMON_OBJ) @LIBWBCLIENT_STATIC@ ++ lib/winbind_util.o $(WBCOMMON_OBJ) bin/libwbclient.a + + WINBIND_NSS_OBJ = $(WBCOMMON_OBJ) $(LIBREPLACE_OBJ) @WINBIND_NSS_EXTRA_OBJS@ + +@@ -1111,7 +1111,7 @@ + $(SERVER_MUTEX_OBJ) $(LIBADS_SERVER_OBJ) \ + $(PASSDB_OBJ) $(GROUPDB_OBJ) \ + $(SMBLDAP_OBJ) $(LIBNMB_OBJ) \ +- $(LDB_OBJ) $(WBCOMMON_OBJ) @LIBWBCLIENT_STATIC@ \ ++ $(LDB_OBJ) $(WBCOMMON_OBJ) bin/libwbclient.a \ + $(LIBNDR_GEN_OBJ0) $(LIBNDR_GEN_OBJ1) + + +@@ -1120,14 +1120,14 @@ + VLP_OBJ = $(VLP_OBJ1) $(PARAM_OBJ) $(LIBSMB_OBJ) \ + $(LIB_NONSMBD_OBJ) $(KRBCLIENT_OBJ) $(LIBMSRPC_GEN_OBJ) \ + $(READLINE_OBJ) $(POPT_LIB_OBJ) \ +- $(PASSDB_OBJ) @LIBWBCLIENT_STATIC@ $(SMBLDAP_OBJ) $(GROUPDB_OBJ) $(LDB_OBJ) \ ++ $(PASSDB_OBJ) bin/libwbclient.a $(SMBLDAP_OBJ) $(GROUPDB_OBJ) $(LDB_OBJ) \ + $(DISPLAY_SEC_OBJ) + + RPC_OPEN_TCP_OBJ = torture/rpc_open_tcp.o \ + $(LIBSMB_OBJ) \ + $(PARAM_OBJ) \ + $(PASSDB_OBJ) \ +- @LIBWBCLIENT_STATIC@ $(SMBLDAP_OBJ) $(LDB_OBJ) $(GROUPDB_OBJ) \ ++ bin/libwbclient.a $(SMBLDAP_OBJ) $(LDB_OBJ) $(GROUPDB_OBJ) \ + $(LIB_NONSMBD_OBJ) \ + $(KRBCLIENT_OBJ) \ + $(RPC_PARSE_OBJ2) \ +@@ -1743,7 +1743,7 @@ + LIBWBCLIENT_SOVER=@LIBWBCLIENT_SOVER@ + LIBWBCLIENT_SHARED_TARGET_SONAME=$(LIBWBCLIENT_SHARED_TARGET).$(LIBWBCLIENT_SOVER) + LIBWBCLIENT_STATIC_TARGET=@LIBWBCLIENT_STATIC_TARGET@ +-LIBWBCLIENT=@LIBWBCLIENT_STATIC@ @LIBWBCLIENT_SHARED@ ++LIBWBCLIENT=bin/libwbclient.a @LIBWBCLIENT_SHARED@ + LIBWBCLIENT_SYMS=$(srcdir)/exports/libwbclient.@SYMSEXT@ + LIBWBCLIENT_HEADERS=$(srcdir)/nsswitch/libwbclient/wbclient.h + +@@ -1880,7 +1880,7 @@ + $(PARAM_WITHOUT_REG_OBJ) $(LIB_NONSMBD_OBJ) \ + $(LIBSMB_OBJ) $(KRBCLIENT_OBJ) \ + $(LIBMSRPC_OBJ) $(LIBMSRPC_GEN_OBJ) $(RPC_PARSE_OBJ) \ +- $(PASSDB_OBJ) @LIBWBCLIENT_STATIC@ $(SMBLDAP_OBJ) $(GROUPDB_OBJ) $(LDB_OBJ) \ ++ $(PASSDB_OBJ) bin/libwbclient.a $(SMBLDAP_OBJ) $(GROUPDB_OBJ) $(LDB_OBJ) \ + $(DCUTIL_OBJ) $(LIBADS_OBJ) $(PRIVILEGES_BASIC_OBJ) \ + auth/token_util.o + diff --git a/packages/samba/samba-ads.inc b/packages/samba/samba-ads.inc index 1249528fdb..e2f77b8cd9 100644 --- a/packages/samba/samba-ads.inc +++ b/packages/samba/samba-ads.inc @@ -1,4 +1,6 @@ -DEPENDS += " openldap krb5" +# openldap and kerberos are for active directory support +# netatalk is needed to support a vfs module +DEPENDS += " openldap krb5 netatalk" EXTRA_OECONF += "\ SMB_BUILD_CC_NEGATIVE_ENUM_VALUES=yes \ @@ -16,22 +18,20 @@ EXTRA_OECONF += "\ --with-ads \ " -PACKAGES =+ "libsmbclient-ads libsmbclient-ads-dev cifs-ads cifs-ads-doc smbfs-ads swat-ads" +PACKAGES =+ "libsmbclient-ads libsmbclient-ads-dev cifs-ads cifs-ads-doc swat-ads" RCONFLICTS_${PN} = "samba" RCONFLICTS_libsmbclient-ads = "libsmbclient" RCONFLICTS_libsmbclient-ads-dev = "libsmbclient-dev" RCONFLICTS_cifs-ads = "cifs" RCONFLICTS_cifs-ads-doc = "cifs-doc" -RCONFLICTS_smbfs-ads = "smbfs" RCONFLICTS_swat-ads = "swat" -FILES_cifs-ads= "${base_sbindir}/mount.cifs ${base_sbindir}/umount.cifs" +FILES_cifs-ads = "${base_sbindir}/mount.cifs ${base_sbindir}/umount.cifs" FILES_cifs-ads-doc = "${mandir}/man8/mount.cifs.8 ${mandir}/man8/umount.cifs.8" FILES_libsmbclient-ads = "${libdir}/libsmbclient.so.*" FILES_libsmbclient-ads-dev = "${libdir}/libsmbclient.so ${includedir}" -FILES_smbfs-ads = "${bindir}/smbmount ${bindir}/smbumount ${bindir}/smbmnt ${base_sbindir}/mount.smbfs ${base_sbindir}/mount.smb" -FILES_swat-ads = "${sbindir}/swat ${datadir}/swat ${libdir}/*.msg" +FILES_swat-ads = "${sbindir}/swat ${datadir}/swat ${libdir}/*.msg" do_configure() { oe_runconf diff --git a/packages/samba/samba-ads_3.2.7.bb b/packages/samba/samba-ads_3.2.8.bb index 83b4416625..95f09c16cb 100644 --- a/packages/samba/samba-ads_3.2.7.bb +++ b/packages/samba/samba-ads_3.2.8.bb @@ -1,10 +1,10 @@ require samba.inc require samba-ads.inc -PR = "r1" +PR = "r2" SRC_URI += "file://config-lfs.patch;patch=1 \ file://quota.patch;patch=1;pnum=0 \ - file://configure-3.2.7.patch;patch=1 \ + file://configure-3.2.8.patch;patch=1 \ file://config-h.patch;patch=1 \ file://mtab.patch;patch=1 \ " diff --git a/packages/samba/samba-ads_3.3.0.bb b/packages/samba/samba-ads_3.3.0.bb index 7688fd6703..9fd4303143 100644 --- a/packages/samba/samba-ads_3.3.0.bb +++ b/packages/samba/samba-ads_3.3.0.bb @@ -1,12 +1,13 @@ require samba.inc require samba-ads.inc -PR = "r1" +PR = "r3" SRC_URI += "file://config-lfs.patch;patch=1 \ file://quota.patch;patch=1;pnum=0 \ file://configure-3.3.0.patch;patch=1 \ file://config-h.patch;patch=1 \ file://mtab.patch;patch=1 \ + file://wbstatic.patch;patch=1 \ " do_compile () { diff --git a/packages/samba/samba-basic.inc b/packages/samba/samba-basic.inc index 54c54baad8..f1bda65286 100644 --- a/packages/samba/samba-basic.inc +++ b/packages/samba/samba-basic.inc @@ -8,19 +8,17 @@ EXTRA_OECONF += "\ --without-ldap \ --without-krb5" -PACKAGES =+ "libsmbclient libsmbclient-dev cifs cifs-doc smbfs swat" +PACKAGES =+ "libsmbclient libsmbclient-dev cifs cifs-doc swat" RCONFLICTS_${PN} = "samba-ads" RCONFLICTS_libsmbclient = "libsmbclient-ads" RCONFLICTS_libsmbclient-dev = "libsmbclient-ads-dev" RCONFLICTS_cifs = "cifs-ads" RCONFLICTS_cifs-doc = "cifs-ads-doc" -RCONFLICTS_smbfs = "smbfs-ads" RCONFLICTS_swat = "swat-ads" FILES_cifs = "${base_sbindir}/mount.cifs ${base_sbindir}/umount.cifs" FILES_cifs-doc = "${mandir}/man8/mount.cifs.8 ${mandir}/man8/umount.cifs.8" FILES_libsmbclient = "${libdir}/libsmbclient.so.*" FILES_libsmbclient-dev = "${libdir}/libsmbclient.so ${includedir}" -FILES_smbfs = "${bindir}/smbmount ${bindir}/smbumount ${bindir}/smbmnt ${base_sbindir}/mount.smbfs ${base_sbindir}/mount.smb" FILES_swat = "${sbindir}/swat ${datadir}/swat ${libdir}/*.msg" diff --git a/packages/samba/samba.inc b/packages/samba/samba.inc index 0ffd4b9a13..36de08beca 100644 --- a/packages/samba/samba.inc +++ b/packages/samba/samba.inc @@ -24,7 +24,6 @@ EXTRA_OECONF='--disable-cups \ --with-readline=${STAGING_LIBDIR}/.. \ --with-libiconv=${STAGING_LIBDIR}/.. \ --without-automount \ - --with-smbmount \ --with-configdir=${sysconfdir}/samba \ --with-privatedir=${sysconfdir}/samba/private \ --with-lockdir=${localstatedir}/lock \ @@ -59,22 +58,23 @@ do_install_append() { mv ${D}${libdir}/libsmbclient.so ${D}${libdir}/libsmbclient.so.0 || true ln -sf libsmbclient.so.0 ${D}${libdir}/libsmbclient.so mkdir -p ${D}${base_sbindir} - rm -f ${D}${sbindir}/mount.smbfs ${D}${base_sbindir}/mount.smbfs - ln -sf ${bindir}/smbmount ${D}${base_sbindir}/mount.smb - ln -sf ${bindir}/smbmount ${D}${base_sbindir}/mount.smbfs rm -f ${D}${bindir}/*.old rm -f ${D}${sbindir}/*.old [ -f ${D}${sbindir}/mount.cifs ] && mv ${D}${sbindir}/mount.cifs ${D}${base_sbindir}/ [ -f ${D}${sbindir}/umount.cifs ] && mv ${D}${sbindir}/umount.cifs ${D}${base_sbindir}/ - install -d "${D}/var/log/samba" - install -d "${D}${sysconfdir}/init.d" - install -c -m 755 ${WORKDIR}/init ${D}${sysconfdir}/init.d/samba - install -d "${D}${sysconfdir}/samba" - install -c -m 644 ${WORKDIR}/smb.conf ${D}${sysconfdir}/samba/smb.conf + # This is needed for < 3.2.4 + rm -f ${D}${sbindir}/mount.smbfs ${D}${base_sbindir}/mount.smbfs + if [ -f ${D}${bindir}/smbmount ]; then + ln -sf ${bindir}/smbmount ${D}${base_sbindir}/mount.smb + ln -sf ${bindir}/smbmount ${D}${base_sbindir}/mount.smbfs + fi + + install -D -m 755 ${WORKDIR}/init ${D}${sysconfdir}/init.d/samba + install -D -m 644 ${WORKDIR}/smb.conf ${D}${sysconfdir}/samba/smb.conf + install -D -m 644 ${WORKDIR}/volatiles.03_samba ${D}${sysconfdir}/default/volatiles/volatiles.03_samba + install -d ${D}/var/log/samba install -d ${D}/var/spool/samba - - install -D -m 0644 ${WORKDIR}/volatiles.03_samba ${D}${sysconfdir}/default/volatiles/volatiles.03_samba } do_stage() { diff --git a/packages/samba/samba_3.0.23c.bb b/packages/samba/samba_3.0.23c.bb index 6270ab7a13..c08dc04cce 100644 --- a/packages/samba/samba_3.0.23c.bb +++ b/packages/samba/samba_3.0.23c.bb @@ -6,10 +6,13 @@ SRC_URI += "file://configure.patch;patch=1 \ PR = "r7" -PACKAGES =+ " smbfs-doc" +EXTRA_OECONF += "\ + --with-smbmount \ + " +PACKAGES =+ " smbfs smbfs-doc" RCONFLICTS_smbfs-doc = "smbfs-ads-doc" - +FILES_smbfs = "${bindir}/smbmount ${bindir}/smbumount ${bindir}/smbmnt ${base_sbindir}/mount.smbfs ${base_sbindir}/mount.smb" FILES_smbfs-doc = "${mandir}/man8/smbmount.8 ${mandir}/man8/smbumount.8 ${mandir}/man8/smbmnt.8" do_compile () { diff --git a/packages/samba/samba_3.0.34.bb b/packages/samba/samba_3.0.34.bb index 69cf6b474c..d43c50dcdb 100644 --- a/packages/samba/samba_3.0.34.bb +++ b/packages/samba/samba_3.0.34.bb @@ -8,14 +8,15 @@ SRC_URI_append_linux-uclibcgnueabi = "file://uclibc-strlcpy-strlcat.patch;patch= PR = "r5" -PACKAGES =+ "smbfs-doc" +PACKAGES =+ " smbfs smbfs-doc" +FILES_smbfs = "${bindir}/smbmount ${bindir}/smbumount ${bindir}/smbmnt ${base_sbindir}/mount.smbfs ${base_sbindir}/mount.smb" RCONFLICTS_smbfs-doc = "smbfs-ads-doc" - FILES_smbfs-doc = "${mandir}/man8/smbmount.8 ${mandir}/man8/smbumount.8 ${mandir}/man8/smbmnt.8" EXTRA_OECONF += "\ SMB_BUILD_CC_NEGATIVE_ENUM_VALUES=yes \ + --with-smbmount \ " do_stage() { diff --git a/packages/samba/samba_3.2.7.bb b/packages/samba/samba_3.2.8.bb index 49ff24a646..2e2cb959f8 100644 --- a/packages/samba/samba_3.2.7.bb +++ b/packages/samba/samba_3.2.8.bb @@ -1,12 +1,12 @@ require samba.inc require samba-basic.inc -SRC_URI += "file://configure-3.2.7.patch;patch=1 \ +SRC_URI += "file://configure-3.2.8.patch;patch=1 \ file://config-h.patch;patch=1 \ file://mtab.patch;patch=1 \ " -PR = "r4" +PR = "r1" EXTRA_OECONF += "\ SMB_BUILD_CC_NEGATIVE_ENUM_VALUES=yes \ diff --git a/packages/samba/samba_3.3.0.bb b/packages/samba/samba_3.3.0.bb index 49432ec843..6270c8c0d7 100644 --- a/packages/samba/samba_3.3.0.bb +++ b/packages/samba/samba_3.3.0.bb @@ -12,7 +12,7 @@ SRC_URI += "file://configure-3.3.0.patch;patch=1 \ file://mtab.patch;patch=1 \ " -PR = "r1" +PR = "r2" EXTRA_OECONF += "\ SMB_BUILD_CC_NEGATIVE_ENUM_VALUES=yes \ diff --git a/packages/slugos-init/files/setup-optware.sh b/packages/slugos-init/files/setup-optware.sh new file mode 100644 index 0000000000..d4ae619491 --- /dev/null +++ b/packages/slugos-init/files/setup-optware.sh @@ -0,0 +1,17 @@ +#!/bin/sh + +if test 0 != `id -u`; then + echo 'Please run as root' + exit 1 +fi + +optware_target=slugos5be +feed=http://ipkg.nslu2-linux.org/feeds/optware/${optware_target}/cross/unstable +latest_xsh=`wget -q -O- ${feed} | grep '\.xsh' | sed -e 's/.*xsh">//' -e 's/<.*//'` + +if test -n "${latest_xsh}"; then + cd /tmp + rm -f ${latest_xsh} + wget ${feed}/${latest_xsh} + sh ${latest_xsh} +fi diff --git a/packages/slugos-init/slugos-init_5.0.bb b/packages/slugos-init/slugos-init_5.0.bb index 7d4769d6e9..beeaa34135 100644 --- a/packages/slugos-init/slugos-init_5.0.bb +++ b/packages/slugos-init/slugos-init_5.0.bb @@ -4,7 +4,7 @@ PRIORITY = "required" LICENSE = "GPL" DEPENDS = "base-files devio" RDEPENDS = "busybox devio" -PR = "r9" +PR = "r10" SRC_URI = "file://boot/flash \ file://boot/disk \ @@ -27,6 +27,7 @@ SRC_URI = "file://boot/flash \ file://conffiles \ file://sysconf \ file://leds \ + file://setup-optware.sh \ file://turnup \ file://reflash \ file://usb \ @@ -35,7 +36,7 @@ SRC_URI = "file://boot/flash \ SBINPROGS = "" USRSBINPROGS = "" CPROGS = "${USRSBINPROGS} ${SBINPROGS}" -SCRIPTS = "turnup leds sysconf" +SCRIPTS = "turnup leds sysconf setup-optware.sh" BOOTSCRIPTS = "flash disk nfs ram network udhcpc.script" INITSCRIPTS = "syslog.buffer syslog.file syslog.network zleds\ leds_startup rmrecovery sysconfsetup umountinitrd.sh\ diff --git a/packages/sun-jre/sun-jre6_1.6.0.10.bb b/packages/sun-jre/sun-jre6_1.6.0.10.bb new file mode 100644 index 0000000000..f67894c39a --- /dev/null +++ b/packages/sun-jre/sun-jre6_1.6.0.10.bb @@ -0,0 +1,71 @@ +DESCRIPTION = "Sun J2SE Runtime Environment" +LICENSE = "Sun Binary Code License Agreement" +RDEPENDS_${PN} += "libx11-locale" +RDEPENDS_${PN}-plugin += "${PN}" +PR = "r1" +PRIVATE_LIBS = "${@base_read_file('${WORKDIR}/${SD}.shlibs')}" + +SRC_URI = "http://download.java.net/dlj/binaries/jdk-6u10-dlj-linux-i586.bin" + +SP = "jdk-6u10-dlj-linux-i586.bin" +SD = "jdk1.6.0_10" +S = "${WORKDIR}" + +do_install() { + export MORE=10000 + sh ${WORKDIR}/${SP} --accept-license >/dev/null + chmod -R go=u-w ${SD} + chmod -R u+w ${SD} + mkdir -p ${D}${libdir}/sun-java6-${PV} + mv ${S}/${SD}/jre/* ${D}${libdir}/sun-java6-${PV} + mkdir -p ${D}${libdir}/mozilla/plugins + cd ${D}${libdir}/mozilla/plugins + ln -s ${libdir}/sun-java6-${PV}/plugin/i386/ns7/libjavaplugin_oji.so . + cd ${D}${libdir}/sun-java6-${PV} + for p in `find . -name '*.pack'`; do + ./bin/unpack200 $p $(echo $p | sed 's,.pack$,.jar,g') || exit 1 + rm $p + done + for i in bin/ControlPanel \ + bin/javaws \ + bin/jcontrol \ + bin/keytool \ + bin/orbd \ + bin/pack200 \ + bin/policytool \ + bin/rmid \ + bin/rmiregistry \ + bin/servertool \ + bin/tnameserv \ + bin/unpack200 + do + rm $i + done + rm -rf javaws lib/javaws* + rm -rf plugin/desktop plugin/i386/ns7-gcc29 + rm -f lib/fontconfig.*.bfc lib/fontconfig.*.properties.src + rm -f lib/javaws.jar lib/ext/ldapsec.jar lib/cmm/PYCC.pf \ + lib/audio/soundbank.gm + rm -rf lib/i386/server lib/i386/motif21 lib/i386/client/classes.jsa \ + lib/i386/libjavaplugin_nscp_gcc29.so \ + lib/i386/headless + rm -rf fonts oblique-fonts man + rm -rf lib/locale lib/zi lib/management + rm -rf lib/desktop LICENSE README COPYRIGHT THIRDPARTYLICENSEREADME.txt \ + Welcome.html + # Find out what shared libs we contain and spit it out to a file + find . -name "*.so" -exec basename {} \; | sort | uniq > ${WORKDIR}/${SD}.shlibs +} + +PACKAGES =+ "${PN}-plugin" +FILES_${PN} = "/usr/" +FILES_${PN}-dbg += "/usr/*/.debug /usr/*/*/.debug /usr/*/*/*/.debug /usr/*/*/*/*/.debug /usr/*/*/*/*/*/.debug" +FILES_${PN}-plugin = "${libdir}/mozilla/plugins/* ${libdir}/sun-java6-${PV}/plugin/i386/ns7/libjavaplugin_oji.so" + +pkg_postinst_${PN} () { + grep -v JAVA_HOME /etc/environment > /etc/environment.new + mv /etc/environment.new /etc/environment + echo "JAVA_HOME=\"${libdir}/sun-java6-${PV}\"" >> /etc/environment +} + +COMPATIBLE_HOST = "i.86.*-linux" diff --git a/packages/tasks/task-base.bb b/packages/tasks/task-base.bb index 504332f9a5..c60ae4ff0b 100644 --- a/packages/tasks/task-base.bb +++ b/packages/tasks/task-base.bb @@ -61,6 +61,15 @@ HOTPLUG ?= "${@base_contains("MACHINE_FEATURES", "kernel24", "linux-hotplug","" DISTRO_SSH_DAEMON ?= "dropbear" # +# bluetooth manager +# +DISTRO_BLUETOOTH_MANAGER ?= "\ + blueprobe \ + bluez-utils \ + bluez-utils-compat \ + " + +# # pcmciautils for >= 2.6.13-rc1, pcmcia-cs for others # PCMCIA_MANAGER ?= "${@base_contains('MACHINE_FEATURES', 'kernel26','pcmciautils','pcmcia-cs',d)} " @@ -234,10 +243,8 @@ task-base-pcmcia26 = "\ # Provide bluez-utils-compat utils for the time being, the binaries in that package will vanish soon from upstream releases, so beware! -RDEPENDS_task-base-bluetooth = "\ - blueprobe \ - bluez-utils \ - bluez-utils-compat \ +RDEPENDS_task-base-bluetooth = "\ + ${DISTRO_BLUETOOTH_MANAGER} \ " RRECOMMENDS_task-base-bluetooth = "\ diff --git a/packages/tasks/task-boot.bb b/packages/tasks/task-boot.bb index 3d69256e64..1a74f15ad1 100644 --- a/packages/tasks/task-boot.bb +++ b/packages/tasks/task-boot.bb @@ -1,5 +1,5 @@ DESCRIPTION = "Basic task to get a device booting" -PR = "r47" +PR = "r48" inherit task diff --git a/packages/tasks/task-openmoko-feed.bb b/packages/tasks/task-openmoko-feed.bb index 97807cc279..9a9e385cfa 100644 --- a/packages/tasks/task-openmoko-feed.bb +++ b/packages/tasks/task-openmoko-feed.bb @@ -1,7 +1,7 @@ DESCRIPTION = "Openmoko: Misc. Feed Items" SECTION = "openmoko/base" LICENSE = "MIT" -PR = "r60" +PR = "r61" inherit task @@ -29,7 +29,8 @@ RDEPENDS_task-openmoko-feed = "\ ntpclient ntp \ openssh openssh-scp openssh-ssh openssh-sshd openssh-sftp openssh-misc \ python python-pygtk python-pyserial python-gst python-pygame \ - python-lightblue python-pybluez \ +# python-lightblue \ + python-pybluez \ obexpush \ ruby \ libsdl-x11 libsdl-mixer libsdl-net libsdl-ttf \ diff --git a/packages/tasks/task-slugos-toolchain-target.bb b/packages/tasks/task-slugos-toolchain-target.bb new file mode 100644 index 0000000000..489a41213b --- /dev/null +++ b/packages/tasks/task-slugos-toolchain-target.bb @@ -0,0 +1,32 @@ +DESCRIPTION = "Packages for a standalone SDK or external toolchain" +LICENSE = "MIT" +ALLOW_EMPTY = "1" + +PR = "r1" + +PACKAGES = "${PN}" + +# Stuff contained in this SDK is largely taken from task-sdk-base.bb. +# This is a starting point, and nothing more at present -- please fill +# this out with a reasonable set of development tools for a SlugOS image. +# Also feel free to remove stuff that's silly. + +RDEPENDS_${PN} = "\ + libgcc \ + linux-libc-headers-dev \ + libssl \ + libcrypto \ + openssl-dev \ + libstdc++ \ + " + +# Not sure if we need these or not... +NOT_SURE_ABOUT = "\ + libsegfault \ + " + +# This one needs further investigation; seems to be some sort +# of naming problem that breaks the SDK when it is added directly. +ODDLY_BROKEN_PACKAGES ="\ + libz-dev \ + " diff --git a/packages/tnef/tnef.inc b/packages/tnef/tnef.inc new file mode 100644 index 0000000000..2da8960e0d --- /dev/null +++ b/packages/tnef/tnef.inc @@ -0,0 +1,7 @@ +DESCRIPTION = "TNEF is a program for unpacking ms-tnef type MIME attachments" +SECTION = "net" +LICENSE = "GPL" + +SRC_URI = "${SOURCEFORGE_MIRROR}/tnef/tnef-${PV}.tar.gz" + +inherit autotools diff --git a/packages/tnef/tnef_1.4.5.bb b/packages/tnef/tnef_1.4.5.bb new file mode 100644 index 0000000000..cec39d84d1 --- /dev/null +++ b/packages/tnef/tnef_1.4.5.bb @@ -0,0 +1,3 @@ +require tnef.inc + +PR = "r0" diff --git a/packages/u-boot/u-boot-1.3.2/boc01/001-090115-SPI.patch b/packages/u-boot/u-boot-1.3.2/boc01/001-090205-SPI.patch index 96b624b3a1..6c0ed5c36a 100644 --- a/packages/u-boot/u-boot-1.3.2/boc01/001-090115-SPI.patch +++ b/packages/u-boot/u-boot-1.3.2/boc01/001-090205-SPI.patch @@ -1,7 +1,7 @@ Index: u-boot-1.3.2/board/freescale/mpc8313erdb/mpc8313erdb.c =================================================================== ---- u-boot-1.3.2.orig/board/freescale/mpc8313erdb/mpc8313erdb.c 2009-01-15 10:51:45.000000000 +0100 -+++ u-boot-1.3.2/board/freescale/mpc8313erdb/mpc8313erdb.c 2009-01-15 12:18:31.000000000 +0100 +--- u-boot-1.3.2.orig/board/freescale/mpc8313erdb/mpc8313erdb.c ++++ u-boot-1.3.2/board/freescale/mpc8313erdb/mpc8313erdb.c @@ -28,6 +28,7 @@ #endif #include <pci.h> @@ -10,7 +10,7 @@ Index: u-boot-1.3.2/board/freescale/mpc8313erdb/mpc8313erdb.c DECLARE_GLOBAL_DATA_PTR; -@@ -107,3 +108,29 @@ +@@ -107,3 +108,33 @@ void ft_board_setup(void *blob, bd_t *bd #endif } #endif @@ -21,12 +21,16 @@ Index: u-boot-1.3.2/board/freescale/mpc8313erdb/mpc8313erdb.c + */ +#ifdef CONFIG_HARD_SPI + -+void spi_rfid_chipsel(int cs) ++#define SPI_CS_MASK 0x80000000 ++ ++void spi_eeprom_chipsel(int cs) +{ -+ if(cs) -+ gpio_clear(14); ++ volatile gpio83xx_t *iopd = &((immap_t *)CFG_IMMR)->gpio[0]; ++ ++ if (cs) ++ iopd->dat &= ~SPI_CS_MASK; + else -+ gpio_set(14); ++ iopd->dat |= SPI_CS_MASK; +} + +/* @@ -34,7 +38,7 @@ Index: u-boot-1.3.2/board/freescale/mpc8313erdb/mpc8313erdb.c + * chip selects. + */ +spi_chipsel_type spi_chipsel[] = { -+ spi_rfid_chipsel, ++ spi_eeprom_chipsel, +}; +int spi_chipsel_cnt = sizeof(spi_chipsel) / sizeof(spi_chipsel[0]); + @@ -42,8 +46,8 @@ Index: u-boot-1.3.2/board/freescale/mpc8313erdb/mpc8313erdb.c + Index: u-boot-1.3.2/include/configs/MPC8313ERDB.h =================================================================== ---- u-boot-1.3.2.orig/include/configs/MPC8313ERDB.h 2009-01-15 10:51:51.000000000 +0100 -+++ u-boot-1.3.2/include/configs/MPC8313ERDB.h 2009-01-15 12:16:57.000000000 +0100 +--- u-boot-1.3.2.orig/include/configs/MPC8313ERDB.h ++++ u-boot-1.3.2/include/configs/MPC8313ERDB.h @@ -369,6 +369,7 @@ #define CONFIG_CMD_PCI #define CONFIG_CMD_NAND @@ -66,8 +70,8 @@ Index: u-boot-1.3.2/include/configs/MPC8313ERDB.h */ Index: u-boot-1.3.2/drivers/spi/mpc8xxx_spi.c =================================================================== ---- u-boot-1.3.2.orig/drivers/spi/mpc8xxx_spi.c 2009-01-15 10:52:30.000000000 +0100 -+++ u-boot-1.3.2/drivers/spi/mpc8xxx_spi.c 2009-01-15 10:53:23.000000000 +0100 +--- u-boot-1.3.2.orig/drivers/spi/mpc8xxx_spi.c ++++ u-boot-1.3.2/drivers/spi/mpc8xxx_spi.c @@ -34,6 +34,8 @@ #define SPI_MODE_REV (0x80000000 >> 5) /* Reverse mode - MSB first */ #define SPI_MODE_MS (0x80000000 >> 6) /* Always master */ @@ -77,7 +81,7 @@ Index: u-boot-1.3.2/drivers/spi/mpc8xxx_spi.c #define SPI_TIMEOUT 1000 -@@ -45,9 +47,7 @@ +@@ -45,9 +47,7 @@ void spi_init(void) * SPI pins on the MPC83xx are not muxed, so all we do is initialize * some registers */ diff --git a/packages/u-boot/u-boot-1.3.2/boc01/010-081212-LCD.patch b/packages/u-boot/u-boot-1.3.2/boc01/010-081212-LCD.patch index 07c7b3840a..33a0c761f9 100644 --- a/packages/u-boot/u-boot-1.3.2/boc01/010-081212-LCD.patch +++ b/packages/u-boot/u-boot-1.3.2/boc01/010-081212-LCD.patch @@ -181,7 +181,7 @@ Index: u-boot-1.3.2/common/cmd_lcd.c =================================================================== --- /dev/null +++ u-boot-1.3.2/common/cmd_lcd.c -@@ -0,0 +1,243 @@ +@@ -0,0 +1,237 @@ +/* + * (C) Copyright 2008 + * Alexandre Coffignal, CénoSYS, alexandre.coffignal@cenosys.com @@ -216,13 +216,6 @@ Index: u-boot-1.3.2/common/cmd_lcd.c +#define DELAY 1 +#define AEL 0x0F + -+static void NT7506_init_lcd(char ael); -+static void NT7506_print_splash(char * Picture,char width,char height); -+static void NT7506_set_xaddr(unsigned char x); -+static void NT7506_set_yaddr(unsigned char y); -+static void NT7506_writeb_data(unsigned char value); -+static void NT7506_writeb_ctl(unsigned char value); -+static void iowrite16(unsigned short value); + +static void iowrite16(unsigned short value) +{ @@ -269,7 +262,7 @@ Index: u-boot-1.3.2/common/cmd_lcd.c + NT7506_writeb_ctl(NT_COL_LSB | (x & 0x0F) ); //Send low nibble +} + -+static void ImageRota(char * src,char * dest, int w ,int h) ++static void ImageRota(unsigned char *src, unsigned char *dest, int w ,int h) +{ + int i,j,bit,IndexRead; + char mask=0; @@ -290,14 +283,13 @@ Index: u-boot-1.3.2/common/cmd_lcd.c +} + + -+static void NT7506_print_splash(char * picture,char width,char height) ++static void NT7506_print_splash(unsigned char *picture, char width, char height) +{ + int i; -+ char value; -+ char imagerota[2048]; ++ unsigned char imagerota[2048]; + int indeximage=0; + -+ int x,y,xfb,yfb,Index; ++ int x,y,xfb,yfb; + char src[2048]; + if(width>128) + width=128; @@ -379,7 +371,7 @@ Index: u-boot-1.3.2/common/cmd_lcd.c + + +/**************************************************/ -+void do_lcd(cmd_tbl_t * cmdtp, int flag, int argc, char *argv[]) ++int do_lcd(cmd_tbl_t * cmdtp, int flag, int argc, char *argv[]) +{ + char lcd_ael=AEL; + if(argc>1) @@ -390,6 +382,8 @@ Index: u-boot-1.3.2/common/cmd_lcd.c + + NT7506_init_lcd(lcd_ael); + NT7506_print_splash(Bollore_bits,Bollore_width,Bollore_height); ++ ++ return 0; +} + +U_BOOT_CMD( @@ -398,7 +392,7 @@ Index: u-boot-1.3.2/common/cmd_lcd.c + "lcd\n" +); + -+void do_backlight(cmd_tbl_t * cmdtp, int flag, int argc, char *argv[]) ++int do_backlight(cmd_tbl_t * cmdtp, int flag, int argc, char *argv[]) +{ + if (!strncmp(argv[1], "on", 7)) + { diff --git a/packages/u-boot/u-boot-1.3.2/boc01/013-081211-FIX_OOB_8BITS_LARGEPAGE_NAND.patch b/packages/u-boot/u-boot-1.3.2/boc01/013-081211-FIX_OOB_8BITS_LARGEPAGE_NAND.patch deleted file mode 100644 index 911dd2907e..0000000000 --- a/packages/u-boot/u-boot-1.3.2/boc01/013-081211-FIX_OOB_8BITS_LARGEPAGE_NAND.patch +++ /dev/null @@ -1,17 +0,0 @@ -Index: u-boot-1.3.2/drivers/mtd/nand/nand_bbt.c -=================================================================== ---- u-boot-1.3.2.orig/drivers/mtd/nand/nand_bbt.c 2008-12-11 10:15:52.000000000 +0100 -+++ u-boot-1.3.2/drivers/mtd/nand/nand_bbt.c 2008-12-11 10:16:39.000000000 +0100 -@@ -914,10 +914,11 @@ - .pattern = scan_ff_pattern - }; - -+//Samsung makes sure that either the 1st or 2nd page of every initial invalid block has non-FFh data at the column address of 2048. - static struct nand_bbt_descr largepage_memorybased = { - .options = 0, - .offs = 0, -- .len = 2, -+ .len = 1, - .pattern = scan_ff_pattern - }; - diff --git a/packages/u-boot/u-boot-1.3.2/boc01/013-090206-FIX_OOB_8BITS_LARGEPAGE_NAND.patch b/packages/u-boot/u-boot-1.3.2/boc01/013-090206-FIX_OOB_8BITS_LARGEPAGE_NAND.patch new file mode 100644 index 0000000000..803b46d8e9 --- /dev/null +++ b/packages/u-boot/u-boot-1.3.2/boc01/013-090206-FIX_OOB_8BITS_LARGEPAGE_NAND.patch @@ -0,0 +1,29 @@ +Index: u-boot-1.3.2/drivers/mtd/nand/nand_bbt.c +=================================================================== +--- u-boot-1.3.2.orig/drivers/mtd/nand/nand_bbt.c 2008-03-09 16:20:02.000000000 +0100 ++++ u-boot-1.3.2/drivers/mtd/nand/nand_bbt.c 2009-02-06 14:50:35.000000000 +0100 +@@ -914,10 +914,11 @@ + .pattern = scan_ff_pattern + }; + ++//Samsung makes sure that either the 1st or 2nd page of every initial invalid block has non-FFh data at the column address of 2048. + static struct nand_bbt_descr largepage_memorybased = { + .options = 0, + .offs = 0, +- .len = 2, ++ .len = 1, + .pattern = scan_ff_pattern + }; + +Index: u-boot-1.3.2/include/configs/MPC8313ERDB.h +=================================================================== +--- u-boot-1.3.2.orig/include/configs/MPC8313ERDB.h 2009-02-06 15:42:07.000000000 +0100 ++++ u-boot-1.3.2/include/configs/MPC8313ERDB.h 2009-02-06 15:42:45.000000000 +0100 +@@ -205,6 +205,7 @@ + | BR_MS_FCM /* MSEL = FCM */ \ + | BR_V ) /* valid */ + #define CFG_OR1_PRELIM ( 0xFFFF8000 /* length 32K */ \ ++ | OR_FCM_PGS \ + | OR_FCM_CSCT \ + | OR_FCM_CST \ + | OR_FCM_CHT \ diff --git a/packages/u-boot/u-boot-1.3.2/boc01/014-081211-BOOT_RESCUE.patch b/packages/u-boot/u-boot-1.3.2/boc01/014-081211-BOOT_RESCUE.patch index e18055e64c..d2ebdef772 100644 --- a/packages/u-boot/u-boot-1.3.2/boc01/014-081211-BOOT_RESCUE.patch +++ b/packages/u-boot/u-boot-1.3.2/boc01/014-081211-BOOT_RESCUE.patch @@ -2,7 +2,15 @@ Index: u-boot-1.3.2/common/main.c =================================================================== --- u-boot-1.3.2.orig/common/main.c +++ u-boot-1.3.2/common/main.c -@@ -377,6 +377,15 @@ void main_loop (void) +@@ -39,6 +39,7 @@ + #endif + + #include <post.h> ++#include <gpio.h> + + #ifdef CONFIG_SILENT_CONSOLE + DECLARE_GLOBAL_DATA_PTR; +@@ -377,6 +378,15 @@ void main_loop (void) } else #endif /* CONFIG_BOOTCOUNT_LIMIT */ @@ -22,7 +30,7 @@ Index: u-boot-1.3.2/include/configs/MPC8313ERDB.h =================================================================== --- u-boot-1.3.2.orig/include/configs/MPC8313ERDB.h +++ u-boot-1.3.2/include/configs/MPC8313ERDB.h -@@ -405,6 +405,7 @@ +@@ -406,6 +406,7 @@ #define PRE_INIT_GPIO 0x28 #define INIT_GPIO 0x08 #define MAX_GPIO_OUT 7 @@ -30,7 +38,7 @@ Index: u-boot-1.3.2/include/configs/MPC8313ERDB.h /* Digital Thermometer and Thermostat */ #define CONFIG_DTT_LM73 1 -@@ -558,6 +559,7 @@ +@@ -559,6 +560,7 @@ * Environment Configuration */ #define CONFIG_ENV_OVERWRITE diff --git a/packages/u-boot/u-boot-1.3.2/boc01/015-090205-EMC.patch b/packages/u-boot/u-boot-1.3.2/boc01/015-090205-EMC.patch new file mode 100644 index 0000000000..afc43c47ed --- /dev/null +++ b/packages/u-boot/u-boot-1.3.2/boc01/015-090205-EMC.patch @@ -0,0 +1,31 @@ +Index: u-boot-1.3.2/board/freescale/mpc8313erdb/mpc8313erdb.c +=================================================================== +--- u-boot-1.3.2.orig/board/freescale/mpc8313erdb/mpc8313erdb.c ++++ u-boot-1.3.2/board/freescale/mpc8313erdb/mpc8313erdb.c +@@ -135,8 +135,9 @@ void pci_init_board(void) + struct pci_region *reg[] = { pci_regions }; + int warmboot; + +- /* Enable all 3 PCI_CLK_OUTPUTs. */ +- clk->occr |= 0xe0000000; ++ /* Enable PCI_CLK_OUTPUT 1 only. ++ Disable others for better EMC footprint. */ ++ clk->occr = (clk->occr & 0x1fffffff) | OCCR_PCICOE1; + + /* + * Configure PCI Local Access Windows +Index: u-boot-1.3.2/include/configs/MPC8313ERDB.h +=================================================================== +--- u-boot-1.3.2.orig/include/configs/MPC8313ERDB.h ++++ u-boot-1.3.2/include/configs/MPC8313ERDB.h +@@ -133,8 +133,8 @@ + #define CFG_DDR_CLK_CNTL DDR_SDRAM_CLK_CNTL_CLK_ADJUST_05 + /*0x02000000*/ + #define CFG_DDRCDR_VALUE ( DDRCDR_EN \ +- | DDRCDR_PZ_NOMZ \ +- | DDRCDR_NZ_NOMZ \ ++ | DDRCDR_PZ_MAXZ \ ++ | DDRCDR_NZ_MAXZ \ + | DDRCDR_M_ODR ) + + /* diff --git a/packages/u-boot/u-boot-1.3.2/boc01/016-090209-PM.patch b/packages/u-boot/u-boot-1.3.2/boc01/016-090209-PM.patch new file mode 100644 index 0000000000..940e4ae40c --- /dev/null +++ b/packages/u-boot/u-boot-1.3.2/boc01/016-090209-PM.patch @@ -0,0 +1,56 @@ +Index: u-boot-1.3.2/include/configs/MPC8313ERDB.h +=================================================================== +--- u-boot-1.3.2.orig/include/configs/MPC8313ERDB.h ++++ u-boot-1.3.2/include/configs/MPC8313ERDB.h +@@ -60,7 +60,7 @@ + * to access the PMC registers, unless a JTAG debugger is + * connected, or some resistor modifications are made. + */ +-#define CFG_8313ERDB_BROKEN_PMC 1 ++#undef CFG_8313ERDB_BROKEN_PMC + + #define CFG_ACR_PIPE_DEP 3 /* Arbiter pipeline depth (0-3) */ + #define CFG_ACR_RPTCNT 3 /* Arbiter repeat count (0-7) */ +Index: u-boot-1.3.2/board/freescale/mpc8313erdb/mpc8313erdb.c +=================================================================== +--- u-boot-1.3.2.orig/board/freescale/mpc8313erdb/mpc8313erdb.c ++++ u-boot-1.3.2/board/freescale/mpc8313erdb/mpc8313erdb.c +@@ -30,6 +30,7 @@ + #include <mpc83xx.h> + #include <spi.h> + #include <gpio.h> ++#include <asm/processor.h> + + DECLARE_GLOBAL_DATA_PTR; + +@@ -39,7 +40,29 @@ int board_early_init_f(void) + volatile immap_t *im = (immap_t *)CFG_IMMR; + + if (im->pmc.pmccr1 & PMCCR1_POWER_OFF) +- gd->flags |= GD_FLG_SILENT; ++ { ++ volatile immap_t *immap = (immap_t *) CFG_IMMR; ++ ulong msr; ++ /* Interrupts and MMU off */ ++ __asm__ __volatile__ ("mfmsr %0":"=r" (msr):); ++ ++ msr &= ~( MSR_EE | MSR_IR | MSR_DR); ++ __asm__ __volatile__ ("mtmsr %0"::"r" (msr)); ++ ++ /* enable Reset Control Reg */ ++ immap->reset.rpr = 0x52535445; ++ __asm__ __volatile__ ("sync"); ++ __asm__ __volatile__ ("isync"); ++ ++ /* confirm Reset Control Reg is enabled */ ++ while(!((immap->reset.rcer) & RCER_CRE)); ++ ++ udelay(200); ++ ++ /* perform reset, only one bit */ ++ immap->reset.rcr = RCR_SWHR; ++ } ++ + #endif + + return 0; diff --git a/packages/u-boot/u-boot_1.3.2.bb b/packages/u-boot/u-boot_1.3.2.bb index 003838a670..0ed92c70b8 100644 --- a/packages/u-boot/u-boot_1.3.2.bb +++ b/packages/u-boot/u-boot_1.3.2.bb @@ -2,7 +2,7 @@ require u-boot.inc DEFAULT_PREFERENCE = "-1" -PR = "r9" +PR = "r10" SRC_URI = "ftp://ftp.denx.de/pub/u-boot/u-boot-${PV}.tar.bz2" @@ -22,9 +22,10 @@ SRC_URI_append_boc01 = "\ file://mpc8313e-rdb-nand.patch;patch=1 \ file://mpc8313e-rdb-mtdparts.patch;patch=1 \ file://mpc8313e-rdb-eeprom.patch;patch=1 \ - file://001-090115-SPI.patch;patch=1 \ + file://001-090205-SPI.patch;patch=1 \ file://002-081212-GPIO.patch;patch=1 \ file://003-081205-DTT_LM73.patch;patch=1 \ + file://004-081205-WATCHDOG.patch;patch=1 \ file://006-081211-EEPROM_M24C32.patch;patch=1 \ file://007-090112-CAPSENSE.patch;patch=1 \ file://008-090107-TSEC.patch;patch=1 \ @@ -32,8 +33,10 @@ SRC_URI_append_boc01 = "\ file://010-081212-LCD.patch;patch=1 \ file://011-081211-CMD_TEST.patch;patch=1 \ file://012-081209-BUG_SETENV.patch;patch=1 \ - file://013-081211-FIX_OOB_8BITS_LARGEPAGE_NAND.patch;patch=1 \ + file://013-090206-FIX_OOB_8BITS_LARGEPAGE_NAND.patch;patch=1 \ file://014-081211-BOOT_RESCUE.patch;patch=1 \ + file://015-090205-EMC.patch;patch=1 \ + file://016-090209-PM.patch;patch=1 \ " PACKAGE_ARCH = "${MACHINE_ARCH}" diff --git a/packages/udev/files/permissions.rules b/packages/udev/files/permissions.rules index 86d771276b..efbe568a2b 100644 --- a/packages/udev/files/permissions.rules +++ b/packages/udev/files/permissions.rules @@ -11,7 +11,6 @@ BUS=="ide", KERNEL=="nht[0-9]*", GROUP="tape" # SCSI devices BUS=="scsi", SYSFS{type}=="1", GROUP="tape" BUS=="scsi", SYSFS{type}=="5", GROUP="cdrom" -BUS=="scsi", SYSFS{type}=="6", GROUP="scanner" # USB devices BUS=="usb", KERNEL=="legousbtower*", MODE="0666" @@ -50,7 +49,6 @@ KERNEL=="inotify", MODE="0666" KERNEL=="sgi_fetchop", MODE="0666" KERNEL=="sonypi", MODE="0666" KERNEL=="agpgart", GROUP="video" -KERNEL=="nvram", GROUP="nvram" KERNEL=="rtc", MODE="0660", GROUP="audio" KERNEL=="cdemu[0-9]*", GROUP="cdrom" diff --git a/packages/udev/udev-092/permissions.rules b/packages/udev/udev-092/permissions.rules index 8da35c3090..99e03b1036 100644 --- a/packages/udev/udev-092/permissions.rules +++ b/packages/udev/udev-092/permissions.rules @@ -21,9 +21,7 @@ BUS=="ide", KERNEL=="nht[0-9]*", GROUP="tape" # SCSI devices BUS=="scsi", SYSFS{type}=="1", GROUP="tape" -BUS=="scsi", SYSFS{type}=="3", SYSFS{vendor}=="HP", GROUP="scanner" BUS=="scsi", SYSFS{type}=="5", GROUP="cdrom" -BUS=="scsi", SYSFS{type}=="6", GROUP="scanner" # USB devices BUS=="usb", KERNEL=="legousbtower*", MODE="0666" @@ -70,18 +68,12 @@ KERNEL=="inotify", MODE="0666" KERNEL=="sgi_fetchop", MODE="0666" KERNEL=="sonypi", MODE="0666" KERNEL=="agpgart", GROUP="video" -KERNEL=="nvram", GROUP="nvram" KERNEL=="rtc", GROUP="audio" -KERNEL=="tpm*", MODE="0600", OWNER="tss", GROUP="tss" -KERNEL=="fuse", GROUP="fuse" KERNEL=="cdemu[0-9]*", GROUP="cdrom" KERNEL=="pktcdvd[0-9]*", GROUP="cdrom" KERNEL=="pktcdvd", MODE="0644" -KERNEL=="uverbs*", GROUP="rdma" -KERNEL=="ucm*", GROUP="rdma" - # printers and parallel devices SUBSYSTEM=="printer", GROUP="lp" SUBSYSTEM=="ppdev", GROUP="lp" diff --git a/packages/udev/udev-097/permissions.rules b/packages/udev/udev-097/permissions.rules index 8da35c3090..99e03b1036 100644 --- a/packages/udev/udev-097/permissions.rules +++ b/packages/udev/udev-097/permissions.rules @@ -21,9 +21,7 @@ BUS=="ide", KERNEL=="nht[0-9]*", GROUP="tape" # SCSI devices BUS=="scsi", SYSFS{type}=="1", GROUP="tape" -BUS=="scsi", SYSFS{type}=="3", SYSFS{vendor}=="HP", GROUP="scanner" BUS=="scsi", SYSFS{type}=="5", GROUP="cdrom" -BUS=="scsi", SYSFS{type}=="6", GROUP="scanner" # USB devices BUS=="usb", KERNEL=="legousbtower*", MODE="0666" @@ -70,18 +68,12 @@ KERNEL=="inotify", MODE="0666" KERNEL=="sgi_fetchop", MODE="0666" KERNEL=="sonypi", MODE="0666" KERNEL=="agpgart", GROUP="video" -KERNEL=="nvram", GROUP="nvram" KERNEL=="rtc", GROUP="audio" -KERNEL=="tpm*", MODE="0600", OWNER="tss", GROUP="tss" -KERNEL=="fuse", GROUP="fuse" KERNEL=="cdemu[0-9]*", GROUP="cdrom" KERNEL=="pktcdvd[0-9]*", GROUP="cdrom" KERNEL=="pktcdvd", MODE="0644" -KERNEL=="uverbs*", GROUP="rdma" -KERNEL=="ucm*", GROUP="rdma" - # printers and parallel devices SUBSYSTEM=="printer", GROUP="lp" SUBSYSTEM=="ppdev", GROUP="lp" diff --git a/packages/udev/udev-100/permissions.rules b/packages/udev/udev-100/permissions.rules index 8da35c3090..99e03b1036 100644 --- a/packages/udev/udev-100/permissions.rules +++ b/packages/udev/udev-100/permissions.rules @@ -21,9 +21,7 @@ BUS=="ide", KERNEL=="nht[0-9]*", GROUP="tape" # SCSI devices BUS=="scsi", SYSFS{type}=="1", GROUP="tape" -BUS=="scsi", SYSFS{type}=="3", SYSFS{vendor}=="HP", GROUP="scanner" BUS=="scsi", SYSFS{type}=="5", GROUP="cdrom" -BUS=="scsi", SYSFS{type}=="6", GROUP="scanner" # USB devices BUS=="usb", KERNEL=="legousbtower*", MODE="0666" @@ -70,18 +68,12 @@ KERNEL=="inotify", MODE="0666" KERNEL=="sgi_fetchop", MODE="0666" KERNEL=="sonypi", MODE="0666" KERNEL=="agpgart", GROUP="video" -KERNEL=="nvram", GROUP="nvram" KERNEL=="rtc", GROUP="audio" -KERNEL=="tpm*", MODE="0600", OWNER="tss", GROUP="tss" -KERNEL=="fuse", GROUP="fuse" KERNEL=="cdemu[0-9]*", GROUP="cdrom" KERNEL=="pktcdvd[0-9]*", GROUP="cdrom" KERNEL=="pktcdvd", MODE="0644" -KERNEL=="uverbs*", GROUP="rdma" -KERNEL=="ucm*", GROUP="rdma" - # printers and parallel devices SUBSYSTEM=="printer", GROUP="lp" SUBSYSTEM=="ppdev", GROUP="lp" diff --git a/packages/udev/udev-124/init b/packages/udev/udev-124/init index b78a07b20f..9e11f08989 100644 --- a/packages/udev/udev-124/init +++ b/packages/udev/udev-124/init @@ -53,7 +53,7 @@ kill_udevd > "/dev/null" 2>&1 else /sbin/udevadm trigger /sbin/udevadm settle - (cd /; tar cf /etc/dev.tar /dev) + (cd /; tar cf /etc/dev.tar dev) fi echo diff --git a/packages/udev/udev-124/permissions.rules b/packages/udev/udev-124/permissions.rules index 205b733292..940d163047 100644 --- a/packages/udev/udev-124/permissions.rules +++ b/packages/udev/udev-124/permissions.rules @@ -32,12 +32,8 @@ KERNEL=="nht[0-9]*", GROUP="tape" # SCSI devices KERNEL=="sr[0-9]*", IMPORT{program}="cdrom_id --export $tempnode" SUBSYSTEMS=="scsi", ATTRS{type}=="1", GROUP="tape" -SUBSYSTEMS=="scsi", ATTRS{type}=="3", ATTRS{vendor}=="HP", GROUP="scanner" -SUBSYSTEMS=="scsi", ATTRS{type}=="3", ATTRS{vendor}=="Epson", GROUP="scanner" -SUBSYSTEMS=="scsi", ATTRS{type}=="3", ATTRS{vendor}=="EPSON", GROUP="scanner" SUBSYSTEMS=="scsi", ATTRS{type}=="4", GROUP="cdrom" SUBSYSTEMS=="scsi", ATTRS{type}=="5", GROUP="cdrom" -SUBSYSTEMS=="scsi", ATTRS{type}=="6", GROUP="scanner" SUBSYSTEMS=="scsi", ATTRS{type}=="8", GROUP="tape" # USB devices @@ -86,22 +82,14 @@ KERNEL=="inotify", MODE="0666" KERNEL=="sgi_fetchop", MODE="0666" KERNEL=="sonypi", MODE="0666" KERNEL=="agpgart", GROUP="video" -KERNEL=="nvram", GROUP="nvram" KERNEL=="rtc|rtc[0-9]*", GROUP="audio" -KERNEL=="tpm*", MODE="0600", OWNER="tss", GROUP="tss" -KERNEL=="fuse", GROUP="fuse" KERNEL=="kqemu", MODE="0666" -KERNEL=="kvm", GROUP="kvm" KERNEL=="tun", MODE="0666", KERNEL=="cdemu[0-9]*", GROUP="cdrom" KERNEL=="pktcdvd[0-9]*", GROUP="cdrom" KERNEL=="pktcdvd", MODE="0644" -KERNEL=="uverbs*", GROUP="rdma" -KERNEL=="ucm*", GROUP="rdma" -KERNEL=="rdma_ucm", GROUP="rdma" - # printers and parallel devices SUBSYSTEM=="printer", GROUP="lp" SUBSYSTEM=="ppdev", GROUP="lp" diff --git a/packages/udev/udev_092.bb b/packages/udev/udev_092.bb index 37b95ca96a..d9f5cbaa68 100644 --- a/packages/udev/udev_092.bb +++ b/packages/udev/udev_092.bb @@ -3,7 +3,7 @@ DESCRIPTION = "udev is a daemon which dynamically creates and removes device nod the hotplug package and requires a kernel not older than 2.6.12." RPROVIDES_${PN} = "hotplug" -PR = "r23" +PR = "r24" SRC_URI = "${KERNELORG_MIRROR}/pub/linux/utils/kernel/hotplug/udev-${PV}.tar.gz \ file://noasmlinkage.patch;patch=1 \ diff --git a/packages/udev/udev_097.bb b/packages/udev/udev_097.bb index e9a26940b3..a3dfa51a21 100644 --- a/packages/udev/udev_097.bb +++ b/packages/udev/udev_097.bb @@ -8,7 +8,7 @@ used to detect the type of a file system and read its metadata." DESCRIPTION_libvolume-id-dev = "libvolume_id development headers, \ needed to link programs with libvolume_id." -PR = "r12" +PR = "r13" SRC_URI = "${KERNELORG_MIRROR}/pub/linux/utils/kernel/hotplug/udev-${PV}.tar.gz \ file://noasmlinkage.patch;patch=1 \ diff --git a/packages/udev/udev_100.bb b/packages/udev/udev_100.bb index b0958c66b1..ef08aa4636 100644 --- a/packages/udev/udev_100.bb +++ b/packages/udev/udev_100.bb @@ -9,7 +9,7 @@ used to detect the type of a file system and read its metadata." DESCRIPTION_libvolume-id-dev = "libvolume_id development headers, \ needed to link programs with libvolume_id." -PR = "r14" +PR = "r15" SRC_URI = "${KERNELORG_MIRROR}/pub/linux/utils/kernel/hotplug/udev-${PV}.tar.gz \ file://noasmlinkage.patch;patch=1 \ diff --git a/packages/udev/udev_124.bb b/packages/udev/udev_124.bb index 77e414ee11..a574014466 100644 --- a/packages/udev/udev_124.bb +++ b/packages/udev/udev_124.bb @@ -3,7 +3,7 @@ DESCRIPTION = "udev is a daemon which dynamically creates and removes device nod the hotplug package and requires a kernel not older than 2.6.12." RPROVIDES_${PN} = "hotplug" -PR = "r12" +PR = "r13" SRC_URI = "http://kernel.org/pub/linux/utils/kernel/hotplug/udev-${PV}.tar.gz \ file://noasmlinkage.patch;patch=1 \ diff --git a/packages/v4l2apps/libv4l_0.5.7.bb b/packages/v4l2apps/libv4l_0.5.8.bb index a53c52f223..a53c52f223 100644 --- a/packages/v4l2apps/libv4l_0.5.7.bb +++ b/packages/v4l2apps/libv4l_0.5.8.bb diff --git a/packages/vala-terminal/vala-terminal_git.bb b/packages/vala-terminal/vala-terminal_git.bb index 00b92de07d..5bc4c79cb2 100644 --- a/packages/vala-terminal/vala-terminal_git.bb +++ b/packages/vala-terminal/vala-terminal_git.bb @@ -1,8 +1,8 @@ DESCRIPTION = "A lightweight Terminal Emulator based on libvte, written in Vala." SECTION = "x11/applications" DEPENDS = "vala-native vte" -PV = "1.0.0.0+gitr${SRCREV}" -PR = "r1" +PV = "1.1.1+gitr${SRCREV}" +PR = "r0" inherit autotools diff --git a/packages/vala/files/expose-bytesarray-struct.patch b/packages/vala/files/expose-bytesarray-struct.patch new file mode 100644 index 0000000000..ea01208967 --- /dev/null +++ b/packages/vala/files/expose-bytesarray-struct.patch @@ -0,0 +1,18 @@ +# +# Necessary to actually use BytesArray. +# Signed-Off: Michael 'Mickey' Lauer <mlauer@vanille-media.de> +# +Index: vala/vapi/glib-2.0.vapi +=================================================================== +--- vala/vapi/glib-2.0.vapi (Revision 2422) ++++ vala/vapi/glib-2.0.vapi (Arbeitskopie) +@@ -3044,6 +3044,9 @@ + public void sort (CompareFunc compare_func); + public void sort_with_data (CompareDataFunc compare_func); + public void set_size (uint length); ++ ++ public uint len; ++ public uint8[] data; + } + + /* N-ary Trees */ diff --git a/packages/vala/vala-native_0.5.6.bb b/packages/vala/vala-native_0.5.6.bb index 8feab501b4..84ed8359c4 100644 --- a/packages/vala/vala-native_0.5.6.bb +++ b/packages/vala/vala-native_0.5.6.bb @@ -1,5 +1,5 @@ require vala_${PV}.bb -PR = "r0" +PR = "r1" inherit native DEPENDS = "glib-2.0-native" diff --git a/packages/vala/vala.inc b/packages/vala/vala.inc index efe2900e28..c6f5aebbef 100644 --- a/packages/vala/vala.inc +++ b/packages/vala/vala.inc @@ -7,15 +7,14 @@ LICENSE = "LGPL" MAJV = "${@bb.data.getVar('PV',d,1)[:3]}" -SRC_URI = "http://download.gnome.org/sources/vala/${MAJV}/vala-${PV}.tar.bz2" +SRC_URI = "\ + http://download.gnome.org/sources/vala/${MAJV}/vala-${PV}.tar.bz2 \ + file://expose-bytesarray-struct.patch;patch=1 \ +" S = "${WORKDIR}/vala-${PV}" -inherit autotools lib_package +inherit autotools autotools_stage lib_package EXTRA_OECONF = "--enable-vapigen" -do_stage() { - autotools_stage_all -} - FILES_${PN}-doc += ${datadir}/devhelp diff --git a/packages/vala/vala_0.5.6.bb b/packages/vala/vala_0.5.6.bb index 8775f1a407..f6ee943617 100644 --- a/packages/vala/vala_0.5.6.bb +++ b/packages/vala/vala_0.5.6.bb @@ -1,2 +1,2 @@ require vala.inc -PR = "r0" +PR = "r1" diff --git a/packages/vlc/vlc.inc b/packages/vlc/vlc.inc index 30c22f800d..511d22675e 100644 --- a/packages/vlc/vlc.inc +++ b/packages/vlc/vlc.inc @@ -30,6 +30,7 @@ EXTRA_OECONF = "\ --enable-hal \ --without-contrib \ --disable-opengl --disable-glx \ + --enable-realrtsp \ ac_cv_path_MOC=${STAGING_BINDIR_NATIVE}/moc4 \ ac_cv_path_RCC=${STAGING_BINDIR_NATIVE}/rcc4 \ ac_cv_path_UIC=${STAGING_BINDIR_NATIVE}/uic4 \ diff --git a/packages/vlc/vlc_0.9.8a.bb b/packages/vlc/vlc_0.9.8a.bb index f98e909926..6127579b67 100644 --- a/packages/vlc/vlc_0.9.8a.bb +++ b/packages/vlc/vlc_0.9.8a.bb @@ -5,7 +5,7 @@ require vlc.inc -PR = "r2" +PR = "r3" # ffmpeg from git (library version => 52) is required # libtool-native must be >= 2.2.4 diff --git a/packages/webkit/webkit-gtk/GNUmakefile.am b/packages/webkit/webkit-gtk/GNUmakefile.am index 7aec061bd2..c74e1fa428 100644 --- a/packages/webkit/webkit-gtk/GNUmakefile.am +++ b/packages/webkit/webkit-gtk/GNUmakefile.am @@ -77,7 +77,7 @@ no_undefined = -no-undefined endif if OS_GNU -version_script = -Wl,--version-script,$(srcdir)/symbols.filter +version_script = -Wl,--version-script,$(srcdir)/autotools/symbols.filter endif # Shared libraries @@ -121,7 +121,7 @@ libJavaScriptCore_la_SOURCES = \ libJavaScriptCore_la_LIBADD = \ $(UNICODE_LIBS) \ - $(GLOBALDEPS_LIBS) \ + $(GLIB_LIBS) \ -lpthread libJavaScriptCore_la_CXXFLAGS = \ @@ -132,7 +132,7 @@ libJavaScriptCore_la_CFLAGS = \ -fstrict-aliasing \ -O3 \ $(global_cflags) \ - $(GLOBALDEPS_CFLAGS) \ + $(GLIB_CFLAGS) \ $(UNICODE_CFLAGS) libJavaScriptCore_la_CPPFLAGS = \ @@ -167,7 +167,7 @@ libWebCore_la_CXXFLAGS = \ libWebCore_la_CFLAGS = \ -fno-strict-aliasing \ $(global_cflags) \ - $(GLOBALDEPS_CFLAGS) \ + $(GLIB_CFLAGS) \ $(UNICODE_CFLAGS) \ $(LIBXML_CFLAGS) \ $(CAIRO_CFLAGS) \ @@ -181,7 +181,8 @@ libWebCore_la_CFLAGS = \ $(GSTREAMER_CFLAGS) \ $(LIBXSLT_CFLAGS) \ $(COVERAGE_CFLAGS) \ - $(HILDON_CFLAGS) + $(HILDON_CFLAGS) \ + $(GEOCLUE_CFLAGS) libWebCore_la_CPPFLAGS = \ $(global_cppflags) \ @@ -194,7 +195,7 @@ libWebCore_la_LIBADD = \ libJavaScriptCore.la \ libWebCoreJS.la \ $(webcore_libadd) \ - $(GLOBALDEPS_LIBS) \ + $(GLIB_LIBS) \ $(LIBXML_LIBS) \ $(CAIRO_LIBS) \ $(PANGO_LIBS) \ @@ -210,6 +211,7 @@ libWebCore_la_LIBADD = \ $(HILDON_LIBS) \ $(JPEG_LIBS) \ $(PNG_LIBS) \ + $(GEOCLUE_LIBS) \ -lpthread # WebKit diff --git a/packages/webkit/webkit-gtk/acinclude.m4 b/packages/webkit/webkit-gtk/acinclude.m4 index 5353429010..e69de29bb2 100644 --- a/packages/webkit/webkit-gtk/acinclude.m4 +++ b/packages/webkit/webkit-gtk/acinclude.m4 @@ -1,359 +0,0 @@ -dnl dolt, a replacement for libtool -dnl Copyright © 2007-2008 Josh Triplett <josh@freedesktop.org> -dnl Copying and distribution of this file, with or without modification, -dnl are permitted in any medium without royalty provided the copyright -dnl notice and this notice are preserved. -dnl -dnl To use dolt, invoke the DOLT macro immediately after the libtool macros. -dnl Optionally, copy this file into acinclude.m4, to avoid the need to have it -dnl installed when running autoconf on your project. - -AC_DEFUN([DOLT], [ -AC_REQUIRE([AC_CANONICAL_HOST]) -# dolt, a replacement for libtool -# Josh Triplett <josh@freedesktop.org> -AC_PATH_PROG(DOLT_BASH, bash) -AC_MSG_CHECKING([if dolt supports this host]) -dolt_supported=yes -if test x$DOLT_BASH = x; then - dolt_supported=no -fi -if test x$GCC != xyes; then - dolt_supported=no -fi -case $host in -i?86-*-linux*|x86_64-*-linux*|powerpc-*-linux* \ -|amd64-*-freebsd*|i?86-*-freebsd*|ia64-*-freebsd*) - pic_options='-fPIC' - ;; -i?86-apple-darwin*) - pic_options='-fno-common' - ;; -*mingw32*) - pic_options='-DDLL_EXPORT' - ;; -*) - dolt_supported=no - ;; -esac -if test x$dolt_supported = xno ; then - AC_MSG_RESULT([no, falling back to libtool]) - LTCOMPILE='$(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(COMPILE)' - LTCXXCOMPILE='$(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXXCOMPILE)' -else - AC_MSG_RESULT([yes, replacing libtool]) - -dnl Start writing out doltcompile. - cat <<__DOLTCOMPILE__EOF__ >doltcompile -#!$DOLT_BASH -__DOLTCOMPILE__EOF__ - cat <<'__DOLTCOMPILE__EOF__' >>doltcompile -args=("$[]@") -for ((arg=0; arg<${#args@<:@@@:>@}; arg++)) ; do - if test x"${args@<:@$arg@:>@}" = x-o ; then - objarg=$((arg+1)) - break - fi -done -if test x$objarg = x ; then - echo 'Error: no -o on compiler command line' 1>&2 - exit 1 -fi -lo="${args@<:@$objarg@:>@}" -obj="${lo%.lo}" -if test x"$lo" = x"$obj" ; then - echo "Error: libtool object file name \"$lo\" does not end in .lo" 1>&2 - exit 1 -fi -objbase="${obj##*/}" -__DOLTCOMPILE__EOF__ - -dnl Write out shared compilation code. - if test x$enable_shared = xyes; then - cat <<'__DOLTCOMPILE__EOF__' >>doltcompile -libobjdir="${obj%$objbase}.libs" -if test ! -d "$libobjdir" ; then - mkdir_out="$(mkdir "$libobjdir" 2>&1)" - mkdir_ret=$? - if test "$mkdir_ret" -ne 0 && test ! -d "$libobjdir" ; then - echo "$mkdir_out" 1>&2 - exit $mkdir_ret - fi -fi -pic_object="$libobjdir/$objbase.o" -args@<:@$objarg@:>@="$pic_object" -__DOLTCOMPILE__EOF__ - cat <<__DOLTCOMPILE__EOF__ >>doltcompile -"\${args@<:@@@:>@}" $pic_options -DPIC || exit \$? -__DOLTCOMPILE__EOF__ - fi - -dnl Write out static compilation code. -dnl Avoid duplicate compiler output if also building shared objects. - if test x$enable_static = xyes; then - cat <<'__DOLTCOMPILE__EOF__' >>doltcompile -non_pic_object="$obj.o" -args@<:@$objarg@:>@="$non_pic_object" -__DOLTCOMPILE__EOF__ - if test x$enable_shared = xyes; then - cat <<'__DOLTCOMPILE__EOF__' >>doltcompile -"${args@<:@@@:>@}" >/dev/null 2>&1 || exit $? -__DOLTCOMPILE__EOF__ - else - cat <<'__DOLTCOMPILE__EOF__' >>doltcompile -"${args@<:@@@:>@}" || exit $? -__DOLTCOMPILE__EOF__ - fi - fi - -dnl Write out the code to write the .lo file. -dnl The second line of the .lo file must match "^# Generated by .*libtool" - cat <<'__DOLTCOMPILE__EOF__' >>doltcompile -{ -echo "# $lo - a libtool object file" -echo "# Generated by doltcompile, not libtool" -__DOLTCOMPILE__EOF__ - - if test x$enable_shared = xyes; then - cat <<'__DOLTCOMPILE__EOF__' >>doltcompile -echo "pic_object='.libs/${objbase}.o'" -__DOLTCOMPILE__EOF__ - else - cat <<'__DOLTCOMPILE__EOF__' >>doltcompile -echo pic_object=none -__DOLTCOMPILE__EOF__ - fi - - if test x$enable_static = xyes; then - cat <<'__DOLTCOMPILE__EOF__' >>doltcompile -echo "non_pic_object='${objbase}.o'" -__DOLTCOMPILE__EOF__ - else - cat <<'__DOLTCOMPILE__EOF__' >>doltcompile -echo non_pic_object=none -__DOLTCOMPILE__EOF__ - fi - - cat <<'__DOLTCOMPILE__EOF__' >>doltcompile -} > "$lo" -__DOLTCOMPILE__EOF__ - -dnl Done writing out doltcompile; substitute it for libtool compilation. - chmod +x doltcompile - LTCOMPILE='$(top_builddir)/doltcompile $(COMPILE)' - LTCXXCOMPILE='$(top_builddir)/doltcompile $(CXXCOMPILE)' - -dnl automake ignores LTCOMPILE and LTCXXCOMPILE when it has separate CFLAGS for -dnl a target, so write out a libtool wrapper to handle that case. -dnl Note that doltlibtool does not handle inferred tags or option arguments -dnl without '=', because automake does not use them. - cat <<__DOLTLIBTOOL__EOF__ > doltlibtool -#!$DOLT_BASH -__DOLTLIBTOOL__EOF__ - cat <<'__DOLTLIBTOOL__EOF__' >>doltlibtool -top_builddir_slash="${0%%doltlibtool}" -: ${top_builddir_slash:=./} -args=() -modeok=false -tagok=false -for arg in "$[]@"; do - case "$arg" in - --mode=compile) modeok=true ;; - --tag=CC|--tag=CXX) tagok=true ;; - *) args@<:@${#args[@]}@:>@="$arg" ;; - esac -done -if $modeok && $tagok ; then - . ${top_builddir_slash}doltcompile "${args@<:@@@:>@}" -else - exec ${top_builddir_slash}libtool "$[]@" -fi -__DOLTLIBTOOL__EOF__ - -dnl Done writing out doltlibtool; substitute it for libtool. - chmod +x doltlibtool - LIBTOOL='$(top_builddir)/doltlibtool' -fi -AC_SUBST(LTCOMPILE) -AC_SUBST(LTCXXCOMPILE) -# end dolt -]) - -# =========================================================================== -# http://autoconf-archive.cryp.to/ax_compare_version.html -# =========================================================================== -# -# SYNOPSIS -# -# AX_COMPARE_VERSION(VERSION_A, OP, VERSION_B, [ACTION-IF-TRUE], [ACTION-IF-FALSE]) -# -# DESCRIPTION -# -# This macro compares two version strings. Due to the various number of -# minor-version numbers that can exist, and the fact that string -# comparisons are not compatible with numeric comparisons, this is not -# necessarily trivial to do in a autoconf script. This macro makes doing -# these comparisons easy. -# -# The six basic comparisons are available, as well as checking equality -# limited to a certain number of minor-version levels. -# -# The operator OP determines what type of comparison to do, and can be one -# of: -# -# eq - equal (test A == B) -# ne - not equal (test A != B) -# le - less than or equal (test A <= B) -# ge - greater than or equal (test A >= B) -# lt - less than (test A < B) -# gt - greater than (test A > B) -# -# Additionally, the eq and ne operator can have a number after it to limit -# the test to that number of minor versions. -# -# eq0 - equal up to the length of the shorter version -# ne0 - not equal up to the length of the shorter version -# eqN - equal up to N sub-version levels -# neN - not equal up to N sub-version levels -# -# When the condition is true, shell commands ACTION-IF-TRUE are run, -# otherwise shell commands ACTION-IF-FALSE are run. The environment -# variable 'ax_compare_version' is always set to either 'true' or 'false' -# as well. -# -# Examples: -# -# AX_COMPARE_VERSION([3.15.7],[lt],[3.15.8]) -# AX_COMPARE_VERSION([3.15],[lt],[3.15.8]) -# -# would both be true. -# -# AX_COMPARE_VERSION([3.15.7],[eq],[3.15.8]) -# AX_COMPARE_VERSION([3.15],[gt],[3.15.8]) -# -# would both be false. -# -# AX_COMPARE_VERSION([3.15.7],[eq2],[3.15.8]) -# -# would be true because it is only comparing two minor versions. -# -# AX_COMPARE_VERSION([3.15.7],[eq0],[3.15]) -# -# would be true because it is only comparing the lesser number of minor -# versions of the two values. -# -# Note: The characters that separate the version numbers do not matter. An -# empty string is the same as version 0. OP is evaluated by autoconf, not -# configure, so must be a string, not a variable. -# -# The author would like to acknowledge Guido Draheim whose advice about -# the m4_case and m4_ifvaln functions make this macro only include the -# portions necessary to perform the specific comparison specified by the -# OP argument in the final configure script. -# -# LAST MODIFICATION -# -# 2008-04-12 -# -# COPYLEFT -# -# Copyright (c) 2008 Tim Toolan <toolan@ele.uri.edu> -# -# Copying and distribution of this file, with or without modification, are -# permitted in any medium without royalty provided the copyright notice -# and this notice are preserved. - -dnl ######################################################################### -AC_DEFUN([AX_COMPARE_VERSION], [ - AC_PROG_AWK - - # Used to indicate true or false condition - ax_compare_version=false - - # Convert the two version strings to be compared into a format that - # allows a simple string comparison. The end result is that a version - # string of the form 1.12.5-r617 will be converted to the form - # 0001001200050617. In other words, each number is zero padded to four - # digits, and non digits are removed. - AS_VAR_PUSHDEF([A],[ax_compare_version_A]) - A=`echo "$1" | sed -e 's/\([[0-9]]*\)/Z\1Z/g' \ - -e 's/Z\([[0-9]]\)Z/Z0\1Z/g' \ - -e 's/Z\([[0-9]][[0-9]]\)Z/Z0\1Z/g' \ - -e 's/Z\([[0-9]][[0-9]][[0-9]]\)Z/Z0\1Z/g' \ - -e 's/[[^0-9]]//g'` - - AS_VAR_PUSHDEF([B],[ax_compare_version_B]) - B=`echo "$3" | sed -e 's/\([[0-9]]*\)/Z\1Z/g' \ - -e 's/Z\([[0-9]]\)Z/Z0\1Z/g' \ - -e 's/Z\([[0-9]][[0-9]]\)Z/Z0\1Z/g' \ - -e 's/Z\([[0-9]][[0-9]][[0-9]]\)Z/Z0\1Z/g' \ - -e 's/[[^0-9]]//g'` - - dnl # In the case of le, ge, lt, and gt, the strings are sorted as necessary - dnl # then the first line is used to determine if the condition is true. - dnl # The sed right after the echo is to remove any indented white space. - m4_case(m4_tolower($2), - [lt],[ - ax_compare_version=`echo "x$A -x$B" | sed 's/^ *//' | sort -r | sed "s/x${A}/false/;s/x${B}/true/;1q"` - ], - [gt],[ - ax_compare_version=`echo "x$A -x$B" | sed 's/^ *//' | sort | sed "s/x${A}/false/;s/x${B}/true/;1q"` - ], - [le],[ - ax_compare_version=`echo "x$A -x$B" | sed 's/^ *//' | sort | sed "s/x${A}/true/;s/x${B}/false/;1q"` - ], - [ge],[ - ax_compare_version=`echo "x$A -x$B" | sed 's/^ *//' | sort -r | sed "s/x${A}/true/;s/x${B}/false/;1q"` - ],[ - dnl Split the operator from the subversion count if present. - m4_bmatch(m4_substr($2,2), - [0],[ - # A count of zero means use the length of the shorter version. - # Determine the number of characters in A and B. - ax_compare_version_len_A=`echo "$A" | $AWK '{print(length)}'` - ax_compare_version_len_B=`echo "$B" | $AWK '{print(length)}'` - - # Set A to no more than B's length and B to no more than A's length. - A=`echo "$A" | sed "s/\(.\{$ax_compare_version_len_B\}\).*/\1/"` - B=`echo "$B" | sed "s/\(.\{$ax_compare_version_len_A\}\).*/\1/"` - ], - [[0-9]+],[ - # A count greater than zero means use only that many subversions - A=`echo "$A" | sed "s/\(\([[0-9]]\{4\}\)\{m4_substr($2,2)\}\).*/\1/"` - B=`echo "$B" | sed "s/\(\([[0-9]]\{4\}\)\{m4_substr($2,2)\}\).*/\1/"` - ], - [.+],[ - AC_WARNING( - [illegal OP numeric parameter: $2]) - ],[]) - - # Pad zeros at end of numbers to make same length. - ax_compare_version_tmp_A="$A`echo $B | sed 's/./0/g'`" - B="$B`echo $A | sed 's/./0/g'`" - A="$ax_compare_version_tmp_A" - - # Check for equality or inequality as necessary. - m4_case(m4_tolower(m4_substr($2,0,2)), - [eq],[ - test "x$A" = "x$B" && ax_compare_version=true - ], - [ne],[ - test "x$A" != "x$B" && ax_compare_version=true - ],[ - AC_WARNING([illegal OP parameter: $2]) - ]) - ]) - - AS_VAR_POPDEF([A])dnl - AS_VAR_POPDEF([B])dnl - - dnl # Execute ACTION-IF-TRUE / ACTION-IF-FALSE. - if test "$ax_compare_version" = "true" ; then - m4_ifvaln([$4],[$4],[:])dnl - m4_ifvaln([$5],[else $5])dnl - fi -]) dnl AX_COMPARE_VERSION diff --git a/packages/webkit/webkit-gtk/autogen.sh b/packages/webkit/webkit-gtk/autogen.sh index a929538d20..f87238cf92 100644 --- a/packages/webkit/webkit-gtk/autogen.sh +++ b/packages/webkit/webkit-gtk/autogen.sh @@ -8,6 +8,10 @@ test -z "$srcdir" && srcdir=. ORIGDIR=`pwd` cd $srcdir +LIBTOOLIZE_FLAGS="--force --automake" +ACLOCAL_FLAGS="-I autotools" +AUTOMAKE_FLAGS="--foreign --add-missing" + DIE=0 (autoconf --version) < /dev/null > /dev/null 2>&1 || { @@ -46,10 +50,10 @@ rm -rf $top_srcdir/autom4te.cache touch README INSTALL -aclocal || exit $? -$LIBTOOLIZE --force || exit $? +aclocal $ACLOCAL_FLAGS || exit $? +$LIBTOOLIZE $LIBTOOLIZE_FLAGS || exit $? autoheader || exit $? -automake --foreign --add-missing || exit $? +automake $AUTOMAKE_FLAGS || exit $? autoconf || exit $? cd $ORIGDIR || exit 1 diff --git a/packages/webkit/webkit-gtk/configure.ac b/packages/webkit/webkit-gtk/configure.ac index 7b451efe96..c7ed988329 100644 --- a/packages/webkit/webkit-gtk/configure.ac +++ b/packages/webkit/webkit-gtk/configure.ac @@ -6,6 +6,10 @@ m4_define([webkit_micro_version], [0]) AC_INIT([WebKit],[webkit_major_version.webkit_minor_version.webkit_micro_version],[http://bugs.webkit.org/]) +AC_CONFIG_MACRO_DIR([autotools]) +AC_CONFIG_AUX_DIR([autotools]) +AC_SUBST(ACLOCAL_AMFLAGS, "-I autotools") + AC_CONFIG_HEADERS([autotoolsconfig.h]) AC_CANONICAL_SYSTEM @@ -23,10 +27,13 @@ dnl # see http://www.gnu.org/software/libtool/manual.html#Versioning LIBWEBKITGTK_VERSION=1:0:0 AC_SUBST([LIBWEBKITGTK_VERSION]) +# Recent libtool+automake don't assume you want C++, explicitly enable it +AC_PROG_CXX + AM_INIT_AUTOMAKE([foreign subdir-objects tar-ustar]) # host checking - inspired by the GTK+ configure.in -# TODO: os_mac, os_bsd +# TODO: move these to webkit.m4? AC_MSG_CHECKING([for native Win32]) case "$host" in *-*-mingw*) @@ -59,57 +66,14 @@ case "$host_os" in ;; esac -# If CXXFLAGS and CFLAGS are unset, default to empty. -# This is to tell automake not to include '-g' if CXXFLAGS is not set -# For more info - http://www.gnu.org/software/automake/manual/autoconf.html#C_002b_002b-Compiler -if test -z "$CXXFLAGS"; then - CXXFLAGS="" -fi -if test -z "$CFLAGS"; then - CFLAGS="" -fi - -AM_PROG_CC_STDC -AM_PROG_CC_C_O -AC_PROG_CXX -AC_PROG_INSTALL +# initialize webkit options +WEBKIT_INIT AC_DISABLE_STATIC AC_LIBTOOL_WIN32_DLL AC_PROG_LIBTOOL -AC_SYS_LARGEFILE +# use dolt to speedup the build DOLT -# check for -fvisibility=hidden compiler support (GCC >= 4) -saved_CFLAGS="$CFLAGS" -CFLAGS="$CFLAGS -fvisibility=hidden -fvisibility-inlines-hidden" -AC_MSG_CHECKING([if ${CXX} supports -fvisibility=hidden -fvisibility-inlines-hidden]) -AC_COMPILE_IFELSE([char foo;], - [ AC_MSG_RESULT([yes]) - SYMBOL_VISIBILITY="-fvisibility=hidden" SYMBOL_VISIBILITY_INLINES="-fvisibility-inlines-hidden" ], - AC_MSG_RESULT([no])) -CFLAGS="$saved_CFLAGS" -AC_SUBST(SYMBOL_VISIBILITY) -AC_SUBST(SYMBOL_VISIBILITY_INLINES) - -AC_PATH_PROG(PERL, perl) -if test -z "$PERL"; then - AC_MSG_ERROR([You need 'perl' to compile WebKit]) -fi - -AC_PATH_PROG(BISON, bison) -if test -z "$BISON"; then - AC_MSG_ERROR([You need the 'bison' parser generator to compile WebKit]) -else - case "$target_cpu" in - arm) - BISON_VERSION=`$BISON --version | head -n1 | sed 's,.*\ \([0-9]*\.[0-9]*\)$,\1,'` - AX_COMPARE_VERSION([2.2],[gt],[$BISON_VERSION], - echo "Autoconf say: I'm broken, ignore me") - ;; - *) ;; - esac -fi - AC_PATH_PROG(FLEX, flex) if test -z "$FLEX"; then AC_MSG_ERROR([You need the 'flex' lexer generator to compile WebKit]) @@ -124,34 +88,6 @@ if test -z "$GPERF"; then AC_MSG_ERROR([You need the 'gperf' hash function generator to compile WebKit]) fi -AC_PATH_PROG(MV, mv) -if test -z "$MV"; then - AC_MSG_ERROR([You need 'mv' to compile WebKit]) -fi - -# GTK+ port only -# Check for glib-genmarshal and glib-mkenums -AC_PATH_PROG([GLIB_GENMARSHAL], [glib-genmarshal]) -AC_PATH_PROG([GLIB_MKENUMS],[glib-mkenums]) -if test -z "$GLIB_GENMARSHAL" || test -z "$GLIB_MKENUMS"; then - AC_MSG_ERROR([You need the GLib dev tools in your path]) -fi - -# Check whether a C++ was found (AC_PROG_CXX sets $CXX to "g++" even when it -# doesn't exist) -AC_LANG_PUSH([C++]) -AC_COMPILE_IFELSE([AC_LANG_PROGRAM([],[])],[],[AC_MSG_ERROR([No C++ compiler found])]) -AC_LANG_POP([C++]) - -# C/C++ Language Features -AC_C_CONST -AC_C_INLINE -AC_C_VOLATILE - -# C/C++ Headers -AC_HEADER_STDC -AC_HEADER_STDBOOL - # pthread (not needed on Windows) if test "$os_win32" = "no"; then AC_CHECK_HEADERS([pthread.h], @@ -183,12 +119,6 @@ if test "$jpeg_ok" = yes; then fi AC_SUBST([JPEG_LIBS]) -# check for pkg-config -AC_PATH_PROG(PKG_CONFIG, pkg-config, no) -if test "$PKG_CONFIG" = "no"; then - AC_MSG_ERROR([Cannot find pkg-config, make sure it is installed in your PATH]) -fi - # Check for libpng the way Gtk+ does it AC_MSG_CHECKING(for libpng12) if $PKG_CONFIG --exists libpng12 ; then @@ -219,44 +149,6 @@ else fi AC_SUBST([PNG_LIBS]) -# determine the Unicode backend -AC_MSG_CHECKING([the Unicode backend to use]) -AC_ARG_WITH(unicode_backend, - AC_HELP_STRING([--with-unicode-backend=@<:@icu@:>@], - [Select Unicode backend [default=icu]]), - [],[unicode_backend="icu"]) - -case "$unicode_backend" in - icu) ;; - *) AC_MSG_ERROR([Invalid Unicode backend: must be icu.]) ;; -esac - -AC_MSG_RESULT([$unicode_backend]) - -if test "$unicode_backend" = "icu"; then - AC_PATH_PROG(icu_config, icu-config, no) - if test "$icu_config" = "no"; then - if test "$os_darwin" = "yes"; then - UNICODE_CFLAGS="-I\$(srcdir)/JavaScriptCore/icu -I\$(srcdir)/WebCore/icu" - UNICODE_LIBS="-licucore" - elif test "$os_win32" = "yes"; then - UNICODE_CFLAGS="" - UNICODE_LIBS="-licuin -licuuc" - else - AC_MSG_ERROR([Cannot find icu-config. The ICU library is needed.]) - fi - else - # We don't use --cflags as this gives us a lot of things that we don't - # necessarily want, like debugging and optimization flags - # See man (1) icu-config for more info. - UNICODE_CFLAGS=`$icu_config --cppflags` - UNICODE_LIBS=`$icu_config --ldflags` - fi -fi - -AC_SUBST([UNICODE_CFLAGS]) -AC_SUBST([UNICODE_LIBS]) - # determine the GDK/GTK+ target AC_MSG_CHECKING([the target windowing system]) AC_ARG_WITH(target, @@ -307,9 +199,6 @@ FREETYPE2_REQUIRED_VERSION=9.0 LIBXML_REQUIRED_VERSION=2.6 # minimum GTK+ base dependencies -GLIB_REQUIRED_VERSION=2.0 -GOBJECT_REQUIRED_VERSION=2.0 -GTHREAD_REQUIRED_VERSION=2.0 PANGO_REQUIRED_VERSION=1.0 GTK_REQUIRED_VERSION=2.8 @@ -320,13 +209,14 @@ LIBXSLT_REQUIRED_VERSION=1.1.7 SQLITE_REQUIRED_VERSION=3.0 GSTREAMER_REQUIRED_VERSION=0.10 -PKG_CHECK_MODULES([GLOBALDEPS], - [glib-2.0 >= $GLIB_REQUIRED_VERSION - gobject-2.0 >= $GOBJECT_REQUIRED_VERSION - gthread-2.0 >= $GTHREAD_REQUIRED_VERSION]) -AC_SUBST([GLOBALDEPS_CFLAGS]) -AC_SUBST([GLOBALDEPS_LIBS]) - +# Available modules +# +# glib - glib and includes gthread +# unicode - check and identify which unicode backend to use +# +# todo: webcore gtk +WEBKIT_CHECK_DEPENDENCIES([glib unicode]) + PKG_CHECK_MODULES(LIBXML, libxml-2.0 >= $LIBXML_REQUIRED_VERSION) AC_SUBST(LIBXML_CFLAGS) AC_SUBST(LIBXML_LIBS) @@ -456,8 +346,8 @@ AC_MSG_RESULT([$enable_xslt]) AC_MSG_CHECKING([whether to enable geolocation support]) AC_ARG_ENABLE(geolocation, AC_HELP_STRING([--enable-geolocation], - [enable support for geolocation [default=yes]]), - [],[enable_geolocation="yes"]) + [enable support for geolocation [default=no]]), + [],[enable_geolocation="no"]) AC_MSG_RESULT([$enable_geolocation]) # check whether to enable SVG support @@ -676,6 +566,14 @@ if test "$enable_xslt" = "yes"; then AC_SUBST([LIBXSLT_LIBS]) fi +# check if geoclue is available +if test "$enable_geolocation" = "yes"; then + PKG_CHECK_MODULES([GEOCLUE], [geoclue]) + AC_SUBST([GEOCLUE_CFLAGS]) + AC_SUBST([GEOCLUE_LIBS]) +fi + + # check if gstreamer is available if test "$enable_video" = "yes"; then PKG_CHECK_MODULES([GSTREAMER], diff --git a/packages/webkit/webkit-gtk_svn.bb b/packages/webkit/webkit-gtk_svn.bb index 96ef562e75..98926727fe 100644 --- a/packages/webkit/webkit-gtk_svn.bb +++ b/packages/webkit/webkit-gtk_svn.bb @@ -1,11 +1,11 @@ DESCRIPTION = "WebKit browser engine, GTK+ edition" -DEPENDS = "curl icu libxml2 cairo libxslt libxt libidn gnutls gtk+ gstreamer gst-plugins-base gnome-vfs bison-native flex-native gperf-native perl-native sqlite3" +DEPENDS = "libsoup-2.4 curl icu libxml2 cairo libxslt libxt libidn gnutls gtk+ gstreamer gst-plugins-base gnome-vfs bison-native flex-native gperf-native perl-native sqlite3" SRCREV_FORMAT = "webcore-rwebkit" # Yes, this is wrong... PV = "0.1+svnr${SRCREV}" -PR = "r7" +PR = "r8" SRC_URI = "\ svn://svn.webkit.org/repository/webkit/trunk/;module=JavaScriptCore;proto=http \ @@ -14,7 +14,7 @@ SRC_URI = "\ svn://svn.webkit.org/repository/webkit/trunk/;module=WebKit;proto=http;name=webkit \ svn://svn.webkit.org/repository/webkit/trunk/;module=WebKitLibraries;proto=http \ svn://svn.webkit.org/repository/webkit/trunk/;module=WebKitTools;proto=http \ - file://acinclude.m4 \ + svn://svn.webkit.org/repository/webkit/trunk/;module=autotools;proto=http \ file://Makefile \ file://Makefile.shared \ file://autogen.sh \ @@ -29,13 +29,13 @@ inherit autotools pkgconfig lib_package export BISON="${STAGING_BINDIR_NATIVE}/bison" ARM_INSTRUCTION_SET = "arm" -# FIXME: Segfaulting without --with-http-backend=curl EXTRA_OECONF = "\ --enable-debug=no \ --enable-svg \ --enable-icon-database=yes \ - --with-http-backend=curl \ + --with-http-backend=soup \ " +EXTRA_AUTORECONF = " -I autotools " # Dolt gets used on x86 and ppc and hardcodes 'libtool' do_configure_append() { diff --git a/packages/wireshark/files/acinclude-net-snmp-fix.patch b/packages/wireshark/files/acinclude-net-snmp-fix.patch new file mode 100644 index 0000000000..3f6dbf3b05 --- /dev/null +++ b/packages/wireshark/files/acinclude-net-snmp-fix.patch @@ -0,0 +1,13 @@ +Index: wireshark-0.99.4/acinclude.m4 +=================================================================== +--- wireshark-0.99.4.orig/acinclude.m4 2009-01-03 22:57:54.106829288 +0300 ++++ wireshark-0.99.4/acinclude.m4 2009-01-03 22:57:59.806420438 +0300 +@@ -1117,7 +1117,7 @@ AC_DEFUN([AC_WIRESHARK_NETSNMP_CHECK], + # + AC_PATH_PROG(NETSNMPCONFIG, net-snmp-config) + else +- NETSNMPCNFIG=$netsnmpconfig ++ NETSNMPCONFIG=$netsnmpconfig + if test ! -x $NETSNMPCONFIG -o ! -f $NETSNMPCONFIG ; then + NETSNMPCONFIG=$netsnmpconfig/bin/net-snmp-config + if test ! -x $NETSNMPCONFIG -o ! -f $NETSNMPCONFIG ; then diff --git a/packages/wireshark/files/ieee80215.4.patch b/packages/wireshark/files/ieee80215.4.patch new file mode 100644 index 0000000000..8bcdd93d97 --- /dev/null +++ b/packages/wireshark/files/ieee80215.4.patch @@ -0,0 +1,9 @@ +--- wireshark-1.0.5.orig/epan/dissectors/packet-ieee802154.c ++++ wireshark-1.0.5/epan/dissectors/packet-ieee802154.c +@@ -1696,7 +1696,7 @@ + dissector_handle_t ieee802154_handle; + + /* Get the dissector handles. */ +- ieee802154_handle = find_dissector("wpan"); ++ ieee802154_handle = find_dissector("wpan_nofcs"); + data_handle = find_dissector("data"); diff --git a/packages/wireshark/files/libtool-fix.patch b/packages/wireshark/files/libtool-fix.patch new file mode 100644 index 0000000000..4a978bad92 --- /dev/null +++ b/packages/wireshark/files/libtool-fix.patch @@ -0,0 +1,14 @@ +Index: wireshark-0.99.4/configure.in +=================================================================== +--- wireshark-0.99.4.orig/configure.in 2009-01-05 01:23:50.887336868 +0300 ++++ wireshark-0.99.4/configure.in 2009-01-05 01:24:03.136385630 +0300 +@@ -16,8 +16,7 @@ dnl Checks for programs. + AC_PROG_CC + AC_PROG_CPP + dnl Work around libtool bug (fixed in the version 1.5a?) +-AC_DEFUN([AC_PROVIDE_AC_LIBTOOL_DLOPEN], ) +-AC_LIBTOOL_DLOPEN ++LT_INIT([dlopen]) + AC_PROG_LIBTOOL + AC_PROG_YACC + AM_PROG_LEX diff --git a/packages/wireshark/tshark_0.99.4.bb b/packages/wireshark/tshark_0.99.4.bb index 7338efdda7..b7fe2afeed 100644 --- a/packages/wireshark/tshark_0.99.4.bb +++ b/packages/wireshark/tshark_0.99.4.bb @@ -1,21 +1,5 @@ DESCRIPTION = "tshark is the text based verion of wireshark - a popular network protocol analyzer" -HOMEPAGE = "http://www.ethereal.com" -SECTION = "network" -LICENSE = "GPL" -DEPENDS = "perl-native gnutls libpcap pcre expat" +require wireshark.inc -SRC_URI = "${SOURCEFORGE_MIRROR}/wireshark/wireshark-${PV}.tar.bz2 \ - file://use-our-lemon.patch;patch=1 \ - file://no-host-includes.patch;patch=1" - -S=${WORKDIR}/wireshark-${PV} - -inherit autotools - -EXTRA_OECONF = "--disable-wireshark" - -do_compile_prepend() { - ${BUILD_CC} ${BUILD_CFLAGS} -o rdps rdps.c - oe_runmake -C tools/lemon CC="${BUILD_CC} ${BUILD_CFLAGS}" LDFLAGS="${BUILD_LDFLAGS}" -} +EXTRA_OECONF = "--disable-wireshark --with-net-snmp=${STAGING_DIR_HOST}${layout_bindir}/net-snmp-config" diff --git a/packages/wireshark/wireshark.inc b/packages/wireshark/wireshark.inc new file mode 100644 index 0000000000..13715ea273 --- /dev/null +++ b/packages/wireshark/wireshark.inc @@ -0,0 +1,20 @@ +HOMEPAGE = "http://www.wireshark.org" +SECTION = "network" +LICENSE = "GPL" +DEPENDS = "perl-native gnutls libpcap pcre expat glib-2.0 net-snmp" + +SRC_URI = "${SOURCEFORGE_MIRROR}/wireshark/wireshark-${PV}.tar.bz2 \ + file://use-our-lemon.patch;patch=1 \ + file://acinclude-net-snmp-fix.patch;patch=1 \ + file://libtool-fix.patch;patch=1 \ + file://no-host-includes.patch;patch=1" + +S=${WORKDIR}/wireshark-${PV} + +inherit autotools + +do_compile_prepend() { + ${BUILD_CC} ${BUILD_CFLAGS} -o rdps rdps.c + oe_runmake -C tools/lemon CC="${BUILD_CC} ${BUILD_CFLAGS}" LDFLAGS="${BUILD_LDFLAGS}" +} + diff --git a/packages/wireshark/wireshark_0.99.4.bb b/packages/wireshark/wireshark_0.99.4.bb index e34ca849d4..f4c90fce48 100644 --- a/packages/wireshark/wireshark_0.99.4.bb +++ b/packages/wireshark/wireshark_0.99.4.bb @@ -1,21 +1,9 @@ -DESCRIPTION = "Ethereal is the world's most popular network protocol analyzer" -HOMEPAGE = "http://www.ethereal.com" -SECTION = "x11/network" -LICENSE = "GPL" -DEPENDS = "perl-native gtk+ gnutls libpcap pcre expat" +DESCRIPTION = "Wireshark is the world's most popular network protocol analyzer" +require wireshark.inc +DEPENDS += "gtk+" PR = "r1" -SRC_URI = "${SOURCEFORGE_MIRROR}/${PN}/${PN}-${PV}.tar.bz2 \ - file://use-our-lemon.patch;patch=1 \ - file://no-host-includes.patch;patch=1" - -inherit autotools - -do_compile_prepend() { - ${BUILD_CC} ${BUILD_CFLAGS} -o rdps rdps.c - oe_runmake -C tools/lemon CC="${BUILD_CC} ${BUILD_CFLAGS}" LDFLAGS="${BUILD_LDFLAGS}" -} FILES_${PN}-dbg += "${libdir}/wireshark/plugins/${PV}/.debug" diff --git a/packages/wireshark/wireshark_1.0.5.bb b/packages/wireshark/wireshark_1.0.5.bb new file mode 100644 index 0000000000..aa8e66c2f4 --- /dev/null +++ b/packages/wireshark/wireshark_1.0.5.bb @@ -0,0 +1,70 @@ +DESCRIPTION = "wireshark - a popular network protocol analyzer" +HOMEPAGE = "http://www.wireshark.org" +SECTION = "network" +LICENSE = "GPL" +DEPENDS = "perl-native gnutls libpcap pcre expat glib-2.0 libsmi gtk+" +EXTRA_OECONF = "--disable-usrlocal --with-pcap=${STAGING_DIR_HOST}${layout_prefix} \ + --with-libsmi=${STAGING_DIR_HOST}${layout_prefix} --enable-tshark --enable-wireshark" + +PR = "r5" + +SRC_URI = "${SOURCEFORGE_MIRROR}/wireshark/wireshark-${PV}.tar.bz2 \ + file://ieee80215.4.patch;patch=1" + +ARM_INSTRUCTION_SET = "arm" + +PACKAGES += "libwireshark1-dev libwireshark1 libwireshark1-dbg" +FILES_libwireshark1 = "${libdir}/*.so*" +FILES_libwireshark1-dev += "${libdir}/*.la ${libdir}/*.a ${libdir}/*.so ${includedir}" +FILES_libwireshark1-dbg += "${libdir}/.debug" +LEAD_SONAME_libwireshark1 = "libwireshark.so.0" + +PACKAGES += "${PN}-wireshark ${PN}-wireshark-dbg ${PN}-tshark ${PN}-tshark-dbg" +FILES_${PN}-wireshark = "${bindir}/wireshark" +FILES_${PN}-wireshark-dbg = "${bindir}/.debug/wireshark" +FILES_${PN}-tshark = "${bindir}/tshark" +FILES_${PN}-tshark-dbg = "${bindir}/.debug/tshark" +RDEPENDS_${PN}-tshark += "libsmi-mibs libsmi-pibs ${PN}-data" +RDEPENDS_${PN}-wireshark += "libsmi-mibs libsmi-pibs ${PN}-data" +RCONFLICTS_${PN}-tshark = "tshark wireshark (<1.0.5)" +RREPLACES_${PN}-tshark = "tshark wireshark (<1.0.5)" +RCONFLICTS_${PN}-wireshark = "tshark wireshark (<1.0.5)" +RREPLACES_${PN}-wireshark = "tshark wireshark (<1.0.5)" + +PACKAGES += "${PN}-plugins-dbg ${PN}-plugins" +FILES_${PN}-plugins = "${libdir}/wireshark/plugins/${PV}/*.so ${libdir}/wireshark/plugins/${PV}/*.la" +FILES_${PN}-plugins-dbg += "${libdir}/wireshark/plugins/${PV}/.debug" + +PACKAGES += "${PN}-data" +FILES_${PN}-data = "${datadir}/wireshark" + +PACKAGES += "${PN}-utils ${PN}-utils-dbg" +FILES_${PN}-utils = "${bindir}/text2pcap ${bindir}/dumpcap \ + ${bindir}/rawshark ${bindir}/editcap \ + ${bindir}/mergecap ${bindir}/idl2wrs \ + ${bindir}/dftest ${bindir}/capinfos \ + ${bindir}/randpkt" +FILES_${PN}-utils-dbg = "${bindir}/.debug" + +FILES_${PN} = "" +FILES_${PN}-dev = "" +FILES_${PN}-dbg = "" +ALLOW_EMPTY_${PN} = "1" +RDEPENDS_${PN} = "${PN}-tshark ${PN}-wireshark ${PN}-plugins ${PN}-data" +RCONFLICTS_${PN} = "tshark wireshark (<1.0.5)" +RREPLACES_${PN} = "tshark wireshark (<1.0.5)" + +inherit autotools + +do_compile_prepend() { + find . -type f -name Makefile \ + -exec sed -e 's@-I/usr/include @@g' \ + -e 's@-I$(includedir)@@g' \ + -e 's@-I/usr/local/include @@g' \ + -e "s@-I${includedir} @@g" -i '{}' ';' + + ${BUILD_CC} ${BUILD_CFLAGS} -o rdps rdps.c + oe_runmake -C tools/lemon CC="${BUILD_CC} ${BUILD_CFLAGS}" \ + CC_FOR_BUILD="${BUILD_CC} ${BUILD_CFLAGS}" LDFLAGS="${BUILD_LDFLAGS}" +} + diff --git a/packages/wt/wt_2.2.3.bb b/packages/wt/wt_2.2.3.bb index ec0f3cc302..b9ab7580f8 100644 --- a/packages/wt/wt_2.2.3.bb +++ b/packages/wt/wt_2.2.3.bb @@ -2,8 +2,9 @@ DESCRIPTION = "A C++ Web Toolkit" PRIORITY = "optional" SECTION = "devel" LICENSE = "GPL" +HOMEPAGE = "http://www.webtoolkit.eu/wt" DEPENDS = "boost zlib openssl" -PR = "r0" +PR = "r1" SRC_URI = "${SOURCEFORGE_MIRROR}/witty/wt-${PV}.tar.gz \ file://cmakelist.patch;patch=1" diff --git a/packages/xorg-driver/xf86-video-geode_2.11.0.bb b/packages/xorg-driver/xf86-video-geode_2.11.0.bb new file mode 100644 index 0000000000..380ce2ea0b --- /dev/null +++ b/packages/xorg-driver/xf86-video-geode_2.11.0.bb @@ -0,0 +1,5 @@ +require xorg-driver-video.inc +PE = "1" + +COMPATIBLE_HOST = 'i.86.*-linux' +DESCRIPTION = "X.org server -- Geode GX2/LX display driver" diff --git a/packages/xorg-driver/xf86-video-glamo_git.bb b/packages/xorg-driver/xf86-video-glamo_git.bb new file mode 100644 index 0000000000..fecba818a5 --- /dev/null +++ b/packages/xorg-driver/xf86-video-glamo_git.bb @@ -0,0 +1,11 @@ +require xorg-driver-video.inc +SRC_URI = "git://git.openmoko.org/git/xf86-video-glamo;protocol=git;branch=master" +PV = "0.1+gitr${SRCREV}" +PE = "1" + +DESCRIPTION = "X.Org X server -- fbdev display driver" + +S = "${WORKDIR}/git" + +ARM_INSTRUCTION_SET = "arm" + diff --git a/packages/xorg-xserver/xserver-xorg-conf/overo/xorg.conf b/packages/xorg-xserver/xserver-xorg-conf/overo/xorg.conf new file mode 100644 index 0000000000..983bb0823a --- /dev/null +++ b/packages/xorg-xserver/xserver-xorg-conf/overo/xorg.conf @@ -0,0 +1,29 @@ +Section "Module" + Load "extmod" + Load "dbe" + Load "glx" + Load "freetype" + Load "type1" + Load "record" + Load "dri" +EndSection + +Section "Monitor" + Identifier "Builtin Default Monitor" +EndSection + +Section "Device" + Identifier "Builtin Default fbdev Device 0" + Driver "omapfb" +EndSection + +Section "Screen" + Identifier "Builtin Default fbdev Screen 0" + Device "Builtin Default fbdev Device 0" + Monitor "Builtin Default Monitor" +EndSection + +Section "ServerLayout" + Identifier "Builtin Default Layout" + Screen "Builtin Default fbdev Screen 0" +EndSection diff --git a/packages/yasr/files/yasr-0.6.9-gcc43.patch b/packages/yasr/files/yasr-0.6.9-gcc43.patch new file mode 100644 index 0000000000..ee2b1a6ef7 --- /dev/null +++ b/packages/yasr/files/yasr-0.6.9-gcc43.patch @@ -0,0 +1,26 @@ +diff -NrU5 yasr-0.6.9.orig/yasr/yasr.h yasr-0.6.9/yasr/yasr.h +--- yasr-0.6.9.orig/yasr/yasr.h 2008-06-29 01:23:44.000000000 +0200 ++++ yasr-0.6.9/yasr/yasr.h 2008-06-29 01:37:00.000000000 +0200 +@@ -306,22 +306,10 @@ + extern void opt_say(int num, int flag); + extern void opt_set(int num, void *val); + extern void opt_queue_empty(int ll); + extern void opt_write(FILE * fp); + +-/* openpty.c prototypes */ +-extern int openpty(int *, int *, char *, struct termios *, struct winsize *); +- +-/* cfmakeraw.c prototypes */ +-extern void cfmakeraw(struct termios *); +- +-/* login_tty.c prototypes */ +-extern int login_tty(int); +- +-/* forkpty.c prototypes */ +-extern int forkpty(int *, char *, struct termios *, struct winsize *); +- + /* tbc - Would it be more efficient to ensure that "blank" grids always held + ascii 0x20 rather than ascii 0x00? */ + #define y_isblank(ch) ((ch & 0xdf) == 0) + #define cblank(r, c) ((win->row[r][c] & 0xdf) == 0) + #define ttssend(x) if (x) tts_send(x, strlen(x)) diff --git a/packages/yasr/files/yasr-0.6.9-remove-m4.patch b/packages/yasr/files/yasr-0.6.9-remove-m4.patch new file mode 100644 index 0000000000..fa05f0791f --- /dev/null +++ b/packages/yasr/files/yasr-0.6.9-remove-m4.patch @@ -0,0 +1,29 @@ +diff -Naur yasr-0.6.9.orig/Makefile.am yasr-0.6.9/Makefile.am +--- yasr-0.6.9.orig/Makefile.am 2008-02-02 06:44:05.000000000 -0600 ++++ yasr-0.6.9/Makefile.am 2009-02-06 08:37:07.000000000 -0600 +@@ -7,7 +7,6 @@ + + SUBDIRS = \ + $(yasr_DDIRS) \ +-m4 \ + po + + pkgdata_DATA = \ +@@ -25,4 +24,3 @@ + README-fr \ + README-ru + +-ACLOCAL_AMFLAGS = -I m4 +diff -Naur yasr-0.6.9.orig/configure.in yasr-0.6.9/configure.in +--- yasr-0.6.9.orig/configure.in 2008-02-02 07:09:04.000000000 -0600 ++++ yasr-0.6.9/configure.in 2009-02-06 08:36:43.000000000 -0600 +@@ -59,8 +59,7 @@ + AM_GNU_GETTEXT(external) + AM_GNU_GETTEXT_VERSION([0.17]) + +-AC_OUTPUT([ m4/Makefile +-Makefile ++AC_OUTPUT([ Makefile + yasr/Makefile + acclogin/Makefile + po/Makefile.in diff --git a/packages/yasr/yasr_0.6.9.bb b/packages/yasr/yasr_0.6.9.bb new file mode 100644 index 0000000000..4d6fd28ede --- /dev/null +++ b/packages/yasr/yasr_0.6.9.bb @@ -0,0 +1,16 @@ +# Copyright (C) 2009 Khem Raj <raj.khem@gmail.com> +# Released under the MIT license (see COPYING.MIT for the terms) + +DESCRIPTION = "Yet Another Screen Reader(yasr) is a \ + general-purpose console screen reader" +HOMEPAGE = "http://yasr.sf.net" +LICENSE = "GPLv2" +SECTION = "console/utils" +SUGGESTS = "speech-dispatcher" + +SRC_URI = "${SOURCEFORGE_MIRROR}/yasr/yasr-${PV}.tar.gz \ + file://yasr-0.6.9-gcc43.patch;patch=1 \ + file://yasr-0.6.9-remove-m4.patch;patch=1 \ + " + +inherit autotools diff --git a/packages/zope/zope-native_3.3.1.bb b/packages/zope/zope-native_3.3.1.bb new file mode 100644 index 0000000000..970df6d785 --- /dev/null +++ b/packages/zope/zope-native_3.3.1.bb @@ -0,0 +1,10 @@ +require zope_${PV}.bb +inherit native + +DEPENDS = "python-native" + +inherit distutils-base + +export BUILD_SYS +export HOST_SYS + diff --git a/packages/zope/zope_3.3.1.bb b/packages/zope/zope_3.3.1.bb index 78cf439e68..cd854250b6 100644 --- a/packages/zope/zope_3.3.1.bb +++ b/packages/zope/zope_3.3.1.bb @@ -4,7 +4,7 @@ PRIORITY = "optional" DEPENDS = "python" RDEPENDS = "python-core python-shell" LICENSE = "ZPL" -PR = "r6" +PR = "r7" SRC_URI = "http://www.zope.org/Products/Zope3/${PV}/Zope-${PV}.tgz" S = "${WORKDIR}/Zope-${PV}" @@ -23,6 +23,8 @@ do_install() { install -d ${D}${libdir}/${PYTHON_DIR} oe_runmake install prefix=${D}${prefix} HOST_SYS=${HOST_SYS} BUILD_SYS=${BUILD_SYS} mv ${D}${libdir}/python/* ${D}${libdir}/${PYTHON_DIR} + rm -rf ${D}${libdir}/${PYTHON_DIR}/twisted + rm -rf ${D}${libdir}/${PYTHON_DIR}/zope/app/twisted } PACKAGES =+ "python-zopeinterface python-zopeinterface-dbg" @@ -42,3 +44,4 @@ ${libdir}/${PYTHON_DIR}/ZODB/.debug" FILES_python-zopeinterface-dbg += "${libdir}/${PYTHON_DIR}/zope/interface/.debug " FILES_python-zopeinterface = "${libdir}/${PYTHON_DIR}/zope/interface/*.* ${libdir}/${PYTHON_DIR}/zope/interface/common" + |