手机进入了工程模式显示了Auto Test Item Test Test Report debug是什么意思 Test Clear MMC Version Reboot

第一章:& i.mx233环境的搭建, sd卡的准备
&&& 1: 主机环境为Ubuntu10.04
&&& 2: i.mx233环境的准备工作
&&& &&& a) 下载i.mx233的开放套件,地址为: /webapp/sps/site/prod_summary.jsp?code=i.MX233&fpsp=1&tab=Design_Tools_Tab
&&& &&& &&& 1) 下载其中的L2.6.31_10.05.00_SDK_SOURCE,并解压到你的工作目录
&&& &&& &&& 2) 解压后有2个文件: L2.6.31_10.05.02_ER_docs.tar.gz 和 L2.6.31_10.05.02_ER_source.tar.gz
&&& &&& &&& 3) 解压 L2.6.31_10.05.02_ER_docs.tar.gz 后,得到docs,查看其中的readme.html,仔细查看 i.MX23 Linux BSP User Guide 文档。这很重要!!你会对本文以后的内容有个大体了解。
&&& &&& &&& 4) 解压 L2.6.31_10.05.02_ER_source.tar.gz 后,得到L2.6.31_10.05.02_ER_source目录。
&&& &&& b) 创建路径 /opt/freescale ,之后toolchain会保存在此
&&& &&& &&& 1) sudo mkdir /opt/freescale
&&& &&& &&& 2) sudo chown windsome.windsome /opt/freescale
&&& &&& &&& 3) sudo vi /etc/sudoers ,添加一行到“# User privilege specification”小结下,内容为: windsome ALL = NOPASSWD: /usr/bin/rpm, /opt/freescale/ltib/usr/bin/rpm
&&& &&& c) 进入解压后目录 L2.6.31_10.05.02_ER_source ,运行./install,按照步骤一步步安装
&&& &&& d) 进入安装完后的目录ltib。因为我们是在ubuntu机器上开发,所以需要修改ltib文件,具体参考 /t5/i-MX-Microprocessors/iMX25-install-ltib/m-p/59299 ,步骤如下
&&& &&& &&& 1) vi ./ltib
&&& &&& &&& 2) 在第929行后加一行,内容为: $cmd .= &--force-debian & if $rpm =~ m/rpm-fs/ && `uname -a` =~ m/ubuntu/i;
&&& &&& &&& 3) 保存后关闭
&&& &&& &&& 4) 注意:在修改ltib之前不要运行./ltib,否则会运行失败,并且就算修改后再运行也会失败。如果不幸运行了,你可以先运行./ltib -m distclean,然后再做上面3步。
&&& &&& &&& 5) 到此,基本环境准备完毕了。
&&& 3: sd卡的准备工作,这就需要仔细看 i.MX23 Linux BSP User Guide 文档了
&&& &&& a) 找到一张kingston的microSD卡,一般都2G,2G以上都可以。
&&& &&& b) 分区,使用sudo fdisk /dev/mmcblk0
&&& &&& &&& 1) 分区过程不再叙述了,我分成了三个主分区一个扩展分区,扩展分区又分成了三个分区。为什么要用扩展分区,因为fdisk最多只能分4个主分区,所以我们只能用扩展分区来多分几个。
&&& &&& &&& 2) 我的分区表如下:(每个block大小为32K)
&&& &&& &&& &&& &&&&&&& Device Boot&&&&&&&&&&&&&&&&&&&& Start&&&&&&&& End&&&&& Blocks&& Id& System
&&& &&& &&& &&& /dev/mmcblk0p1 (20M& )&&&&&&&&&&&&& 1&&&&&&&& 640&&&&&& 20472&&& b& W95 FAT32
&&& &&& &&& &&& /dev/mmcblk0p2 (20M& )&&&&&&&&&&& 641&&&&&&& 1281&&&&&& 20512&& 53& OnTrack DM6 Aux3
&&& &&& &&& &&& /dev/mmcblk0p3 (256M)&&&&&&&&&& 1282&&&&&&& 9476&&&&& 262240&& 83& Linux
&&& &&& &&& &&& /dev/mmcblk0p4 (-&&&&&&& )&&&&&&&&&& 9477&&&&&& 60192&&&& 1622912&&& 5& Extended
&&& &&& &&& &&& /dev/mmcblk0p5 (512M)&&&&&&&&&& 9477&&&&&& 25861&&&&& 524312&& 83& Linux
&&& &&& &&& &&& /dev/mmcblk0p6 (512M)&&&&&&&&& 25862&&&&&& 42246&&&&& 524312&& 83& Linux
&&& &&& &&& &&& /dev/mmcblk0p7 (rem& )&&&&&&&&& 42247&&&&&& 60192&&&&& 574264&& 83& Linux
&&& &&& &&& 3) 各分区的大小没有什么限制,只要够用就行。注意:
&&& &&& &&& &&& A:/dev/mmcblk0p1是用于windowsCE的,我们可以不管它。/dev/mmcblk0p2必须是0x53的格式,用来烧写 boot_stream的。/dev/mmcblk0p3必须是linux分区,用来存放 rootfs。
&&& &&& &&& &&& B:/dev/mmcblk0p4是逻辑上的扩展分区,不需要做任何操作。
&&& &&& &&& &&& C:/dev/mmcblk0p5,/dev/mmcblk0p6,/dev/mmcblk0p7用于android,分别用来存放system分区,data分区,cache分区。
&&& &&& &&& 4) 格式化分区。我们只需要格式化/dev/mmcblk0p3,/dev/mmcblk0p5,/dev/mmcblk0p6,/dev /mmcblk0p7。都可以格式化成ext3。
&&& &&& &&& &&& 注:在实际开发中发现,data分区变化比较大,很容易出问题,某个文件出了问题,android就起不来。data分区可以尝试其他文件系统。
第二章:& 编译kernel
&&& 这部分主要是linux内核的配置与调试。各种板子因为设计不同需要做各种改动,其中就有各种驱动的调试,如USB,USB-otg,触摸屏,网络,按键等等。为了android能跑起来,我们首要的还是触摸屏的调试。
&&& 1:使用自带的toolchain进行linux的编译,并在板子上运行测试
&&& &&& a) 配置toolchain
&&& &&& &&& 1) ./ltib -m config 配置总体环境,Platform选择imx233,Toolchain选择4.1.2,其他的选择默认的即可。
&&& &&& &&& 2) ./ltib -m prep -p kernel-2.6.31.spec,准备kernel的源文件。生成在rpm/BUILD/linux-2.6.31 ,
&&& &&& &&& 3) cd rpm/BUILD ; mv linux-2.6.31 linux-2.6.31-imx233 ; 因为我们要修改kernel的内容,所以我们使用custom的kernel- source
&&& &&& &&& 4) ./ltib -m config 重新配置kernel路径。将Kernel选项改为Local Linux directory build。将 Enter your Linux source directory 修改为你刚才改的那个路径(/home/lancer/freescale/ltib/ltib/rpm/BUILD/linux-2.6.31- imx233), 保存退出
&&& &&& &&& 5) 如果你要修改kernel command line,请在./ltib -m config时,进入PackageList,修改相应。
&&& &&& &&& 6) 如果你要对kernel选项进行设置,请在./ltib -m config时,将Configure the kernel选中。
&&& &&& &&& 7) 配置完成后,你可以运行./ltib了,运行完成后就可以得到boot_steam和文件系统了。文件系统在rootfs目录下,rootfs.jffs2是打包好的jffs2格式文件系统。boot_stream在rootfs/boot 下。
&&& &&& &&& 8) 在编译过程中,可能会遇到 .gvfs不能访问的错误,这是ubuntu中gnome文件系统的一个东西,在你的家目录下。这个错误是不要紧的,忽略即可。
&&& &&& b) 测试kernel
&&& &&& &&& 1) 主要是用dd命令进行写操作。我写了一个脚本(burn_linux.sh)专门用于写boot_stream到sd卡中。可以在脚本所在目录直接运行 sudo ./burn_linux.sh。
&&& &&& &&& &&& # burn_linux.sh start
&&& &&& &&& &&& #imx23_linux=/home/lancer/freescale/ltib/ltib/rpm/BUILD/imx-bootlets-src-10.05.02/imx23_linux.sb
&&& &&& &&& &&& imx23_linux=../../ltib/ltib/rootfs/boot/imx23_linux.sb
&&& &&& &&& &&& echo &generate linux raw data.&
&&& &&& &&& &&& dd if=/dev/zero of=mmc_linux_partition.raw bs=512 count=4
&&& &&& &&& &&& dd if=$imx23_linux of=mmc_linux_partition.raw ibs=512 seek=4 conv=sync,notrunc
&&& &&& &&& &&& echo &write raw data to mmc card.&
&&& &&& &&& &&& size=$(find -name mmc_linux_partition.raw -printf %s)
&&& &&& &&& &&& count=$(($size/512))
&&& &&& &&& &&& dd if=/dev/zero of=/dev/mmcblk0p2 bs=512 count=10240
&&& &&& &&& &&& sleep 1
&&& &&& &&& &&& dd if=mmc_linux_partition.raw of=/dev/mmcblk0p2 bs=512 count=$count
&&& &&& &&& &&& sync
&&& &&& &&& &&& echo &finish write $count blocks&
&&& &&& &&& &&& # burn_linux.sh end
&&& &&& &&& 2) 你要是有兴趣也可以将uboot烧进去玩玩,这样对调试可能更方便,可以通过网络进行kernel下载。但我的板子因为usb及基于usb的 ethernet并没有调试通过,所以不能用uboot来下载。
&&& &&& &&& 3) 将文件系统rootfs拷贝到/dev/mmcblk0p3分区中。
&&& &&& &&& 4) 插入sd卡,上电。从串口中应该能进入shell了,触摸屏上应该也能看到东西了。
&&& &&& c) 到目前为止,基本上没有编写代码。只是做做设置。
&&& &&& d) 移植tslib,目的是为了得到pointercal文件中的触摸屏校准参数,用于android平台
&&& &&& &&& 1) git clone /kergoth/tslib.git
&&& &&& &&& 2) configure tslib
&&& &&& &&& &&& ./autogen
&&& &&& &&& &&& export PATH=$PATH:/opt/freescale/usr/local/gcc-4.1.2-glibc-2.5-nptl-3/arm-none-linux-gnueabi/bin
&&& &&& &&& &&& export CC=arm-none-linux-gnueabi-gcc
&&& &&& &&& &&& export CPP=arm-none-linux-gnueabi-cpp
&&& &&& &&& &&& ./configure --prefix=/usr/local/Trolltech/tslib --host=arm-linux --cache-file=arm-linux.cache --enable-debug
&&& &&& &&& 3)make install
&&& &&& &&& 4) 修改/usr/local/Trolltech/tslib/etc/ts.conf,打开module_raw input,即去掉module_raw input前的#和空格。注意module_raw input前不能有空格!
&&& &&& &&& 5) 写一个脚本文件ts_env.sh,用于运行ts_calibrate前做环境设置
&&& &&& &&& &&& # ts_env.sh start
&&& &&& &&& &&& export TSLIB_ROOT=/usr/local/Trolltech/tslib
&&& &&& &&& &&& export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$TSLIB_ROOT/lib
&&& &&& &&& &&& export TSLIB_CONSOLEDEVICE=none
&&& &&& &&& &&& export TSLIB_FBDEVICE=/dev/fb0
&&& &&& &&& &&& export TSLIB_TSDEVICE=/dev/input/ts0
&&& &&& &&& &&& export TSLIB_CONFFILE=$TSLIB_ROOT/etc/ts.conf
&&& &&& &&& &&& export TSLIB_PLUGINDIR=$TSLIB_ROOT/lib/ts
&&& &&& &&& &&& export TSLIB_CALIBFILE=$TSLIB_ROOT/etc/pointercal
&&& &&& &&& &&& #used for qt
&&& &&& &&& &&& export QWS_MOUSE_PROTO=Tslib:/dev/input/ts0
&&& &&& &&& &&& # ts_env.sh end
&&& &&& &&& 6) 将生成于/usr/local/Trolltech/tslib的文件拷贝到sd卡中文件系统的/usr/local/Trolltech/tslib 下,并启动机器即可运行/usr/local/Trolltech/tslib/bin下的测试程序
&&& &&& &&& 7) 注意:我用的屏的驱动是linux-2.6.31-imx233/drivers/input/touchscreen/mxs-ts.c。这个驱动是不发送EV_KEY消息的,所以以上移植的tslib不能正常工作。
&&& &&& &&& &&& vi tslib/plugins/input-raw.c
&&& &&& &&& &&& 找到check_fd函数,将下面这段代码#if 0掉
&&& &&& &&& &&& #if 0
&&& &&& &&& &&& &&& if ( (ioctl(ts-&fd, EVIOCGBIT(0, sizeof(evbit)), evbit) & 0) ||
&&& &&& &&& &&& &&& &&& !(evbit[BIT_WORD(EV_ABS)] & BIT_MASK(EV_ABS)) ||
&&& &&& &&& &&& &&& &&& !(evbit[BIT_WORD(EV_KEY)] & BIT_MASK(EV_KEY)) ) {
&&& &&& &&& &&& &&& &&& fprintf(stderr, &tslib: Selected device is not a touchscreen (must support ABS and KEY event types)/n&);
&&& &&& &&& &&& &&& &&& return -1;
&&& &&& &&& &&& &&& }
&&& &&& &&& &&& #endif
&&& &&& &&& 8) 之后重新编译。运行ts_calibrate得到校准文件于/usr/local/Trolltech/tslib/etc/pointercal。此文件中数据将用于修改触摸屏驱动。
&&& 2:使用android的toolchain进行linux的编译 (这个部分对于上一步没有修改过boot_stream的人来所有点问题,请参考本文后备注)
&&& &&& 为什么要用android的toolchain来编译内核,而不用ltib自带的编译器? 我曾尝试用ltib自带的编译器来编译android的init,在修改及增加了很多代码的基础上,总算是通过了。然后将init放到rootfs的 sbin/目录下,希望能init成功,可是第一句打印也出不来。在做了更多的尝试之后,对这个方式失去了信心。故而产生了用android的 toolchain来编译linux内核的想法,因为内核是不需要c库支持的,并且android所用的编译器是armv5te的,与i.mx233吻合,这个想法最后成功了。等有时间,再尝试找出用ltib自带编译器编的init无法运行的原因。
&&& &&& a) 修改ltib配置成使用android的编译器
&&& &&& &&& 1) ./ltib -m config ,修改Toolchain选项为Custom, 修改Enter the custom toolchain path为(/home/lancer/freescale/android/prebuilt/linux-x86/toolchain/arm- eabi-4.4.0),修改 Enter the toolchain prefix.为(arm-eabi-)。
&&& &&& &&& 2) 去掉uboot支持,android上编译器编不过uboot
&&& &&& &&& 3) 在Package Selection中保留boot_stream,其他package全部取消。因为toolchain修改为android的toolchain了,而 android的toolchain没有c库。
&&& &&& b) ./ltib开始编译,这个编译过程不能最后成功。会在boot_stream生成imx23_uboot.sb的过程中停止。不要担心,原因在于我们没有选择编译uboot包。如果你愿意,你可以修改uboot,使得它在android的编译器上能成功编译即可不出现此错误。
&&& &&& c) 编译过程异常退出的时候,imx23_linux.sb其实已经生成了,不过不在rootfs/boot下,而是在rpm/BUILD/imx- bootlets-src-10.05.02下。你可以修改burn_linux.sh,让它烧这个到sd卡中。
&&& &&& d) 到这一步之后,默认的内核已经生成了。
&&& &&& e) 到你下载的android源文件目录去编译android。目前的2.2的android默认用的4.4.0的编译器,正是我们所需要armv5te。直接make。
&&& &&& f) 编译完成后进入/home/lancer/freescale/android/out/target/product/generic,这里面就有 root,system,data分别对于sd卡上的p3,p5,p6分区。为了测试init是否搭配kernel,建议写一个简单的init程序,在 main函数中做循环打印。
&&& &&& &&& 1) 在android目录运行 . ./build/envsetup.sh
&&& &&& &&& 2) cd android/system/core/ vi test.c
&&& &&& &&& &&& // test.c start
&&& &&& &&& &&& #include &stdio.h&
&&& &&& &&& &&& #include &stdlib.h&
&&& &&& &&& &&& int main(int argc, char **argv)
&&& &&& &&& &&& {
&&& &&& &&& &&& &&& printf (&we enter android init!!!/n&);
&&& &&& &&& &&& &&& while (1) {
&&& &&& &&& &&& &&&&&&& printf (&test and test !/n&);
&&& &&& &&& &&& &&&&&&& sleep (1);
&&& &&& &&& &&& &&& }
&&& &&& &&& &&& &&& return 0;
&&& &&& &&& &&& }
&&& &&& &&& &&& // test.c end
&&& &&& &&& 3) 修改Android.mk,在LOCAL_MODULE:= init前加一行LOCAL_SRC_FILES:= test.c 就只编译test.c文件
&&& &&& &&& 4) 编译init,用mmm system/core/init 或make init编译
&&& &&& g) 重新运行./burn_linux.sh,然后将/dev/mmcblk0p3分区上根文件系统内容删除干净(记得先要记录/usr/local /Trolltech/tslib/etc/pointercal内容),将root,system,data内容拷贝到sd卡相应分区。
&&& &&& h) 为了方便我们调试,我们需要看到终端打印信息。到sd卡的root分区的dev目录下创建一个console设备,我的mmcblk0p3是mount到 /media/android_root。
&&& &&& &&& 1) cd /media/android_root
&&& &&& &&& 2) sudo mknod console c 5 1
&&& &&& g) 插sd卡到板子上运行。如果从终端不停打印出内容,说明ltib和kernel设置正确了,能和android相匹配了。这时候你可以将 system/core/init/Android.mk文件改回来了。到这里,环境方面基本搞定。
第三章:& android的移植
&&& 1:init.rc的修改
&&& &&& 主要的修改就是将system,data,cache等mount的地方改成你所用的文件系统的格式。
&&& &&& a) loglevel 3 改为 loglevel 6 ,用于调试
&&& &&& b) 将
&&& &&& &&& &&& mount yaffs2 mtd@system /system
&&& &&& &&& &&& mount yaffs2 mtd@system /system ro remount
&&& &&& &&& 改为
&&& &&& &&& &&& mount ext3 /dev/block/mmcblk0p6 /system
&&& &&& &&& &&& mount ext3 /dev/block/mmcblk0p6 /system ro remount
&&& &&& c) 将
&&& &&& &&& &&& mount yaffs2 mtd@userdata /data nosuid nodev
&&& &&& &&& 改为
&&& &&& &&& &&& mount ext3 /dev/block/mmcblk0p5 /data nosuid nodev
&&& &&& d) 将
&&& &&& &&& &&& mount yaffs2 mtd@cache /cache nosuid nodev
&&& &&& &&& 改为
&&& &&& &&& &&& mount ext3 /dev/block/mmcblk0p7 /cache nosuid nodev
&&& &&& e) 其他的,哪些service该起来,哪些不要起来,就自己决定了。
&&& 2:ltib中关于android的配置
&&& &&& ./ltib -m config 选择Config the kernel,保存退出
&&& &&& ./ltib ,运行后配置kernel,如果不能进入配置kernel界面,请先./ltib -m config,取消选中Config the kernel,保存退出,然后再重复上一步。(以后如遇不能配置kernel的情况,请按照这一步骤进行)
&&& &&& 配置kernel时,进入到devices drivers---Staging drivers --- Android. 除了Android RAM buffer console外,其他都选中。保存退出,即开始编译内核。
&&& 3:ashmem移植,可以从android 的kernel代码树中找到ashmm.c ashmm.h,并且对比修改makefile和shmm.h shmm.c
&&& &&& a) 打开此链接: http://android.git.kernel.org/?p=kernel/common.a=h=f92eabbae4e10ca1ebce6;hb=f92eabbae4e10ca1ebce6 ,或者进入 http://android.git.kernel.org/?p=kernel/common.a=summary 选择最新的tree。
&&& &&& b) 下载 mm/ashmem.c 和 include/linux/ashmem.h 到 /home/lancer/freescale/ltib/ltib/rpm/BUILD/linux-2.6.31-imx233 目录下相应位置
&&& &&& c) 查看 include/linux/mm.h文件,与本地相应文件对比,本地应该加入如下代码
&&& &&& &&& void shmem_set_file(struct vm_area_struct *vma, struct file *file);
&&& &&& d) 查看 mm/shmem.c 文件,与本地文件对比,本地应该加入如下代码
&&& &&& &&& void shmem_set_file(struct vm_area_struct *vma, struct file *file)
&&& &&& &&& {
&&& &&& &&& &&& if (vma-&vm_file)
&&& &&& &&& &&& &&& fput(vma-&vm_file);
&&& &&& &&& &&& vma-&vm_file =
&&& &&& &&& &&& vma-&vm_ops = &shmem_vm_
&&& &&& &&& }
&&& &&& e) 查看 mm/Makefile 文件,应该在obj-y中加入ashmem.o
&&& &&& f) 做完这些工作后,就可以开始再编译内核了
&&& 4:修改framebuffer驱动,使其支持android的double buffer 和 android 565颜色模式,我们使用的驱动是mxs
&&& &&& a) 修改 drivers/video/mxs/lcd_lms430.c ,将static struct mxs_platform_fb_entry fb_entry中.bpp修改为16,代码如下
&&& &&& &&& static struct mxs_platform_fb_entry fb_entry = {
&&& &&& &&& &&& .name = &lms430&,
&&& &&& &&& &&& .x_res = 272,
&&& &&& &&& &&& .y_res = 480,
&&& &&& &&& &&& .bpp = 16,
&&& &&& b) 修改 drivers/video/mxs/mxsfb.c ,将NUM_SCREENS 设置为2,即为double buffer
&&& &&& &&& #define NUM_SCREENS&&& 2
&&& &&& c) 因为mxs的驱动比较简单,好多功能都没有实现。我们也没有兴趣将它实现完全,所以只能让它初始化的时候就成为我们的目标状态。改了上面2条还不够,还必须对他硬件初始化部分做改动。
&&& &&& d) 修改 arch/arm/mach-mx23/include/mach/lcdif.h ,查看setup_dotclk_panel函数,它默认是32位真彩色,我们需要改成16位的 RGB565
&&& &&& &&& __raw_writel(BF_LCDIF_CTRL1_BYTE_PACKING_FORMAT(0xF) | //由7改为F
&&& &&& &&& &&& &&&& BM_LCDIF_CTRL1_RECOVER_ON_UNDERFLOW,
&&& &&& &&& &&& &&&& REGS_LCDIF_BASE + HW_LCDIF_CTRL1_SET);
&&& &&& &&& __raw_writel(BF_LCDIF_CTRL_WORD_LENGTH(0) |/* 16 bit, 由3改为0 */
&&& &&& &&& &&& &&&& BM_LCDIF_CTRL_DATA_SELECT |/* data mode */
&&& &&& &&& &&& &&&& BF_LCDIF_CTRL_INPUT_DATA_SWIZZLE(0) |/* no swap */
&&& &&& &&& &&& &&&& BF_LCDIF_CTRL_LCD_DATABUS_WIDTH(3),/* 24 bit */
&&& &&& &&& &&& &&&& REGS_LCDIF_BASE + HW_LCDIF_CTRL_SET);
&&& &&& e) 这样就修改完了framebuffer驱动,编译之后,烧到sd卡上,再启动时,你会发现linux启动过程中的企鹅翅膀变成绿色的,但大小还是跟原来一样!!为什么?因为它这个位图是24位的,而我们framebuffer是565的。如果你在启动过程中发现2只企鹅,或者更多,那么你的驱动改错了,再仔细分析分析吧。
&&& 5:触摸屏驱动的修改,参考以下几个链接,原理及过程我就不叙述了。
&&& &&& http://blog.chinaunix.net/u3/93670/showart_2213255.html
&&& &&& /thread-.html
&&& &&& http://blog.chinaunix.net/u3/93670/showart_2211310.html
&&& &&& http://androidzaurus.seesaa.net/article/.html
&&& &&& /zhouhanqing/blog/item/9d18a3cceb3451c.html
&&& &&& 对于我的触摸屏,我只需修改 drivers/input/touchscreen/mxs-ts.c 文件。
&&& &&& a) 在#include &*****&之后加如下代码
&&& &&& &&& #define TS_ABS_XY 1
&&& &&& &&& static int axis_table[] = {-35, 8147, -99, -60, -536}; // from /etc/pointercal by ts_calibrate
&&& &&& b) 修改process_lradc函数,将case TS_STATE_TOUCH_VERIFY:下的内容替换。
&&& &&& &&& 原先是
&&& &&& &&& &&& pr_debug(&%s: touch verify state, sample_count %d/n&, __func__,
&&& &&& &&& &&& &&& &&& info-&sample_count);
&&& &&& &&& &&& pr_debug(&%s: x %d, y %d/n&, __func__, info-&x, info-&y);
&&& &&& &&& &&& input_report_abs(info-&idev, ABS_X, info-&x);
&&& &&& &&& &&& input_report_abs(info-&idev, ABS_Y, info-&y);
&&& &&& &&& &&& input_report_abs(info-&idev, ABS_PRESSURE, pressure);
&&& &&& &&& &&& input_sync(info-&idev);
&&& &&& &&& &&& /* fall through */
&&& &&& &&& 替换为
&&& &&& &&& {
&&& &&& &&&&&&& unsigned long xraw, yraw, xtmp,
&&& &&& &&&&&&& xraw = (info-&x & 0xfff);
&&& &&& &&&&&&& yraw = (info-&y & 0xfff);
&&& &&& &&&&&&& xtmp = (axis_table[2] + axis_table[0] * xraw + axis_table[1] * yraw ) / axis_table[6];
&&& &&& &&&&&&& ytmp = (axis_table[5] + axis_table[3] * xraw + axis_table[4] * yraw ) / axis_table[6];
&&& &&& &&&&&&& printk (&windsome: pen down(%d:%d): x=%x:%d, y=%x:%d, pressure=%x:%d/n&,
&&& &&& &&& &&& &&& &&& xtmp, ytmp, info-&x && 12, info-&x & 0xfff, info-&y && 12, info-&y & 0xfff,
&&& &&& &&& &&& &&& &&& pressure && 12, pressure & 0xfff);
&&& &&& &&&&&&& input_report_abs(info-&idev, ABS_X, xtmp);
&&& &&& &&&&&&& input_report_abs(info-&idev, ABS_Y, ytmp);
&&& &&& &&& input_report_abs(info-&idev, ABS_PRESSURE, pressure);
&&& &&& &&& input_report_key(info-&idev, BTN_TOUCH, pressure);
&&& &&& &&& input_sync(info-&idev);
&&& &&& &&& }
&&& &&& &&& /* fall through */
&&& &&& c) 修改mxs_ts_probe函数
&&& &&& &&& 原先是
&&& &&& &&& &&& idev-&name = &MXS touchscreen&;
&&& &&& &&& &&& idev-&evbit[0] = BIT(EV_ABS);
&&& &&& &&& &&& input_set_abs_params(idev, ABS_X, 0, 0xFFF, 0, 0);
&&& &&& &&& &&& input_set_abs_params(idev, ABS_Y, 0, 0xFFF, 0, 0);
&&& &&& &&& 替换为
&&& &&& &&& &&& idev-&name = &MXS touchscreen&;
&&& &&& &&& &&& idev-&evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS);
&&& &&& &&& &&& idev-&keybit[BIT_WORD(BTN_TOUCH)] = BIT_MASK(BTN_TOUCH);
&&& &&& &&& &&& input_set_abs_params(idev, ABS_X, 0, 480, 0, 0);
&&& &&& &&& &&& input_set_abs_params(idev, ABS_Y, 0, 272, 0, 0);
&&& &&& d) 保存,编译成功。我们的触摸屏驱动在android2.2上就能正常运行了吗?
&&& && &e) android默认是多点触摸屏,需要修改frameworks/base/services/java/com/android/server /KeyInputQueue.java文件,找到
&&& && &&& &final int classes = di.
&&& && &&& &改为
&&& && &&& &final int classes = di.classes &(~(RawInputEvent.CLASS_TOUCHSCREEN_MT));
&&& && &&& &这样,android就可以支持单点触摸了
&&& && &e) 接下来编译android。下载运行后,我们进了锁界面,却什么都不能动。为啥?想想你的G2,在锁界面的情况下,你触摸屏幕能进去吗?也不能,还得按个 menu键。我们的系统上没有按键!没办法了,去掉锁界面!
&&& 6:开机进入无锁界面,因为我们没有按键,只有触摸屏,所以只能去掉锁了。参考链接 http://my.unix-center.net/~Simon_fu/?p=535 及 http://my.unix-center.net/~Simon_fu/?p=538 。原理我不叙述了。
&&& &&& a) 修改 frameworks/base/packages/SettingsProvider/res/values/defaults.xml ,
&&& &&& &&& &integer name=&def_screen_off_timeout&&60000&/integer&
&&& &&& &&& 改为
&&& &&& &&& &integer name=&def_screen_off_timeout&&-1&/integer&
&&& &&& b) 修改 frameworks/policies/base/phone/com/android/internal/policy/impl/KeyguardViewMediator.java ,
&&& &&& &&& private boolean mExternallyEnabled =
&&& &&& &&& 改为
&&& &&& &&& private boolean mExternallyEnabled =
&&& &&& c) make ,并更新到sd卡上,终于可以去操作了。
&&& 7:电源管理,应该移植android的电源管理驱动。暂时没时间,所以,直接改android中代码。
&&& &&& a) 修改frameworks/base/services/jni/com_android_server_BatteryService.cpp 文件,在android_server_BatteryService_update函数的最后加下面代码
&&& &&& &&& env-&SetBooleanField(obj, gFieldIds.mAcOnline, true);
&&& &&& &&& env-&SetIntField(obj, gFieldIds.mBatteryStatus, gConstants.statusUnknown);
&&& &&& &&& env-&SetIntField(obj, gFieldIds.mBatteryHealth, gConstants.healthUnknown);
&&& &&& b) 修改hardware/libhardware_legacy/power/power.c 文件,
&&& &&& &&& 原先
&&& &&& &&& &&& const char * const OLD_PATHS[] = {
&&& &&& &&& &&& &&& &/sys/android_power/acquire_partial_wake_lock&,
&&& &&& &&& &&& &&& &/sys/android_power/release_wake_lock&,
&&& &&& &&& &&& &&& &/sys/android_power/request_state&
&&& &&& &&& &&& };
&&& &&& &&& &&& const char * const NEW_PATHS[] = {
&&& &&& &&& &&& &&& &/sys/power/wake_lock&,
&&& &&& &&& &&& &&& &/sys/power/wake_unlock&,
&&& &&& &&& &&& &&& &/sys/power/state&
&&& &&& &&& &&& };
&&& &&& &&& &&& const char * const AUTO_OFF_TIMEOUT_DEV = &/sys/android_power/auto_off_timeout&;
&&& &&& &&& 改为
&&& &&& &&& &&& const char * const OLD_PATHS[] = {
&&& &&& &&& &&& &&& &/cache/sys/android_power/acquire_partial_wake_lock&,
&&& &&& &&& &&& &&& &/cache/sys/android_power/release_wake_lock&,
&&& &&& &&& &&& &&& &/cache/sys/android_power/request_state&
&&& &&& &&& &&& };
&&& &&& &&& &&& const char * const NEW_PATHS[] = {
&&& &&& &&& &&& &&& &/cache/sys/power/wake_lock&,
&&& &&& &&& &&& &&& &/cache/sys/power/wake_unlock&,
&&& &&& &&& &&& &&& &/cache/sys/power/state&
&&& &&& &&& &&& };
&&& &&& &&& &&& const char * const AUTO_OFF_TIMEOUT_DEV = &/cache/sys/android_power/auto_off_timeout&;
&&& &&& c) 在sd卡的cache分区建立上述文件,用文件模拟设备
第四章:& 后记
&&& 移植花了不少时间,这是移植完成后对过程的回忆及整理,可能有疏漏。错漏之处给您带来麻烦,还请原谅。如果您有什么问题或意见,可以给我发邮件
第五章: 补充
&&& 在移植过程中,改动了很多地方,把一些有用的改动记录下来。
&&& 1:修改system/core/init/init.c,这样我们可以看到打印信息
&&& &&& a) 原先
&&& &&& &&&&&&& if (needs_console) {
&&& &&& &&&&&&&&&&& setsid();
&&& &&& &&&&&&&&&&& open_console();
&&& &&& &&&&&&& } else {
&&& &&& &&&&&&&&&&& zap_stdio();
&&& &&& &&&&&&& }
&&& &&& 改为:
&&& &&& &&&&&&&&&&& setsid();
&&& &&& &&&&&&&&&&& open_console();
&&& &&& b) main函数中注释掉
&&& &&& &&& //open_devnull_stdio();
&&& 2:修改system/core/liblog/logd_write.c,我们可以看到java中的打印
&&& &&& 修改__write_to_log_init函数,将
&&& &&& &&&&&&& log_fds[LOG_ID_MAIN] = log_open(&/dev/&LOGGER_LOG_MAIN, O_WRONLY);
&&& &&& &&&&&&& log_fds[LOG_ID_RADIO] = log_open(&/dev/&LOGGER_LOG_RADIO, O_WRONLY);
&&& &&& &&&&&&& log_fds[LOG_ID_EVENTS] = log_open(&/dev/&LOGGER_LOG_EVENTS, O_WRONLY);
&&& &&& &&&&&&& log_fds[LOG_ID_SYSTEM] = log_open(&/dev/&LOGGER_LOG_SYSTEM, O_WRONLY);
&&& &&& 改为
&&& &&& #if FAKE_LOG_DEVICE
&&& &&& &&&&&&& log_fds[LOG_ID_MAIN] = log_open(&/dev/&LOGGER_LOG_MAIN, O_WRONLY);
&&& &&& &&&&&&& log_fds[LOG_ID_RADIO] = log_open(&/dev/&LOGGER_LOG_RADIO, O_WRONLY);
&&& &&& &&&&&&& log_fds[LOG_ID_EVENTS] = log_open(&/dev/&LOGGER_LOG_EVENTS, O_WRONLY);
&&& &&& &&&&&&& log_fds[LOG_ID_SYSTEM] = log_open(&/dev/&LOGGER_LOG_SYSTEM, O_WRONLY);
&&& &&& #else
&&& &&& &&&&&&& log_fds[LOG_ID_MAIN] = 1;
&&& &&& &&&&&&& log_fds[LOG_ID_RADIO] = 1;
&&& &&& &&&&&&& log_fds[LOG_ID_EVENTS] = 1;
&&& &&& &&&&&&& log_fds[LOG_ID_SYSTEM] = 1;
&&& &&& #endif
&&& 3:我们的工作平台为Ubuntu10.04LTS系统,32位主机。为了能将android编译通过需要做如下修改。
&&& &&& a) 注释掉build/core/main.mk的76行
&&& &&& &&& #$(error stop)
&&& &&& b) 修改external/clearsilver的子目录下的Android.mk,注释掉以下内容
&&& &&& &&& # This forces a 64-bit build for Java6
&&& &&& &&& #LOCAL_CFLAGS += -m64
&&& &&& &&& #LOCAL_LDFLAGS += -m64
第六章:其他链接
http://wiki.kldp.org/wiki.php /AndroidPortingOnRealTarget
注,根据网友的实践,发现一些错误,现纠正如下:
&&& 1,第二章:& 编译kernel 2:使用android的toolchain进行linux的编译 对于不修改boot_stream的人来说有问题。
&&& &&& 正确步骤应该是
&&& &&& a) 修改ltib配置成使用android的编译器
&&& &&& &&& 1) ./ltib -m config ,修改Toolchain选项为Custom, 修改Enter the custom toolchain path为(/home/lancer/freescale/android/prebuilt/linux-x86/toolchain/arm- eabi-4.4.0),修改 Enter the toolchain prefix.为(arm-eabi-)。
&&& &&& &&& 2) 去掉uboot支持,android上编译器编不过uboot
&&& &&& &&& 3) 在Package Selection中去掉所有包。注意包括去掉boot_stream,因为android的arm-toolchain不能将它编译通过。
&&& &&& b) ./ltib开始编译,最后在rootfs/boot下生成bootable_kernel, linux.config, System.map, uImage, vmlinux, zImage,此时内核即生成了,将被boot_stream使用。
&&& &&& c) 配置boot stream。./ltib -m prep -p boot_stream.spec ,如果有错误是因为rpm/BUILD/下已经存在了imx-bootlets-src-10.05.02,将这个移除。
&&& &&& d) cd rpm/BUILD; mv imx-bootlets-src-10.05.02 imx-bootlets-src-10.05.02-mx233; cd imx-bootlets-src-10.05.02-mx233; 文件夹改名目的是防止以后不小心被ltib删除。
&&& &&& e) 编译boot stream。因为android的arm-toolchain不能编译,所以我们使用ltib自带的4.1.2的编译器编译boot- stream。
&&& &&& &&& 1) 设置编译环境
&&& &&& &&& &&& export PATH=$PATH:/opt/freescale/usr/local/gcc-4.1.2-glibc-2.5-nptl-3/arm-none-linux-gnueabi/bin:/opt/freescale/ltib/usr/bin
&&& &&& &&& &&& export CROSS_COMPILE=arm-none-linux-gnueabi-
&&& &&& &&& 2) 将zImage从rootfs/boot拷贝到imx-bootlets-src-10.05.02-mx233 下
&&& &&& &&& &&& cp ../../../rootfs/boot/zImage .
&&& &&& &&& 3) 开始编译
&&& &&& &&& &&& make
&&& &&& &&& 4) 虽然错误退出,但原因是我们没有编译uboot。仍然可以看到本目录出现imx23_linux.sb。这就是我们所需要的。
&&& &&& d) 到这一步之后,默认的内核已经生成了。
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:138738次
积分:2190
积分:2190
排名:第7565名
原创:46篇
转载:234篇
评论:15条
(2)(2)(6)(8)(7)(4)(5)(1)(1)(7)(3)(5)(2)(1)(1)(2)(6)(7)(4)(1)(3)(14)(56)(33)(18)(21)(14)(9)(30)(7)}

我要回帖

更多关于 android debug bridge 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信