android系统开发知识框架和遇到的坑

1、android设备竖、横屏

android 5.1 launcher

packages\apps\Launcher2
packages\apps\Launcher3
 AndroidManifest.xml

android:screenOrientation="sensor" 设置由传感器转屏

另外经验证,【测试发现强制转换无效:android:screenOrientation="landscape"】是由于设备没有清除缓存,需要重新下载所有文件。

########################################################################################
2017.7.25
1.
驱动框架
1)写led_first_drv_open、led_first_drv_write函数
2)怎么告诉内核:
a.定义一个file_operations结构体
b.把这个结构体告诉内核:
register_chrdev
c.谁来调用  谁:驱动的入口函数(led_first_frv_init)
d.修饰 module_init

应用程序open("/dev/xxx"),read、write   
属性:  c , xxx(主设备号)
查找驱动是通过:设备类型的主设备号(major),而不是名字

2.
问题:第一个驱动程序,make时候 报错:/bin/sh: 1: arm-eabi-gcc: not found
解决:添加arm-eabi-gcc环境变量
sudo vi /etc/profile
添加:export PATH=$PATH:/usr/local/arm/arm-eabi-4.6/bin
source /etc/profile

3.传输文件
A:服务器和设备处于同一个路由器下通过scp进行复制
        scp led_first_drv.o root@192.168.15.102:/etc/test
B:不在同一个路由器下,通过Samba服务,并在电脑打开设备存储文件(手机的存储:/sdcard),直接进行复制粘贴
C:adb push led.ko /work
注:关闭金山卫士和毒霸,原因:占用端口

太多了,直接复制了o(* ̄︶ ̄*)o


2017.7.15
1、由于编译Android系统,需要至少4G内存,部署虚拟机到服务器上。
Do:
A:复制压缩文件:StandardUbuntu64.rar
B:解压StandardUbuntu64.rar文件,运行虚拟机,自动分配IP地址(192.168.98.165)



#######################################################################################################
2017.7.17
1、为了支持远程登录,虚拟机安装ssh软件
Do:
命令:sudo apt-get install ssh

2、对比、更新补丁文件

已经更新:
20170407
Android
1、EC20模块新版本补丁,兼容旧版本
cdrom\4418-2nd-patches\20170401-4418-EC20-new-version-patch


\device\nexell\s5p4418_drone\device.mk
#add by yangbin for EC20,2016-01-04
PRODUCT_COPY_FILES += \
	#device/nexell/s5p4418_drone/rpdzkj/system/bin/pppd:system/bin/pppd \
	#device/nexell/s5p4418_drone/rpdzkj/system/bin/chat:system/bin/chat \
	#device/nexell/s5p4418_drone/rpdzkj/system/etc/ppp/ip-down:system/etc/ppp/ip-down \
	#device/nexell/s5p4418_drone/rpdzkj/system/etc/ppp/ip-up:system/etc/ppp/ip-up \
	#device/nexell/s5p4418_drone/rpdzkj/system/lib/libreference-ril.so:system/lib/libreference-ril.so \
	device/nexell/s5p4418_drone/rpdzkj/etc/apns-conf.xml:system/etc/apns-conf.xml
	
#add by yangbin for EC20,2016-01-04
PRODUCT_COPY_FILES += \
	device/nexell/s5p4418_drone/rpdzkj/system/bin/pppd:system/bin/pppd \
	device/nexell/s5p4418_drone/rpdzkj/system/bin/chat:system/bin/chat \
	device/nexell/s5p4418_drone/rpdzkj/system/etc/ppp/ip-down:system/etc/ppp/ip-down \
	device/nexell/s5p4418_drone/rpdzkj/system/etc/ppp/ip-up:system/etc/ppp/ip-up \
	device/nexell/s5p4418_drone/rpdzkj/system/lib/libreference-ril.so:system/lib/libreference-ril.so \
	device/nexell/s5p4418_drone/rpdzkj/etc/apns-conf.xml:system/etc/apns-conf.xml


两种编译方法:
=======================================================
第一步:
在lollipop_2nd_release目录下,执行
source  jdk_openJdk17.sh

第二步:
在lollipop_2nd_release目录下,执行
.  ./build/envsetup.sh 
第三步:
在lollipop_2nd_release目录下,执行 lunch 进行选择 s5p4418

第四步:
在目录lollipop_2nd_release下执行:./make.sh kernel

第五步:
在目录lollipop_2nd_release下执行:./make.sh android 

========================================================

内核编译:
./device/nexell/tools/build.sh -t kernel
android 编译:
./device/nexell/tools/build.sh -t android



#######################################################################################################
2017.7.18
1.
显示屏再用MIPI接口,S5P4418提供MIPI接口配置,只需配置相关参数即可。
u-boot\boart\s5p4418\drone\include\Cfg_gpio.h 
kernel\arch\arm\plat-s5p4418\drone\include\Cfg_gpio.h
u-boot/board/s5p4418/drone/display.c

注:
A:MIPI/LVDS 接口为J103,LCD 接口为104
B:两种显示屏实现方式不同,硬件上LCD可以修改引脚,MIPI/LVDS 具有专有的接口引脚且不能修改硬件引脚

2.(修改的多,也许不用gt9147)
TP触摸屏:客户自定义参数:
gt9xx.h

//PART1:ON/OFF define
#define GTP_CUSTOM_CFG 1
// STEP_2(REQUIRED): Customize your I/O ports & I/O operations
#define GTP_RST_PORT	CFG_IO_TOUCH_RESET_PIN
#define GTP_INT_PORT	CFG_IO_TOUCH_PENDOWN_DETECT

//PART2:TODO define
#if GTP_CUSTOM_CFG
  #define GTP_MAX_HEIGHT   1280
  #define GTP_MAX_WIDTH    720
  #define GTP_INT_TRIGGER  0            // 0: Rising 1: Falling
#else
  #define GTP_MAX_HEIGHT   4096
  #define GTP_MAX_WIDTH    4096
  #define GTP_INT_TRIGGER  1
#endif


参考文件:GT9XX驱动移植说明书_for_Android_2014011401.pdf


3.
Android系统横竖屏修改
Android手机屏幕的横竖由加速度传感器感应,横竖屏的转换在Android系统框架中
所以需要修改Android源码。

#######################################################################################################
2017.7.19

1.(由于需要修改Android源码,所以使用Android studio进行阅读)
第一步:
在lollipop_2nd_release目录下,执行
source  jdk_openJdk17.sh

第二步:
在lollipop_2nd_release目录下,执行
.  ./build/envsetup.sh 

第三步:
在lollipop_2nd_release目录下,执行
mmm development/tools/idegen/

第四步:
在lollipop_2nd_release目录下,执行
sh ./development/tools/idegen/idegen.sh

生成android.iml和android.ipr这两个文件,这两个文件是Android Studio的工程配置文件。
注:
时间可能会久点:
Read excludes: 59ms
Traversed tree: 258249ms

第五步:(不进行过滤在索引时候需要花费很长时间,若是电脑配置低会卡死)
过滤一下我们不需要的源码文件,只导入我们需要的模块
打开android.iml文件,加入如下代码:除了frameworks模块的其他所有模块都过滤掉了
<excludeFolder url="file://$MODULE_DIR$/.repo" />
<excludeFolder url="file://$MODULE_DIR$/abi" />
<excludeFolder url="file://$MODULE_DIR$/art" />
<excludeFolder url="file://$MODULE_DIR$/bionic" />
<excludeFolder url="file://$MODULE_DIR$/bootable" />
<excludeFolder url="file://$MODULE_DIR$/build" />
<excludeFolder url="file://$MODULE_DIR$/cts" />
<excludeFolder url="file://$MODULE_DIR$/dalvik" />
<excludeFolder url="file://$MODULE_DIR$/developers" />
<excludeFolder url="file://$MODULE_DIR$/development" />
<excludeFolder url="file://$MODULE_DIR$/device" />
<excludeFolder url="file://$MODULE_DIR$/docs" />
<excludeFolder url="file://$MODULE_DIR$/external" />
<excludeFolder url="file://$MODULE_DIR$/hardware" />
<excludeFolder url="file://$MODULE_DIR$/libcore" />
<excludeFolder url="file://$MODULE_DIR$/libnativehelper" />
<excludeFolder url="file://$MODULE_DIR$/ndk" />
<excludeFolder url="file://$MODULE_DIR$/out" />
<excludeFolder url="file://$MODULE_DIR$/packages" />
<excludeFolder url="file://$MODULE_DIR$/pdk" />
<excludeFolder url="file://$MODULE_DIR$/prebuilt" />
<excludeFolder url="file://$MODULE_DIR$/prebuilts" />
<excludeFolder url="file://$MODULE_DIR$/sdk" />
<excludeFolder url="file://$MODULE_DIR$/system" />
<excludeFolder url="file://$MODULE_DIR$/tools" />


2.(java不能使用SecureCRT等类似软件修改,文件类型错误:error: class, interface, or enum expected)
    
1.修改frameworks\base\core\res\res\values\config.xml中config_lidOpenRotation的值为90。
old:<integer name="config_lidOpenRotation">-1</integer>
2.修改frameworks\base\services\core\java\com\android\server\wm\WindowManagerService.java中:
   int mRotation = 1;
3.修改frameworks\native\services\surfaceflinger\DisplayDevice.cpp里面:
  setProjection(DisplayState::eOrientation90, mViewport, mFrame);
          frame = Rect(h, w);
    
    Transform R;
    orientation = DisplayState::eOrientation90;
    DisplayDevice::orientationToTransfrom(orientation, w, h, &R);
old:    setProjection(DisplayState::eOrientationDefault, mViewport, mFrame);
	frame = Rect(w, h);
    Transform R;
    DisplayDevice::orientationToTransfrom(orientation, w, h, &R);
4.进入frameworks/native/services/surfaceflinger/surfaceFlinger.cpp
    修改函数voidSurfaceFlinger::onInitializeDisplay()中:
d.orientation = DisplayState::eOrientationDefault ;----->d.orientation=DisplayState::eOrientatio90;
5、交换一下Bootanimation 里面的h和w    
进入frameworks/base/cmds/bootanimation/BootAnimation.cpp
    修改status_t  BootAnimation::readyToRun函数中的                                                       
 spcontrol=session()- >createsurface(String8("BootAnimation"),dinfo.w,dinfo.h.PIXEL_FORMAT_RGB_565);  
 为:
 spcontrol=session()- >createsurface(String8("BootAnimation"),dinfo.h,dinfo.w.PIXEL_FORMAT_RGB_565);



####################################################################################################### 
2017.7.20
之前修改了横屏显示(感觉逻辑上还是存在问题),只是把竖屏改为横屏,界面的宽度还是没变。

android 5.1 launcher

	
		
packages\apps\Launcher2
packages\apps\Launcher3
AndroidManifest.xml

	android:screenOrientation="sensor" 设置由传感器转屏
	
注:测试发现强制转换无效:android:screenOrientation="landscape"



2.加速度方向分析
驱动位置:/kernel/drivers/input/misc/bca2xx/bma2x2.c
反向调用:

朝向:
static int bma2x2_set_orient_mode(struct i2c_client *client, unsigned char mode)
static ssize_t bma2x2_orient_mode_store(struct device *dev,struct device_attribute *attr,const char *buf, size_t count)
static DEVICE_ATTR(orient_mode, 0664/*S_IRUGO|S_IWUSR|S_IWGRP|S_IWOTH*/,bma2x2_orient_mode_show, bma2x2_orient_mode_store)


cat  /sys/devices/virtual/bst/ACC/orient_mode
cat  /sys/devices/virtual/input/input3/orient_mode

默认为0

echo  2 > /sys/devices/virtual/bst/ACC/orient_mode
echo  2 > /sys/devices/virtual/input/input3/orient_mode



加速度方向设定:
/kernel/drivers/input/misc/bca2xx/bst_sensor_common.h
struct bosch_sensor_specific {
	char *name;
	/* 0 to 7 */
	unsigned int place:3;
	int irq;
	int (*irq_gpio_cfg)(void);
};
static const struct bosch_sensor_axis_remap bst_axis_remap_tab_dft[MAX_AXIS_REMAP_TAB_SZ] = 
											{
												/* src_x src_y src_z  sign_x  sign_y  sign_z */
												{  0,    1,    2,     1,      1,      1 }, /* P0 */
												{  1,    0,    2,     1,     -1,      1 }, /* P1 */
												{  0,    1,    2,    -1,     -1,      1 }, /* P2 */
												{  1,    0,    2,    -1,      1,      1 }, /* P3 */

												{  0,    1,    2,    -1,      1,     -1 }, /* P4 */
												{  1,    0,    2,    -1,     -1,     -1 }, /* P5 */
												{  0,    1,    2,     1,     -1,     -1 }, /* P6 */
												{  1,    0,    2,     1,      1,     -1 }, /* P7 */
											};
==>											
void bst_remap_sensor_data(struct bosch_sensor_data *data,const struct bosch_sensor_axis_remap *remap)	
==>	
void bst_remap_sensor_data_dft_tab(struct bosch_sensor_data *data,int place)
==>		
kernel/drivers/input/misc/bca2xx/bma2x2.c	
static void bma2x2_remap_sensor_data(struct bma2x2acc *val,struct bma2x2_data *client_data)								
==>		
static int bma2x2_read_accel_xyz(struct i2c_client *client,signed char sensor_type, struct bma2x2acc *acc)
==>											
static ssize_t bma2x2_value_show(struct device *dev,struct device_attribute *attr, char *buf)
	==>	static DEVICE_ATTR(value, S_IRUGO,bma2x2_value_show, NULL);
	==>	cat  /sys/devices/virtual/input/input3/value     传感器 x,y,z
	*bma2x2 = input_get_drvdata(input);
	*input = to_input_dev(dev);

注释掉了	
static void bma2x2_irq_work_func(struct work_struct *work)


到这来后,发现bma2x2_data参数是通过to_input_dev获取的,系统通过platform总线注册设备,并把私有用户参数存放在i2c_board_info中,



放置方向缺省


#define SENSOR_NAME			"bma2x2"


static struct i2c_driver bma2x2_driver = {
	.driver = {
		.owner	= THIS_MODULE,
		.name	= SENSOR_NAME,         //与i2c_board_info一致
	},
	.suspend	= bma2x2_suspend,
	.shutdown   = bma2x2_shutdown,
	.resume		= bma2x2_resume,
	.id_table	= bma2x2_id,
	.probe		= bma2x2_probe,
	.remove		= __devexit_p(bma2x2_remove),

};


static struct i2c_board_info __initdata bma22x_i2c_bdi = {
	.type	= "bma2x2",
	.addr	= 0x18,//(0x4c),
	.irq	= PB_PIO_IRQ(CFG_IO_BMA250_DETECT),
	
};


驱动注册
kernel/arch/arm/plat-s5p4418/drone/device.c
//添加私有数据  BMA_pd
#if defined(CONFIG_SENSORS_BMA2X2)
++#include <linux/bst_sensor_common.h>

#define	BMA22X_I2C_BUS		(2)

++struct bosch_sensor_specific BMA_pd ={
++	.name = "bma2x2 sersor",
++	.place = 1,
++};

/* CODEC */
static struct i2c_board_info __initdata bma22x_i2c_bdi = {
	.type	= "bma2x2",
	.addr	= 0x18,//(0x4c),
	.irq	= PB_PIO_IRQ(CFG_IO_BMA250_DETECT),
++	.platform_data = &BMA_pd,
};
#endif									
											



####################################################################################################### 
2017.7.24

1.经验证,【测试发现强制转换无效:android:screenOrientation="landscape"】是由于设备没有清除缓存,需要重新下载所有文件。

2.常用文件
sys\devices\platform\rpdzkj-sysfs.c
arch\arm\plat-s5p4418\drone\Device.c
arch\arm\plat-s5p4418\drone\include\Cfg_main.h
arch\arm\mach-s5p4418\Devices.c 
kernel\arch\arm\mach-s5p4418\soc\gpio.c
drivers\rongpin\Rp_gpio_ctrl.c
drivers\rongpin\Rp_gpio_set.c
drivers\input\touchscreen\Gt9xx.c
drivers\i2c\busses\I2c-gpio.c 
drivers\input\keyboard\Nxp_io_key.c








####################################################################################################### 
2017.7.25

1.
驱动框架
1)写led_first_drv_open、led_first_drv_write函数
2)怎么告诉内核:
	a.定义一个file_operations结构体
	b.把这个结构体告诉内核:
		register_chrdev
	c.谁来调用  谁:驱动的入口函数(led_first_frv_init)
	d.修饰 module_init
	

应用程序open("/dev/xxx"),read、write   
		属性:  c , xxx(主设备号)
查找驱动是通过:设备类型的主设备号(major),而不是名字

2.
问题:第一个驱动程序,make时候 报错:/bin/sh: 1: arm-eabi-gcc: not found
解决:添加arm-eabi-gcc环境变量
	sudo vi /etc/profile
		添加:export PATH=$PATH:/usr/local/arm/arm-eabi-4.6/bin
	source /etc/profile
	
3.传输文件
A:
服务器和设备处于同一个路由器下通过scp进行复制
scp led_first_drv.o root@192.168.15.102:/etc/test

B:
不在同一个路由器下,通过Samba服务,并在电脑打开设备存储文件(手机的存储:/sdcard),直接进行复制粘贴

C:
adb push led.ko /work

注:关闭金山卫士和毒霸,原因:占用端口



arm-eabi-gcc -o test test.c


1、sys/ types.h: No such file or directory
2、cannot find crt0.o: No such file or directory
3、cannot find -lc

第一个:-I/usr/include
第二个:1)-L/home/xunfang/work/lollipop_2nd_release/linux/bootloader/u-boot-2014.07/arch/arm/lib   无效
		2)LIBRARY_PATH=/home/xunfang/work/lollipop_2nd_release/linux/bootloader/u-boot-2014.07/arch/arm/lib:$LIBRARY_PATH 
			export LIBRARY_PATH   无效
		3)cp /home/xunfang/work/lollipop_2nd_release/linux/bootloader/u-boot-2014.07/arch/arm/lib/crt0.o /usr/local/arm/arm-eabi-4.6/arm-eabi/lib   可行
第三个:cp /home/xunfang/work/lollipop_2nd_release/out/target/product/s5p4418_drone/obj/lib/libc.so	/usr/local/arm/arm-eabi-4.6/arm-eabi/lib


arm-linux-gcc -o test test.c


arm-eabi-gcc -o led_first_drv_test led_first_drv_test.c -v -I/usr/include -L/home/xunfang/work/lollipop_2nd_release/linux/bootloader/u-boot-2014.07/arch/arm/lib -static


 export PATH=$PATH:/usr/local/arm/gcc-3.4.5-glibc-2.3.6/bin



arm-linux-gcc -o led_first_drv_test -c led_first_drv_test.c 

arm-eabi-gcc -o led_first_drv_test led_first_drv_test.c
fatal error: sys/ types.h: No such file or directory


arm-eabi-gcc -o led_first_drv_test -I/usr/include  led_first_drv_test.c
/usr/local/arm/arm-eabi-4.6/bin/../lib/gcc/arm-eabi/4.6.x-google/../../../../arm-eabi/bin/ld: cannot find crt0.o: No such file or directory
/usr/local/arm/arm-eabi-4.6/bin/../lib/gcc/arm-eabi/4.6.x-google/../../../../arm-eabi/bin/ld: cannot find -lc
collect2: ld returned 1 exit status


LIBRARY_PATH=/home/xunfang/work/lollipop_2nd_release/linux/bootloader/u-boot-2014.07/arch/arm/lib:$LIBRARY_PATH 
export LIBRARY_PATH

xunfang@ubuntu:/usr/local/arm/arm-eabi-4.6/arm-eabi/lib$ cp /home/xunfang/work/lollipop_2nd_release/linux/bootloader/u-boot-2014.07/arch/arm/lib/crt0.o ./





xunfang@ubuntu:~/work/lollipop_2nd_release/android5.1/led/led_first$ arm-eabi-gcc -o led_first_drv_test -I/usr/include  led_first_drv_test.c -v
Using built-in specs.
COLLECT_GCC=arm-eabi-gcc
COLLECT_LTO_WRAPPER=/usr/local/arm/arm-eabi-4.6/bin/../libexec/gcc/arm-eabi/4.6.x-google/lto-wrapper
Target: arm-eabi
Configured with: /tmp/android-15472/src/build/../gcc/gcc-4.6/configure --prefix=/usr/local --target=arm-eabi --host=x86_64-linux-gnu --build=x86_64-linux-gnu --with-gnu-as --with-gnu-ld --enable-languages=c,c++ --with-gmp=/tmp/android-15472/obj/temp-install --with-mpfr=/tmp/android-15472/obj/temp-install --with-mpc=/tmp/android-15472/obj/temp-install --without-ppl --without-cloog --disable-libssp --enable-threads --disable-nls --disable-libmudflap --disable-libgomp --disable-libstdc__-v3 --disable-sjlj-exceptions --disable-shared --disable-tls --disable-libitm --with-float=soft --with-fpu=vfp --with-arch=armv5te --enable-target-optspace --with-abi=aapcs --with-gcc-version=4.6 --with-binutils-version=2.21 --with-gmp-version=4.2.4 --with-mpfr-version=2.4.1 --with-gdb-version=7.3.x --with-arch=armv5te --with-sysroot=/tmp/android-15472/install/sysroot --with-prefix=/tmp/android-15472/install --with-gold-version=2.21 --enable-gold --disable-gold --disable-multilib --program-transform-name='s&^&arm-eabi-&'
Thread model: single
gcc version 4.6.x-google 20120106 (prerelease) (GCC) 
COLLECT_GCC_OPTIONS='-o' 'led_first_drv_test' '-I' '/usr/include' '-v' '-march=armv5te' '-mfloat-abi=soft' '-mfpu=vfp' '-mabi=aapcs'
 /usr/local/arm/arm-eabi-4.6/bin/../libexec/gcc/arm-eabi/4.6.x-google/cc1 -quiet -v -I /usr/include -iprefix /usr/local/arm/arm-eabi-4.6/bin/../lib/gcc/arm-eabi/4.6.x-google/ -D__USES_INITFINI__ led_first_drv_test.c -quiet -dumpbase led_first_drv_test.c -march=armv5te -mfloat-abi=soft -mfpu=vfp -mabi=aapcs -auxbase led_first_drv_test -version -o /tmp/cc1mO9t2.s
GNU C (GCC) version 4.6.x-google 20120106 (prerelease) (arm-eabi)
        compiled by GNU C version 4.4.3, GMP version 4.2.4, MPFR version 2.4.1, MPC version 0.8.1
GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
ignoring nonexistent directory "/usr/local/arm/arm-eabi-4.6/bin/../lib/gcc/arm-eabi/4.6.x-google/../../../../arm-eabi/include"
ignoring duplicate directory "/usr/local/arm/arm-eabi-4.6/bin/../lib/gcc/../../lib/gcc/arm-eabi/4.6.x-google/include"
ignoring nonexistent directory "/tmp/android-15472/install/sysroot/usr/local/include"
ignoring duplicate directory "/usr/local/arm/arm-eabi-4.6/bin/../lib/gcc/../../lib/gcc/arm-eabi/4.6.x-google/include-fixed"
ignoring nonexistent directory "/usr/local/arm/arm-eabi-4.6/bin/../lib/gcc/../../lib/gcc/arm-eabi/4.6.x-google/../../../../arm-eabi/include"
ignoring nonexistent directory "/tmp/android-15472/install/sysroot/usr/include"
#include "..." search starts here:
#include <...> search starts here:
 /usr/include
 /usr/local/arm/arm-eabi-4.6/bin/../lib/gcc/arm-eabi/4.6.x-google/include
 /usr/local/arm/arm-eabi-4.6/bin/../lib/gcc/arm-eabi/4.6.x-google/include-fixed
End of search list.
GNU C (GCC) version 4.6.x-google 20120106 (prerelease) (arm-eabi)
        compiled by GNU C version 4.4.3, GMP version 4.2.4, MPFR version 2.4.1, MPC version 0.8.1
GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
Compiler executable checksum: 7e0a3541f55243241c747ff83ef85799
COLLECT_GCC_OPTIONS='-o' 'led_first_drv_test' '-I' '/usr/include' '-v' '-march=armv5te' '-mfloat-abi=soft' '-mfpu=vfp' '-mabi=aapcs'
 /usr/local/arm/arm-eabi-4.6/bin/../lib/gcc/arm-eabi/4.6.x-google/../../../../arm-eabi/bin/as -v -I /usr/include -march=armv5te -mfloat-abi=soft -mfpu=vfp -meabi=5 -o /tmp/ccA1GPfG.o /tmp/cc1mO9t2.s
GNU assembler version 2.21 (arm-eabi) using BFD version (GNU Binutils) 2.21
COMPILER_PATH=/usr/local/arm/arm-eabi-4.6/bin/../libexec/gcc/arm-eabi/4.6.x-google/:/usr/local/arm/arm-eabi-4.6/bin/../libexec/gcc/:/usr/local/arm/arm-eabi-4.6/bin/../lib/gcc/arm-eabi/4.6.x-google/../../../../arm-eabi/bin/
LIBRARY_PATH=/usr/local/arm/arm-eabi-4.6/bin/../lib/gcc/arm-eabi/4.6.x-google/:/usr/local/arm/arm-eabi-4.6/bin/../lib/gcc/:/usr/local/arm/arm-eabi-4.6/bin/../lib/gcc/arm-eabi/4.6.x-google/../../../../arm-eabi/lib/
COLLECT_GCC_OPTIONS='-o' 'led_first_drv_test' '-I' '/usr/include' '-v' '-march=armv5te' '-mfloat-abi=soft' '-mfpu=vfp' '-mabi=aapcs'
 /usr/local/arm/arm-eabi-4.6/bin/../libexec/gcc/arm-eabi/4.6.x-google/collect2 --sysroot=/tmp/android-15472/install/sysroot -X -o led_first_drv_test /usr/local/arm/arm-eabi-4.6/bin/../lib/gcc/arm-eabi/4.6.x-google/crti.o /usr/local/arm/arm-eabi-4.6/bin/../lib/gcc/arm-eabi/4.6.x-google/crtbegin.o /usr/local/arm/arm-eabi-4.6/bin/../lib/gcc/arm-eabi/4.6.x-google/../../../../arm-eabi/lib/crt0.o -L/usr/local/arm/arm-eabi-4.6/bin/../lib/gcc/arm-eabi/4.6.x-google -L/usr/local/arm/arm-eabi-4.6/bin/../lib/gcc -L/usr/local/arm/arm-eabi-4.6/bin/../lib/gcc/arm-eabi/4.6.x-google/../../../../arm-eabi/lib /tmp/ccA1GPfG.o --start-group -lgcc -lc --end-group /usr/local/arm/arm-eabi-4.6/bin/../lib/gcc/arm-eabi/4.6.x-google/crtend.o /usr/local/arm/arm-eabi-4.6/bin/../lib/gcc/arm-eabi/4.6.x-google/crtn.o
/usr/local/arm/arm-eabi-4.6/bin/../lib/gcc/arm-eabi/4.6.x-google/../../../../arm-eabi/bin/ld: cannot find -lc
collect2: ld returned 1 exit status

arm-linux-gcc test.c -o test -I/home/sec/sqlite3-arm/include -L/home/sec/sqlite3-arm/lib -lsqlite3





arm-eabi-gcc不支持编译linux应用
http://www.veryarm.com/296.html 

换个版本

或者用android.mk 

http://rpdzkj.cn/forum.php?mod=viewthread&tid=12&highlight=spi 







####################################################################################################### 
2017.7.26

1、编译程序总结。

注:arm-eabi-gcc 、arm-linux-gcc 均不能成功编译
	arm-eabi-gcc:始终无法编译通过,原因:arm-eabi-gcc是Android ARM 编译器,arm-eabi-gcc不支持编译linux应用
	arm-linux-gcc:生成的执行文件无法执行,原因:编译器可能冲突
	
1)下载安装:arm-none-linux-gnueabi-gcc 交叉编译

arm-2008q3-41-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2下载地址(http://blog.csdn.net/wangzhiyu1980/article/details/16972937包含有):
https://sourcery.mentor.com/sgpp/lite/arm/portal/package3397/public/arm-none-linux-gnueabi/arm-2008q3-41-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2

参考:
http://blog.csdn.net/cbbbc/article/details/46708437
http://blog.csdn.net/wangzhiyu1980/article/details/16972937

2)安装配置
目录位置:cd /usr/local/arm
解压命令:sudo tar -jxvf arm-2008q3-41-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2 

环境配置:
sudo vi /etc/profile
	添加路径:export PATH=$PATH:/usr/local/arm/arm-2008q3/bin

环境配置生效:source /etc/profile

3)编译文件
export CROSS_COMPILE=/usr/local/arm/arm-2008q3/bin/arm-none-linux-gnueabi-

arm-none-linux-gnueabi-gcc  test.c -o test -static

注:必须使用静态库 
未使用-static   运行程序是报错:No such file or directory

2、创建字符设备:
	a.手动:
		mknod /dev/xxx c 111 0     (mknod /dev/xxx c 主 次)
	b.自动创建:   mdev (根据系统信息创建节点)
	
	
cat /proc/devices

####################################################################################################### 
2017.7.27

1、
由于需要对设备进行开发,在设备内核中添加文件,位置:/system/work
注:根目录和其他目录无法添加文件夹或者文件


2、写LED驱动

相同类型设备可以使用此设备号进行区分




####################################################################################################### 
2017.7.28

1、驱动框架
a、构建结构体
file_operations
{
.open
.write
.read
}
b、入口函数里注册和出口函数卸载
c、给sysfs提供更多信息,udev机制 可以自动创建设备节点


2、Android测试程序脚本

#! /system/bin/sh

while true
do
    sleep 1
    ./ledtest on 	
    sleep 1
    ./ledtest off 	
done

注:#! /system/bin/sh	是Android中的sh,注意中间有空格
	#!/bin/sh			是linux的脚本
	
	
	
####################################################################################################### 
2017.8.1


后台运行
./sencondtest &

查看程序占用CUP资源
top



中断:
request_irq(unsigned int irq, irq_handler_t handler, unsigned long flags, const char * name, void * dev)

查看设备
cat /proc/devives
查看中断
cat /proc/interrupts
打开中断设备(以文件描述符5)
exec 5</dev/key1
打开中断设备(文件描述符5)
exec 5<&-

查看当前shell的PID
echo $$




调试流程:
加载中断:insmod third_drv.ko
查看加载是否成功:cat /proc/devives  (自动分配:245 thrid_drv)
查看是否打开驱动设备:cat /proc/interrupts   ()
打开中断设备(以文件描述符5):exec 5</dev/key1
查看是否打开驱动设备:cat /proc/interrupts   (自动分配:68:          0          0          0          0      GPIO  key1)

注:
exec 5</dev/key1:打开key1并定位到5
查看当前shell的PID:
echo $$   (返回:113)
ps 		  (找到:root      113   1     9320   780   c00595d4 b6f2b270 S /system/bin/sh)
查看key1打开的文件信息:ls -l /proc/113/fd   (得到:lr-x------ root     shell             2017-08-01 16:43 5 -> /dev/key1)

关闭key1文件,释放中断:exec 5<&-
查看是否打开驱动设备:cat /proc/interrupts   (没有了:68:          0          0          0          0      GPIO  key1)





####################################################################################################### 
2017.8.2

arm-none-linux-gnueabi-gcc

按键

应用程序去调用
驱动机制:查询、中断、poll

由驱动发信号给应用程序
驱动机制:异步信号



poll机制:中断驱动,应用程序进行查询时,如果没有发生中断,将read函数永远不会返回值;poll机制提供了超时返回。



异步通知(信号机制)

进程间发信号
eg:kill -9 PID
	发 signal 接
	
	
目标:按下按键时,驱动通知应用程序,并在自定义signal_handle函数中read驱动
1、应用程序注册信号处理函数
2、谁发:驱动
3、发给谁  ==>app  ==>app要告诉驱动PID
4、怎么发: kill_fasync


1、signal(SIGIO,signal_handle);
3、
fcntl(fd,F_SETOWN,getpid());
oflags = fcntl(fd,F_GETFL);
fcntl(fd, F_SETFL, oflags| FASYNC);


####################################################################################################### 
2017.8.3

同步互斥

目的:同一时刻,只能有一个app应用程序打开 /dev/keys


1、原子操作
atomic_t v = ATOMIC_INIT(1);			//定义原子变量并初始化为1
int atomic_dec_and_test(atomic_t *v);	//自减操作后测试是否为0,为0则返回ture,否则返回false
atomic_dec(atomic_t *v);				//原子变量减少1
atomic_inc(atomic_t *v);				//原子变量增加1

2、信号量
信号量(semaphore)是用于保护临界区的一种常用方法,只有得到信号量的进程才能执行临界区代码
当获取不到信号量时,进程进入休眠等待状态

方法1:动态法
定义信号量
struct semaphore sem;
初始化信号量
void sema_init(struct semaphore * sem, int val);   //val为初始化信号量的值

方法2:静态法
DEFINE_SEMAPHORE(name);//在新的内核中直接用semaphore
此时信号量被初始化为1,即互斥量。效果等同于DEFINE_MUTEX(name);

获取信号量:
void down(struct semaphore *sem);
int  down_interruptible(struct semaphore *sem);
int  down_trylock(struct semaphore *sem);

释放信号量
void up(struct semaphore *sem);



注:down () 函数现已不建议继续使用,建议使用  down_killable ()或  down_interruptible ()

3、阻塞
阻塞操作
是指在执行设备操作时,若不能获得资源则挂起进程,直到满足可操作的条件后再进行操作。
被挂起的进程进入休眠状态,被从调度器的运行队列移走,直到等待的条件被满足

fd = open(".....", O_RDWR);	 //阻塞

非阻塞操作
进程在不能进行设备操作时并不挂起,他或者放弃,或者不停的查询,直至可以进行操作位置。


fd = open(".....", O_RDWR | O_NONBLOCK);	//非阻塞



####################################################################################################### 
2017.8.4

去抖动:定时器

按键发生中断时,
中断函数中修改定时器启动时间于10ms后,

定时器时间到好,唤醒中断函数,上报按键值



输入子系统
之前写的按键驱动程序,只能自己使用,其他人用不了,因为不知道接口。
所以需要使用现成的驱动,即input子系统

输入子系统框架
1、input.c(核心层)
2、【右】向上注册input_register_handler【纯软件】 eg:evdev.c keyboard.c mousedev.c
2、【左】向上注册input_register_device【设备:代表硬件】

注册input_handler
input_register_handle
	//放入数据
	input_table[handler->minor >> 5] = handler;
	
	//放入链表
	list_add_tail(&handler->node, &input_handler_list);

	//对于每个input_dev,调用input_attach_handler
	list_for_each_entry(dev, &input_dev_list, node)
		input_attach_handler(dev, handler);//根据input_attach_handler的id_table判断能否支持这个input_dev

注册输入设备:
input_register_device
	//放入链表
	list_add_tail(&dev->node, &input_dev_list);
	//对应每一个input_handler,都调用input_attach_handler
	list_for_each_entry(handler, &input_handler_list, node)
		input_attach_handler(dev, handler);//根据input_attach_handler的id_table判断能否支持这个input_dev

input_attach_handler
	id = input_match_device(handler, dev);
	error = handler->connect(handler, dev, id);

注册input_dev或input_handler时,会两两比较左边的input_dev和右边的input_handler,
根据input_handler的id_table判断这个input_handler能否支持这个input_dev,
如果能支持,则调用inout_handler的connect函数建立连接



怎么建立连接?
1.分配一个input_handle结构体
2.
	evdev->handle.dev = input_dev;		//指向左边的input_dev
	evdev->handle.handler = input_handler;			//指向右边的input_handler
3.注册
	input_dev->h_list 		= &input_handle
	input_handler->h_list 	= &input_handle
	
	
evdev_connect
	evdev = kzalloc(sizeof(struct evdev), GFP_KERNEL);//分配一个input_handle
	
	//设备
	evdev->handle.dev = input_get_device(dev);	//指向左边的input_dev
	evdev->handle.name = dev_name(&evdev->dev);
	evdev->handle.handler = handler;			//指向右边的input_handler
	evdev->handle.private = evdev;

	//注册handle
	error = input_register_handle(&evdev->handle);

怎么读按键?
app: read
----------------------
	.............
		evdev_read
				//休眠
				retval = wait_event_interruptible(evdev->wait,
						client->packet_head != client->tail ||
						!evdev->exist);

谁来唤醒?
evdev_event
		wake_up_interruptible(&evdev->wait);

evdev_event被谁调用?
在设备的中断服务程序中,确定事件是什么,然后调用相应的input_handler的event处理函数
按键中断定时器去抖动中断函数
gpio_keys_irq_timer
	//上报事件
	input_event(input, EV_KEY, bdata->button->code, 0);
	input_sync(input);

void input_event(struct input_dev *dev, unsigned int type, unsigned int code, int value)
	input_handle_event	
		if ((disposition & INPUT_PASS_TO_DEVICE) && dev->event)
			dev->event(dev, type, code, value);//调用evdev_event


怎么写符合输入子系统框架的驱动程序?
1.分配一个input_dev结构体
2.设置
3.注册
4.硬件相关的代码,比如在中断服务程序里上报事件。


struct input_dev {
	const char *name;
	const char *phys;
	const char *uniq;
	struct input_id id;

	unsigned long propbit[BITS_TO_LONGS(INPUT_PROP_CNT)];

	unsigned long evbit[BITS_TO_LONGS(EV_CNT)];		//表示能产生哪类事件
	unsigned long keybit[BITS_TO_LONGS(KEY_CNT)];	//表示能产生哪些按键
	unsigned long relbit[BITS_TO_LONGS(REL_CNT)];	//表示能产生哪些相对位移事件,x,y,滚轮
	unsigned long absbit[BITS_TO_LONGS(ABS_CNT)];	//表示能产生哪些绝对位移事件
	unsigned long mscbit[BITS_TO_LONGS(MSC_CNT)];
	unsigned long ledbit[BITS_TO_LONGS(LED_CNT)];
	unsigned long sndbit[BITS_TO_LONGS(SND_CNT)];
	unsigned long ffbit[BITS_TO_LONGS(FF_CNT)];
	unsigned long swbit[BITS_TO_LONGS(SW_CNT)];




o	SGl8023W
o	A5SHB 场效应管
o	S8050D J3Y 三极管
o	618 功率开关晶体管 三极管
o	QX4054 BA4N 充电IC
o	105v胆电容
o	106c胆电容
	双色灯珠




####################################################################################################### 
2017.8.7


bus - drv - dev 模型

1、bus
2、【左边】device(硬件相关)
2、【右边】driver(比较稳定的代码)

driver
	platform_driver_register
		driver_register
			1.把driver结构体放到bus的drv链表中
			2.从bus的dev链表取出每一个dev,用bus的match函数判断dev能否支持drv
			3.若可以支持,则调用drv的probe函数

device
	platform_device_register
		platform_device_add
				device_add 
					1.把device放入bus的dev链表
					2.从bus的drv链表取出每一个drv,用bus的match函数判断drv能否支持dev
					3.若可以支持,则调用drv的probe函数

以上所述是一种左右建立联系的机制。



内核2.6版本
I2C驱动框架

APP: 	open,		read,   	write
--------------------------------------------
驱动:	drv_open,	drv_read,	drv_write 		
			1、I2C设备驱动:知道数据含义
		----------------------------
		I2C总线驱动程序
			1、识别
			2、听过读写函数:知道如何收、发
--------------------------------------------
硬件:	具体的I2C设备		


bus - drv - dev 模型

1、bus
2、【左边】device(适配器/插槽)
			向上注册:i2c_add_adapter
2、【右边】driver(设备驱动程序)
			向上注册:i2c_add_driver
			
			
device(client适配器/插槽)
I2C总线驱动程序
1、分配i2c_adapter
2、设置:algo = xxx    	
				.master_xfer
3、注册:i2c_add_adapter

i2c_add_adapter
1、把i2c_adapter放入bus中的i2c_bus_type的链表中
2、调用drv的attach_adapter
3、i2c_probe(adapter,设备地址,function)
	1、用adapter的master_xfer发信号,确定有无该设备
	2、若有,则调用function


driver(设备驱动程序)
i2c_drivr
	.attach_adapter  接到适配器上去
	
i2c_add_driver
	i2c_register_driver
	
		1、把i2c_driver放入bus中的i2c_bus_type的链表中
			driver->driver.bus = &i2c_bus_type;
		2、从adapter链表中取出“适配器”,调用drv的attach_adapter
			res = driver_register(&driver->driver);
				ret = bus_add_driver(drv);
					error = driver_attach(drv);
		3、i2c_probe(adapter,设备地址,function)
			1、用adapter的master_xfer发信号,确定有无该设备
			2、若有,则调用function

http://blog.csdn.net/lickylin/article/details/6692691




####################################################################################################### 
2017.8.8

内核3.4版本
1. 框架
1.1 硬件协议简介
1.2 驱动框架
1.3 bus-drv-dev模型及写程序
a. 设备的4种构建方法
a.1 定义一个i2c_board_info, 里面有:名字, 设备地址
    然后i2c_register_board_info(busnum, ...)   (把它们放入__i2c_board_list链表)
    			list_add_tail(&devinfo->list, &__i2c_board_list);

	链表何时使用:
	i2c_register_adapter > i2c_scan_static_board_info > i2c_new_device    				

    使用限制:必须在 i2c_register_adapter 之前 i2c_register_board_info
	所以:不适合我们动态加载insmod

a.2 直接i2c_new_device, i2c_new_probed_device
a.2.1 i2c_new_device        : 认为设备肯定存在
a.2.2 i2c_new_probed_device :对于"已经识别出来的设备"(probed_device),才会创建("new")
i2c_new_probed_device
	probe(adap, addr_list[i])   /* 确定设备是否真实存在 */
	info->addr = addr_list[i];
	i2c_new_device(adap, info);

a.3 从用户空间创建设备
创建设备
echo at24c08 0x50 > /sys/class/i2c-adapter/i2c-0/new_device

导致i2c_new_device被调用

删除设备
echo 0x50 > /sys/class/i2c-adapter/i2c-0/delete_device

导致i2c_unregister_device

a.4 前面的3种方法都要事先确定适配器(I2C总线,I2C控制器)
    如果我事先并不知道这个I2C设备在哪个适配器上,怎么办?去class表示的所有的适配器上查找
    有上一些I2C设备的地址是一样,怎么继续分配它是哪一款?用detect函数

static struct i2c_driver at24cxx_driver = {
	.class  = I2C_CLASS_HWMON, /* 表示去哪些适配器上找设备 */
	.driver	= {
		.name	= "100ask",
		.owner	= THIS_MODULE,
	},
	.probe		= at24cxx_probe,
	.remove		= __devexit_p(at24cxx_remove),
	.id_table	= at24cxx_id_table,
	.detect     = at24cxx_detect,  /* 用这个函数来检测设备确实存在 */
	.address_list	= addr_list,   /* 这些设备的地址 */
};

    
去"class表示的这一类"I2C适配器,用"detect函数"来确定能否找到"address_list里的设备",
如果能找到就调用i2c_new_device来注册i2c_client, 这会和i2c_driver的id_table比较,
如果匹配,调用probe

i2c_add_driver
	i2c_register_driver
		a. at24cxx_driver放入i2c_bus_type的drv链表
		   并且从dev链表里取出能匹配的i2c_client并调用probe
		driver_register
			
		
		b. 对于每一个适配器,调用__process_new_driver
		   对于每一个适配器,调用它的函数确定address_list里的设备是否存在
		   如果存在,再调用detect进一步确定、设置,然后i2c_new_device
		/* Walk the adapters that are already present */
		i2c_for_each_dev(driver, __process_new_driver);
			__process_new_driver
				i2c_do_add_adapter
					/* Detect supported devices on that bus, and instantiate them */
					i2c_detect(adap, driver);
						for (i = 0; address_list[i] != I2C_CLIENT_END; i += 1) {
							err = i2c_detect_address(temp_client, driver);
										/* 判断这个设备是否存在:简单的发出S信号确定有ACK */
										if (!i2c_default_probe(adapter, addr))
											return 0;
										
										memset(&info, 0, sizeof(struct i2c_board_info));
										info.addr = addr;	
										
										// 设置info.type
										err = driver->detect(temp_client, &info);
					
										i2c_new_device


b. 驱动的写法

2. 完善设备驱动程序

3. 不自己写驱动直接访问

Device Drivers
	 I2C support
		<*>   I2C device interface

4. 编写"总线(适配器adapter)"驱动

Device Drivers
	 I2C support
	 	I2C Hardware Bus support
	 		< > S3C2410 I2C Driver


book:
深入理解android内核设计思想
深入理解android 卷3



####################################################################################################### 
2017.8.9

多点触摸屏驱动程序
1	分配input_dev结构体
	struct input_dev *ts_dev;
	ts_dev = input_allocate_device();
	
2	设置
2.1 能产生哪类事件
	set_bit(EV_SYN, ts_dev->evbit);
	set_bit(EV_ABS, ts_dev->evbit);

2.2 能产生这类事件中的哪些
	set_bit(ABS_MT_TRACKING_ID, ts_dev->absbit);
	set_bit(ABS_MT_POSITION_X,  ts_dev->absbit);
	set_bit(ABS_MT_POSITION_Y,  ts_dev->absbit);

2.3 这些事件的范围
	//最大ID值由硬件决定
	input_set_abs_params(ts_dev, ABS_MT_TRACKING_ID, 0, 最大ID值, 0, 0);
	input_set_abs_params(ts_dev, ABS_MT_POSITION_X, 0, 最大X坐标, 0, 0);
	input_set_abs_params(ts_dev, ABS_MT_POSITION_Y, 0, 最大Y坐标, 0, 0);

	// Android会根据它找到配置文件
	ts_dev->name = MTP_NAME;
3	注册
	input_register_device(ts_dev);input_register_device(ts_dev);
	
4	硬件相关操作
4.1 注册中断
	request_irq(…);
4.2 上报事件
	
4.2.1 按下/滑动
	for(每个触点i) {
	    input_report_abs(ts_dev, ABS_MT_POSITION_X, x);
	    input_report_abs(ts_dev, ABS_MT_POSITION_Y, y);
	    input_report_abs(ts_dev, ABS_MT_TRACKING_ID, id);
	    input_mt_sync(ts_dev);
	}
	input_sync(ts_dev);
	
	
4.2.2 松开
	//完成松开
	input_mt_sync(ts_dev);
	input_sync(ts_dev);



####################################################################################################### 
2017.8.10

Android输入系统深入分析
1.输入系统框架
3. reader/dispatcher线程启动过程源码分析
4. Reader线程_使用EventHub读取事件
5. Reader线程_核心类及配置文件
6. Reader线程_核心类及配置文件_分析
7. Reader线程_简单处理
8. Dispatcher线程_总体框架
9. Dispatcher线程情景分析_Reader线程传递事件
10. Dispatcher线程情景分析_dispatch前处理




####################################################################################################### 
2017.8.30

mipi屏驱动修改:1280*800
使用以前系统默认的配置参数

触摸屏改为ft5x06 
IC:FT5426 
ADDR:0x70

        
grep "TOUCHSCREEN_FT5X0X" Kconfig      

Makefile    

修改系统配置:make ARCH=arm menuconfig


添加文件:ft5x0x_ts_2.c   ft5x0x_ts_2.h
修改Makefile 
ft5x0x_ts.o	 == >  ft5x0x_ts_2.o

修改驱动


修改设备名字


busybox i2cget -f -y 1 0x44 0x01 w
i2cget -f -y 1 0x38 0x01 w


busybox i2cget -f -y 1 0x88 0x01 w



			 ] ft5x0x_ts_probe
[    2.635000] msg ft5x0x_i2c_read i2c read error: -6
[    2.727000] msg ft5x0x_i2c_read i2c read error: -6
[    2.819000] msg ft5x0x_i2c_read i2c read error: -6
[    2.911000] msg ft5x0x_i2c_read i2c read error: -6



####################################################################################################### 
2017.9.5

触摸屏使用4412的驱动,兼容ft5406 和 ft5426

之前的问题是连接座有问题,scl和sda连接到一起,后来scl和gnd又连接到一起了


屏幕导航栏消失:
屏的右边一直有一栏黑色的,但没有导航栏。

第一种情况,DPI太大,导航栏出现在右侧或显示不出来,接HDMI的时候会出现溢出或不满。
第二种情况,DPI太小,显示的图标和字体偏小,触摸操作容易出现误操作。

如何改DPI
修改DPI就是要修改系统里的ro.sf.lcd_density这个变量的值

a) 修改
4418:lollipop_2nd_release\device\nexell\s5p4418_drone\device.mk
找到ro.sf.lcd_density这个变量,修改成你需要的值。一般常用的值120 160 240 320。其他值没有验证,用户可以自行验证。

此次修改10寸屏 值为:160

b)编译
如果用户已经编译过系统了,需要要手动删除
lollipop_2nd_release\out\target\product\s5p4418_drone\system\build.prop

接着编译android,编译完成后烧写system.img。



####################################################################################################### 
2017.9.6

触摸屏设备驱动: 

	#define FT5X0X_NAME	  "ft5x0x_ts_2"

触摸屏设备:
	.type	= "ft5x0x_ts_2",
	
	
触摸屏配置文件:系统会根据设备名字对配置文件逐个访问匹配
总结来看安卓为输入设备打开配置文件依次会访问
/system/usr/idc/Vendor_XXXX_Product_XXXX_Version_XXXX.idc
/system/usr/idc/Vendor_XXXX_Product_XXXX.idc
/system/usr/idc/DEVICE_NAME.idc
/data/system/devices/idc/Vendor_XXXX_Product_XXXX_Version_XXXX.idc
/data/system/devices/idc/Vendor_XXXX_Product_XXXX.idc
/data/system/devices/idc/DEVICE_NAME.idc


但是:
如果在驱动里面定义了触摸类型,系统就不会去查找配置文件:

	__set_bit(INPUT_PROP_DIRECT, input_dev->propbit);
			
参考:韦东山视频Android 输入系统:第10课第22节_输入系统_多点触摸驱动程序_idc配置文件_P




摄像头驱动:
加载入口:V4l2框架
#if defined(CONFIG_V4L2_NXP) || defined(CONFIG_V4L2_NXP_MODULE)
    printk("plat: add device nxp-v4l2\n");
    platform_device_register(&nxp_v4l2_dev);
#endif


光感传感器驱动加载:
芯片类型:ISL29003
通信类型:i2c
地址:0x88>>1


查找所有".h"文件中的含有"helloworld"字符串的文件
find /PATH -name "*.h" | xargs grep -in "helloworld"


find ./ -name "build.gradle" | xargs grep -in "targetSdkVersion"

find ./ -name Kconfig | xargs grep -in "Miscellaneous I2C Chip support"
find ./ -name Kconfig | xargs grep -in "/bca2xx"
find ./ -name Kconfig | xargs grep -in "/misc"

grep -in "CONFIG_ISL29003"
修改配置:
device drivers
	 misc devices
	 	[*]intersil isl29003 ambient  light sensor
	 	
	 	
busybox find -name "lux"

cd /sys/devices/platform/i2c-gpio.1/i2c-1/1-0044/


busybox echo "0" > power_state
busybox echo 3 > range
busybox echo 1 > power_state


busybox i2cget -y -f 1 0x3a 0x02 


busybox i2cget -f -y 1 0x44 0x02 

add vale
00  40
01  00
02  00
03  00



busybox i2cset -y -f 1 0x44 0x00 0xa0 


include\linux\




####################################################################################################### 
2017.9.18

gpio定义文件:
u-boot\boart\s5p4418\drone\include\Cfg_gpio.h 


对比								第四代网关									pro4418
1、充电指示灯						与软件无关									由核心板充电IC(axp228)控制
2、用户指示灯						4路用户指示灯	GPIOC24用于用户按键			LED1:GPIOC24  :CFG_GPIO_LED
									1:GPIOD0  2:GPIOC9 3:GPIOC11 4:GPIOC12 
3、红外								无								   	 		IR:GPIOD0  :CFG_IO_BUTTON_LG
4、耳机耳麦							NAU8822										WM8960	:MCU_AMP_EN :GPIOC4	:CFG_IO_AUDIO_AMP_POWER			
5、4G								U9300										EC20
6、GPS								内置于U9300									GPS模块 RXD3 TXD3 	: GPIOE17 GPIOE10






####################################################################################################### 
2017.9.19

gps源码位置:lollipop_2nd_release\hardware\samsung_slsi\drone

注:http://www.rpdzkj.cn/forum.php?mod=viewthread&tid=106&extra=page%3D4


如何去掉GPS模块,释放串口3
    1、lollipop_2nd_release/device/nexell/s5p4418_drone/BoardConfig.mk
       lollipop_2nd_release/device/nexell/s5p4418_drone/BoardConfig.mk
        # GPS
       BOARD_HAVE_RPDZKJ_GPS :=false   //编译需要改成true
    2、lollipop_2nd_release \out\target\product\s5p4418_drone\system\lib\hw\目录下的gps.slsiap.so库删掉,
      然后重新编译android,如果此目录下没有生成gps.slsiap.so库文件,则证明修改成功

注:http://www.rpdzkj.cn/forum.php?mod=viewthread&tid=42&highlight=gps



查找所有".mk"文件中的含有"helloworld"字符串的文件
find ./ -name "*.mk" | xargs grep -in "sensors.$(TARGET_BOOTLOADER_BOARD_NAME)"


BoardConfig.mk

TARGET_BOARD_PLATFORM            := slsiap
TARGET_BOOTLOADER_BOARD_NAME := s5p4418_drone

TARGET_CPU_ABI  := armeabi-v7a
TARGET_CPU_ABI2 := armeabi
TARGET_CPU_SMP  := true
TARGET_ARCH     := arm
TARGET_ARCH_VARIANT := armv7-a-neon
TARGET_CPU_VARIANT := cortex-a9
ARCH_ARM_HAVE_TLS_REGISTER := true

TARGET_CPU_VARIANT2 := s5p4418

TARGET_NO_BOOTLOADER := false
TARGET_NO_KERNEL         := false
TARGET_BOOTLOADER_IS_2ND := false
TARGET_NO_RADIOIMAGE := false



####################################################################################################### 
2017.9.20

1.kernle/drivers/usb/serial/option.c中加入VID和PID      
{ USB_DEVICE( 0x1c9e, 0x9b3c ) }
2如果拨号上网则配置PPP,make menuconfig后
Device Drivers --->
    -*-Network device support --->
        {*}ppp(point-to-point protocol) support
              ……
        [*]   ppp support for async serial ports
        [*]   ppp support for sync tty ports
              ……
        一般选择以上即可,如果需要更多PPP服务,则PPP相关都选择上。
……

3.配置USB MODEM
Device Drivers --->
    [*]USB support --->
        [*]USB Serial Conerter support --->
            [*]USB Generic Serial Driver
             ……
            [*]USB driver for GSM and CDMA modems
……
    
重新编译内核。设备正常加载后,输入命令“ls /dev/ttyUSB*”后会看到有ttyUSB(0,1,2,-,-)映射出来。


系统应用部分:
1.在init.rc中加入下面服务,下面“-- -d /dev/ttyUSB(1,2,3,,)”部分使用哪个端口根据实际情况,若没有指定端口默认AT端口使用/dev/ttyUSB2,上网使用/dev/ttyUSB1
service ril-daemon /system/bin/rild -l /system/lib/libreference-ril-lslte.so -- -d /dev/ttyUSB2 -m /dev/ttyUSB1
    class main
    socket rild stream 660 root radio
    socket rild-debug stream 660 radio system
    user root
    group radio cache inet misc audio sdcard_rw

service pppd_gprs /system/bin/init.gprs-pppd 
    socket rild-ppp stream 660 root radio
    user root
    group radio cache inet misc
    disabled

on property:net.gprs.enable=1
    start pppd_gprs

on property:net.gprs.enable=0
    stop pppd_gprs



2.库及拨号脚本文件需要放在相应路径下,如下
    cp init.gprs-pppd ../out/target/product/s5p4418_drone/system/bin/
//    cp libreference-ril.so ../out/target/product/s5p4418_drone/system/lib/
    
    cp libreference-ril.so ..\device\nexell\s5p4418_drone\rpdzkj\lib
3.更改init.gprs-pppd内对应拨号用的modem端口号,默认为/dev/ttyUSB1。
4.编译,重新生成镜像。




echo -e "AT+CGREG?\r\n" > /dev/ttyUSB2

echo -e "AT+CGMI=?\r\n" > /dev/ttyUSB2

echo -e "AT+CREG?\r\n" > /dev/ttyUSB2
echo -e "AT+COPS?\r\n" > /dev/ttyUSB2

echo -e "AT+CEREG?\r\n" > /dev/ttyUSB2
service ril-daemon /system/bin/rild -l /system/lib/libreference-ril.so -- -d /dev/ttyUSB2 -m /dev/ttyUSB1

rild -l /system/lib/libreference-ril.so -- -d /dev/ttyUSB2 -m /dev/ttyUSB1
rild -l /system/lib/libui.so
rild -l /sdcard/libreference-ril.so -- -d /dev/ttyUSB2 -m /dev/ttyUSB1
rild -l /sdcard/Download/libreference-ril.so -- -d /dev/ttyUSB2 -m /dev/ttyUSB1

service ril-daemon /system/bin/rild -l /sdcard/Download/libreference-ril.so -- -d /dev/ttyUSB2 -m /dev/ttyUSB1





rild -l /system/lib/libreference-ril.so 

会报错:WARNING: linker: libreference-ril.so has text relocations. This is wasting memory and prevents security hardening. Please fix.

相同文件放在其他位置不会报错
rild -l /sdcard/Download/libreference-ril.so 




echo -e "ATD18037590150;" > /dev/ttyUSB2

echo -e -r -n "AT+CGMI=? <CR>\r" > /dev/ttyUSB2


AT+CGMI=?



busybox route add default gw 10.64.64.64

baidu 
ping 119.75.217.109

ping 10.64.64.64

cat /dev/ttyUSB2


logcat -b radio

logcat ril-daemon:D *:S


rild -l /system/xxx/libreference-ril.so 

busybox route add 10.64.64.64/32 dev ppp0

busybox ifconfig ppp0 10.74.58.1  netmask 255.255.255.0  broadcast 10.64.64.64

busybox route add default gw  10.52.5.201


logcat -b radio -b system -b main -v time 
adb pull /system/xx/log.txt  .


1、在加载U9300的库时候,会有以下提示:
WARNING: linker: libreference-ril.so has text relocations. This is wasting memory and prevents security hardening. Please fix.

2、目前状况:打电话能够拨码成功,能够拨通;4G信号有,ip地址有,但是无法上网,并且ping 不同 10.64.64.64

解答:三星的不认10.64.64.64 ,找原厂更换库。



####################################################################################################### 
2017.9.30

4G网络分享热点,设备连接上后无法上网:
解决:
vi /device/nexell/s5p4418_drone/overlay/frameworks/base/core/res/res/values/config.xml

注释掉
<!--
    <integer-array translatable="false" name="config_tether_upstream_types">
        <item>1</item>
        <item>9</item>
    </integer-array>
-->



####################################################################################################### 
2017.10.11
先找一下ubuntu里有没有背光控制的应用,如果没有就自己写应用来调用,修改这个
/sys/class/backlight/pwm-backlight/brightness



####################################################################################################### 
2017.10.12

原理图分析:

模块		原理图  		核心板引脚  		
蜂鸣器		GPIO3_Beep		GPIO3		
					
LED-G		User_LED1		GPIOD0/PWM3
LED-G		User_LED2		GPIOC9
LED-G		User_LED3		GPIOC12
LED-G		User_LED4		GPIOC11

S2			KEY_MENU		GPIOC7
S3			KEY_HOME		GPIOC29
S4			KEY_VOL+		GPIOB30
S5			KEY_VOL-		GPIOB31
S6			KEY_BACK		GPIOC27
S7			KEY_User1		GPIOC24
S8			KEY_User2		GPIOC5

4G			WAKEUP_IN		GPIOD8	(默认为唤醒状态,保持高电平)
4G			WAKEUP_OUT		GPIOC17
4G			RST_4G			GPIOB8	

ISL29023	Light_INT		GPIOD22

SP7685		Flash_EN		GPIOD25
SP7685		Flash_Mode		GPIOD24

磁力计		MAG_GPIOC30		GPIOC31

振子		VIB_GPIOC27		GPIOC30

三轴		BMA250_INT		GPIOB25


开关机和复位按键:(预留)
NRESETIN_Zig、PWRKEY_Zig对应ZigBee(cc2530) P0.6 和 P0.7;
作用:通过ZigBee进行关机、复位,不能进行远程开机(主板3.3V电源由核心板控制,然后3.3V供电给ZigBee模块)
有效电平:高电平触发

注:当cc2530复位之后,所有的数字输入/输出引脚都设置为通用输入引脚;
在系统工作期间,应保持NRESETIN_Zig、PWRKEY_Zig为低电平。
ZigBee远程关机功能需要持续输出高电平。 


音频:
WM8960GEFL更换为NAU8822,驱动复用WM8978的。
i2c设备地址0x1a(同WM8978完全一致)

注:NAU8822(管脚兼容WM8976,WM8978,ALC5621)



####################################################################################################### 
2017.10.13


4G(U9300):
U9300C 模块休眠和唤醒控制接口
WAKEUP_IN 	H: DTE唤醒U9300C;
			L: DTE让U9300C进入休眠模式。 ( 串口/USB不可用)
WAKEUP_OUT	H: 模块处于唤醒模式,并且串口/USB处于可用状态;
			L: 模块处于睡眠模式,并且串口/USB不可用。
			
AP应用端给的模块 WAKEUP_IN 的控制信号,用于控制模块的休眠唤醒			

警告:RST_4G复位引脚的三极管控制端电阻未接!!!

注:
1、使用中模块上电后应保持模块 WAKEUP_IN 为高电平;	
2、在 AP 端控制模块拉低 WAKEUP_IN 信号后,模块进入休眠模式, 此时如果有
电话/短信等唤醒模块后, AP 端检测到 WAKEUP_OUT 变为高电平时,应把 WAKEUP_IN信号同步拉高。	



ZigBee模块:
1.与核心板串口3(T:GPIOD21 R:GPIOD17)数据通信(R:P0.2   T:P0.3)
2.远程控制设备关机、复位(预留):NRESETIN_Zig、PWRKEY_Zig对应ZigBee(cc2530) P0.6 和 P0.7
3.组网指示灯(P1.0),向节点下发数据指示灯(P1.3)


UART转USB:
芯片:ch340G
用途:FTDI设备通信

引脚:串口1(T:GPIOD19  R:GPIOD15)



stm32最小系统的模块接口详情:
can接口:PA12/CAN_TX 
		 PA11/CAN_RX
----------------------------------------------------
核心板接口:PA10/USART1_RX 		TXD2	GPIOD20	
			PA9 /USART1_TX		RXD2 	GPIOD16	
----------------------------------------------------			
红外接口:	PA8	
----------------------------------------------------
NB-IoT模块接口:PC11/UART4_RX 
				PC10/UART4_TX	
控制引脚:	PC16、PB15、PB14			
----------------------------------------------------
LoRa模块接口:	PD2 /UART5_RX 
				PC12/UART5_TX 
控制引脚:	PA0、PA1、PA5
----------------------------------------------------
RS-485模块接口:PB10/USART3_TX
				PB11/USART3_RX
半双工,读/写使能引脚:	RD_485		
----------------------------------------------------
预留调试串口接口:	PA2/USART2_TX
					PA3/USART2_RX
				

IPV6(ZigBee)模块:
1.与核心板串口4(T:GPIOB28 R:GPIOB29)数据通信(R:P0.2   T:P0.3)
2.组网指示灯(P1.0),向节点下发数据指示灯(P1.3)
 
		 

I2C0复用:	HDMI、	 MIPI Camera、	音频NAU8822
I2C1复用:	Touch、	 light(新增)	
I2C2复用:	BMA250、 磁力计

light光感传感器:ISL29023
i2c:I2C1
中断引脚:	Light_INT 	(GPIOD22)

磁力计:MAG3110
i2c:I2C2
中断引脚:	MAG_GPIOC30	(GPIOC31)

三轴加速度:BMA250
i2c:I2C2
中断引脚:	BMA250_INT	(GPIOB25)

USB To UART:
驱动:兼用ch341
USB引脚:USBDN3_Send	/	USBDP3_Send






####################################################################################################### 
2017.10.16


蜂鸣器、振子开机初始化
GPIO3、GPIOC30

u-boot修改:
lollipop_2nd_release\u-boot\board\s5p4418\drone\include\cfg_gpio.h

修改引脚默认配置。




####################################################################################################### 
2017.10.17

ALIVEGPIO1 ~ ALIVEGPIO5分别在软件中对应PAD_GPIO_ALV + 1~5


OTG功能:
删除主从设备判断(去掉U10芯片),只保留从机模式,规避先插入OTG后无法启动的现象。



####################################################################################################### 
2017.10.18

网关MIPI屏接口接触不良,无法正常显示。


192.168.98.207

192.168.98.248




[  174.164000] usb 1-1.1: USB disconnect, device number 8
[  174.171000] option1 ttyUSB1: GSM modem (1-port) converter now disconnected from ttyUSB1
[  174.180000] option 1-1.1:1.0: device disconnected
[  174.186000] option: option_instat_callback: error -108
[  174.192000] option1 ttyUSB2: GSM modem (1-port) converter now disconnected from ttyUSB2
[  174.201000] option 1-1.1:1.1: device disconnected
[  174.202000] init: untracked pid 1398 exited with status 16
[  174.212000] option: option_instat_callback: error -108
[  174.219000] option1 ttyUSB3: GSM modem (1-port) converter now disconnected from ttyUSB3
[  174.227000] option 1-1.1:1.2: device disconnected
[  174.233000] option: option_instat_callback: error -108
[  174.241000] option1 ttyUSB4: GSM modem (1-port) converter now disconnected from ttyUSB4
[  174.251000] option 1-1.1:1.3: device disconnected
[  174.257000] option: option_instat_callback: error -108
[  174.264000] option1 ttyUSB5: GSM modem (1-port) converter now disconnected from ttyUSB5
[  174.272000] option 1-1.1:1.4: device disconnected
[  174.455000] usb 1-1.1: new high-speed USB device number 9 using nxp-ehci
[  174.553000] usb 1-1.1: New USB device found, idVendor=1c9e, idProduct=9b3c
[  174.560000] usb 1-1.1: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[  174.567000] usb 1-1.1: Product: USB Modem
[  174.572000] usb 1-1.1: Manufacturer: LONGSUNG
[  174.623000] option 1-1.1:1.0: GSM modem (1-port) converter detected
[  174.630000] usb 1-1.1: GSM modem (1-port) converter now attached to ttyUSB1
[  174.638000] option 1-1.1:1.1: GSM modem (1-port) converter detected
[  174.645000] usb 1-1.1: GSM modem (1-port) converter now attached to ttyUSB2
[  174.652000] option 1-1.1:1.2: GSM modem (1-port) converter detected
[  174.660000] usb 1-1.1: GSM modem (1-port) converter now attached to ttyUSB3
[  174.667000] option 1-1.1:1.3: GSM modem (1-port) converter detected
[  174.674000] usb 1-1.1: GSM modem (1-port) converter now attached to ttyUSB4
[  174.682000] option 1-1.1:1.4: GSM modem (1-port) converter detected
[  174.689000] usb 1-1.1: GSM modem (1-port) converter now attached to ttyUSB5


ttyUSB0
ttyUSB1
ttyUSB2
ttyUSB3
ttyUSB4
ttyUSB5



####################################################################################################### 
2017.10.20

USB设备更新信息保存文件
/proc/tty/driver/usbserial

nmea 


google earth 


U9300C 枚举接口
		Vendor ID:0x1C9E Product ID:0x9B3C
Interface 	Number 		Interface Function Interface Name
0 			Debug 		Device Diagnostic Interface
1 			Modem 		Modem Connector
2 			AT 			Device Application Interface
3 			Pipe 		Device Pipe
4 			NDIS 		Wireless Data Device Ethernet Adapter
5 			adb 		Android Composite ADB Interface lc

如是没有其他usb设备,U9300C 枚举的各个USB接口功能如上所示,
若有其他USB设备抢占了USB端口号,U9300C 枚举接口会逐个下移。

加上CH340串口模块,U9300C枚举的端口号后移:
ttyUSB0		//ch341-uart
ttyUSB1		//Debug
ttyUSB2		//Modem
ttyUSB3		//AT
ttyUSB4		//Pipe
ttyUSB5		//NDIS

注:没有断电就进行重启,由于4G模块始终处于供电状态,会造成遭遇CH340枚举USB


驱动修改点:

service ril-daemon /system/bin/rild -l /system/lib/libreference-ril-lslte.so -- -d /dev/ttyUSB2 -m /dev/ttyUSB1
==》
service ril-daemon /system/bin/rild -l /system/lib/libreference-ril-lslte.so -- -d /dev/ttyUSB3 -m /dev/ttyUSB2




xunfang@ubuntu:~/work/lollipop_2nd_release$ find -name "init.rc" | xargs ls -la
-rw-rw-r-- 1 xunfang xunfang  2942 Mar 24  2016 ./bootable/recovery/etc/init.rc
-rwxrw-r-- 1 xunfang xunfang 23076 Sep 22 10:41 ./out/target/product/s5p4418_drone/obj/ETC/init.rc_intermediates/init.rc
-rw-rw-r-- 1 xunfang xunfang  2942 Sep 30 16:26 ./out/target/product/s5p4418_drone/recovery/root/init.rc
-rw-r--r-- 1 xunfang xunfang 23075 Sep 30 16:53 ./out/target/product/s5p4418_drone/root/init.rc
-rw-r--r-- 1 xunfang xunfang 23075 Sep 30 16:53 ./result/root/init.rc
-rwxrw-r-- 1 xunfang xunfang 23076 Sep 20 16:58 ./system/core/rootdir/init.rc



拨打电话无法拨出

打印信息输出到1.log
logcat -b radio -b main -b system -v time  1>1.log

电脑端cmd,adb上传文件
adb pull 1.log .



GPS:
 vi device/nexell/s5p4418_drone/BoardConfig.mk 
 
 编译GPS模块:ture
 BOARD_HAVE_RPDZKJ_GPS :=true
 去掉编译模块:false
 BOARD_HAVE_RPDZKJ_GPS :=false
 
 
 
 
vi hardware/samsung_slsi/drone/librpdkzj-gps/gps_mstar.c
#define MSTAR_DEVICES     "/dev/ttyAMA3"
 
 
 
#define MSTAR_DEVICES     "/dev/ttyUSB4"(失败)

注:ttyUSB4为4G模块PIPE端口

#define MSTAR_DEVICES     "/dev/ttyUSB3"

注:ttyUSB3为4G模块at端口




echo -e "AT+GPSSTART=1 \r\n" > /dev/ttyUSB3
echo -e "At+gpsstart=? \r\n" > /dev/ttyUSB3

cat /dev/ttyUSB3


AT+GPSEND



配置:
echo -e "AT+GPSCONFIG=20,180,9999999,1,2 \r\n" > /dev/ttyUSB3

echo -e "AT+GPSCONFIG=20,180,9999999,1,2,1 \r\n" > /dev/ttyUSB3

echo -e "AT+GPSCONFIG? \r\n" > /dev/ttyUSB3

设置
echo -e "AT+GPSMODE=1 \r\n" > /dev/ttyUSB3

启动
echo -e "AT+GPSSTART=1 \r\n" > /dev/ttyUSB3

停止
echo -e "AT+GPSEND \r\n" > /dev/ttyUSB3



cat /dev/ttyUSB4 1>2.nmea &   

logcat *:S gps_mstar:D -v time



####################################################################################################### 
2017.10.25

4G模块GPS无有效数据输出原因:天线应匹配无源GPS天线


shell脚本编写:
#!/system/bin/sh
while [ ! -c /dev/ttyUSB3 ]; do
    # sleep 1 防止 cpu 占用率过高
    echo  "no"
    sleep 1  
done
    echo  "yes"


内核启动,加载枚举4G模块USB端口,系统需要检查枚举的USB端口,然后发送AT命令配置、启动GPS功能

开机执行脚本,循环检测ttyUSB3、ttyUSB4结点

编写gps.sh文件如下:

#!/system/bin/sh
while [ ! -c /dev/ttyUSB3 ]; do
    # sleep 4 防止 cpu 占用率过高
    echo  "/dev/ttyUSB3 non-existent "
    sleep 4  
done
   echo  "/dev/ttyUSB3 exist "
   
while [ ! -c /dev/ttyUSB4 ]; do
    # sleep 1 防止 cpu 占用率过高
    echo  "/dev/ttyUSB4 non-existent "
    sleep 4  
done
   echo  "/dev/ttyUSB4 exist "

echo -e "AT+GPSCONFIG=20,180,9999999,1,2,1 \r\n" > /dev/ttyUSB3

echo -e "AT+GPSSTART=1 \r\n" > /dev/ttyUSB3

echo  "The GPS have start !!! "




cd  

find ./ -name "*.mk" | xargs grep -in "adj_lowmem.sh"

修改device/nexell/s5p4418_drone/device.mk 
	device/nexell/s5p4418_drone/adj_lowmem.sh:root/adj_lowmem.sh \
	device/nexell/s5p4418_drone/gps.sh:system/gps.sh  
#	device/nexell/s5p4418_drone/bootanimation.zip:system/media/bootanimation.zip


xunfang@ubuntu:~/work/lollipop_2nd_release$ find ./ -name "*.rc" | xargs grep -in "adj_lowmem.sh"
./out/target/product/s5p4418_drone/root/init.s5p4418_drone.rc:268:service adjlowmem /adj_lowmem.sh
./result/root/init.s5p4418_drone.rc:268:service adjlowmem /adj_lowmem.sh
./device/nexell/s5p6818_drone/init.s5p6818_drone.rc:242:service adjlowmem /adj_lowmem.sh
./device/nexell/s5p6818_drone/init.s5p6818_drone64.rc:238:service adjlowmem /adj_lowmem.sh
./device/nexell/lepus/init.lepus.rc:244:service adjlowmem /adj_lowmem.sh
./device/nexell/s5p4418_drone/init.s5p4418_drone.rc:268:service adjlowmem /adj_lowmem.sh


####### eeboard申请GD32

chown root shell /system/gps.sh 
chmod 0777 /system/gps.sh 

service gpsstart /system/gps.sh 
    class main
    user root
    group root
    oneshot
    
    
init: cannot execve('/system/gps.sh'): Permission denied

system/core/include/private/android_filesystem_config.h
    static struct fs_path_config android_files[] = {
        { 00755, AID_ROOT,      AID_SHELL,      0, "system/gps.sh" },
        
        
	disabled
on property:net.gprs.enable=1
    start gpsstart

on property:net.gprs.enable=0
    stop gpsstart  






#!/system/bin/sh
echo  "GPS start  \r\n" >> GPS.log
while [ ! -c /dev/ttyUSB3 ]; do
    # sleep 4 ...... cpu ..........  echo  
    sleep 4
    echo  "/dev/ttyUSB3 non-existent \r\n"  >> GPS.log
done
   echo  "/dev/ttyUSB3 exist " >> GPS.log

while [ ! -c /dev/ttyUSB4 ]; do
    # sleep 1 ...... cpu ..........  echo  
    sleep 4
    echo  "/dev/ttyUSB4 non-existent  \r\n" >> GPS.log
done
   echo  "/dev/ttyUSB4 exist " >> 2.log

echo -e "AT+GPSCONFIG=20,180,9999999,1,2,1 \r\n" > /dev/ttyUSB3
sleep 1
echo -e "AT+GPSCONFIG=20,180,9999999,1,2,1 \r\n" > /dev/ttyUSB3
sleep 1
echo -e "AT+GPSCONFIG=20,180,9999999,1,2,1 \r\n" > /dev/ttyUSB3
sleep 1
echo -e "AT+GPSCONFIG=20,180,9999999,1,2,1 \r\n" > /dev/ttyUSB3
sleep 1
echo -e "AT+GPSCONFIG=20,180,9999999,1,2,1 \r\n" > /dev/ttyUSB3
sleep 1
echo -e "AT+GPSCONFIG=20,180,9999999,1,2,1 \r\n" > /dev/ttyUSB3
sleep 1
echo -e "AT+GPSCONFIG=20,180,9999999,1,2,1 \r\n" > /dev/ttyUSB3
sleep 1


echo -e "AT+GPSSTART=1 \r\n" > /dev/ttyUSB3
sleep 1
echo -e "AT+GPSSTART=1 \r\n" > /dev/ttyUSB3
sleep 1
echo -e "AT+GPSSTART=1 \r\n" > /dev/ttyUSB3
sleep 1
echo -e "AT+GPSSTART=1 \r\n" > /dev/ttyUSB3
sleep 1
echo -e "AT+GPSSTART=1 \r\n" > /dev/ttyUSB3
sleep 1
echo -e "AT+GPSSTART=1 \r\n" > /dev/ttyUSB3
sleep 1
echo -e "AT+GPSSTART=1 \r\n" > /dev/ttyUSB3
sleep 1


echo  "The GPS have start !!! " >> GPS.log





./sys/devices/platform/i2c-gpio.1/i2c-1/1-0044/lux


echo 5 > /sys/devices/platform/i2c-gpio.1/i2c-1/1-0044/mode
sleep 1
echo 5 > /sys/devices/platform/i2c-gpio.1/i2c-1/1-0044/mode
sleep 1
echo 1 > /sys/devices/platform/i2c-gpio.1/i2c-1/1-0044/power_state
sleep 1
echo 1 > /sys/devices/platform/i2c-gpio.1/i2c-1/1-0044/power_state
sleep 1


find ./ -name "*.*" | xargs grep -in "/sys/devices/platform/s3c2440-i2c.5/i2c-5/5-0044/mode"


#!/system/bin/sh
echo 5 > /sys/devices/platform/i2c-gpio.1/i2c-1/1-0044/mode
sleep 1
cat /sys/devices/platform/i2c-gpio.1/i2c-1/1-0044/mode  >> GPS.log
sleep 1
echo 1 > /sys/devices/platform/i2c-gpio.1/i2c-1/1-0044/power_state
sleep 1
cat /sys/devices/platform/i2c-gpio.1/i2c-1/1-0044/power_state  >> GPS.log
sleep 1


####################################################################################################### 
2017.10.27


isl29023 光敏传感器:

1.加载完驱动后,无法获取lux值
cat /sys/devices/platform/i2c-gpio.1/i2c-1/1-0044/lux

原因:未使能
power_state:
	0: device is disabled (default)
	1: device is enabled
	
2、加载完驱动后,获取lux值 不变
cat /sys/devices/platform/i2c-gpio.1/i2c-1/1-0044/lux

原因:未使能
mode:
ISL29023_PD_MODE	0x0
ISL29023_ALS_ONCE_MODE	0x1
ISL29023_IR_ONCE_MODE	0x2
ISL29023_ALS_CONT_MODE	0x5
ISL29023_IR_CONT_MODE	0x6

解决方法:
添加脚本,并且分开写(两个文件操作,只有后者有效)
power_state.sh

#!/system/bin/sh
echo 1 > /sys/devices/platform/i2c-gpio.1/i2c-1/1-0044/power_state

mode.sh

#!/system/bin/sh
echo 5 > /sys/devices/platform/i2c-gpio.1/i2c-1/1-0044/mode


在gps.sh中添加启动
/system/mode.sh
/system/power_state.sh


修改权限:
chmod 777 /system/mode.sh
chmod 777 /system/power_state.sh

测试:
cat /sys/devices/platform/i2c-gpio.1/i2c-1/1-0044/lux


####################################################################################################### 
2017.10.30
find ./ -name "*sensor*" | xargs grep -in "Accelerometer" 1 > sensor.log &

获取输入设备:
getevent -i 


add device 3: /dev/input/event0
  bus:      0018
  vendor    0000
  product   0000
  version   0000
  name:     "isl29023 light sensor"
  location: "1-0044"
  id:       ""
  version:  1.0.1
  events:
    ABS (0003): 0028  : value 0, min 0, max 11405, fuzz 0, flat 0, resolution 0
  input props:
    <none>
add device 4: /dev/input/event4
  bus:      0018
  vendor    0000
  product   0000
  version   0000
  name:     "bma2x2"
  location: ""
  id:       ""
  version:  1.0.1
  events:
    REL (0002): 0001  0002  0006  0007  0008  0009 
    ABS (0003): 0000  : value 30, min -512, max 512, fuzz 0, flat 0, resolution 0
                0001  : value 0, min -512, max 512, fuzz 0, flat 0, resolution 0
                0002  : value -290, min -512, max 512, fuzz 0, flat 0, resolution 0
                0018  : value 0, min 0, max 0, fuzz 0, flat 0, resolution 0
                0019  : value 0, min 0, max 0, fuzz 0, flat 0, resolution 0
  input props:
    <none>
    
    
    
    logcat *:S sensor:D -v time
    
find ./lollipop_2nd_release -name "*.cpp" | xargs grep -in "bma2x2" 1 > bma1.log &
find ./lollipop_2nd_release -name "*.c" | xargs grep -in "bma2x2" 1 > bma2.log &
find ./lollipop_2nd_release -name "*.java" | xargs grep -in "bma2x2" 1 > bma3.log &
find ./lollipop_2nd_release -name "*.mk" | xargs grep -in "bma2x2" 1 > bma4.log &

find ./lollipop_2nd_release -name "*.cpp" | xargs grep -in "open_sensors" 1 > open.log &



ro.hardware.sensors

sensors.s5p4418_drone.so



find ./lollipop_2nd_release -name "*.mk" | xargs grep -in "sensors"  | xargs grep -in "s5p4418_drone" 1 > s5p4418_drone.log &


grep -rn "8960" * 1 > 8960.log &
####################################################################################################### 
2017.10.31
音频:
WM8960GEFL更换为NAU8822,驱动复用WM8978的。
i2c设备地址0x1a(同WM8978完全一致)

注:NAU8822(管脚兼容WM8976,WM8978,ALC5621)


#if defined(CONFIG_SND_CODEC_WM8976) || defined(CONFIG_SND_CODEC_WM8976_MODULE)
#include <linux/i2c.h>

#define	WM8976_I2C_BUS		(0)

/* CODEC */
static struct i2c_board_info __initdata wm8976_i2c_bdi = {
	.type	= "wm8978",			// compatilbe with wm8976
	.addr	= (0x34>>1),		// 0x1A (7BIT), 0x34(8BIT)
};

/* DAI */
struct nxp_snd_dai_plat_data i2s_dai_data = {
	.i2s_ch	= 0,
	.sample_rate	= 48000,
	.hp_jack 		= {
		.support    	= 1,
		.detect_io		= PAD_GPIO_E + 8,
		.detect_level	= 1,
	},
};

static struct platform_device wm8976_dai = {
	.name			= "wm8976-audio",
	.id				= 0,
	.dev			= {
		.platform_data	= &i2s_dai_data,
	}
};
#endif


CONFIG_SND_CODEC_WM8976_MODULE
	tristate "Build WM8978 CODEC drivers"
	default n 
	help
          driver support wm8978
          
i2cget   
i2cdetect -l
i2cdump -y 0 0x1a     



旧版:
static struct i2c_board_info i2c_devs4_wm8978[] __initdata = {
	 {
	 		I2C_BOARD_INFO("wm8978", 0x1a),
	 },
};
 
 	s3c_i2c4_set_platdata(NULL);
	i2c_register_board_info(4, i2c_devs4_wm8978, ARRAY_SIZE(i2c_devs4_wm8978));



static struct platform_device samsung_audio = {
	.name   = "SOC-AUDIO-SAMSUNG",
	.id     = -1,
};
static struct platform_device *smdk4x12_devices[] __initdata = {
	&samsung_audio,	
}	
	platform_add_devices(smdk4x12_devices, ARRAY_SIZE(smdk4x12_devices));

新版:
#include <linux/i2c.h>
#define	WM8976_I2C_BUS		(0)
/* CODEC */
static struct i2c_board_info __initdata wm8976_i2c_bdi = {
	.type	= "wm8960",			// compatilbe with wm8976
	.addr	= (0x34>>1),		// 0x1A (7BIT), 0x34(8BIT)
};
struct nxp_snd_dai_plat_data i2s_dai_data = {
	.i2s_ch	= 0,
	.sample_rate	= 48000,
	.pcm_format = SNDRV_PCM_FMTBIT_S16_LE,
	.hp_jack 		= {
		.support    	= 1,
		.detect_io	= PAD_GPIO_B + 27,
		.detect_level	= 1,
	},
};
static struct platform_device wm8976_dai = {
	.name			= "wm8976-audio",
	.id				= 0,
	.dev			= {
		.platform_data	= &i2s_dai_data,
	}
};

	i2c_register_board_info(WM8976_I2C_BUS, &wm8976_i2c_bdi, 1);
	platform_device_register(&wm8976_dai);
	
	
	
	
####################################################################################################### 
2017.10.31	
	
1、修改配置
2、硬件连接  CSB/GPIO1 ----------- GPIOC4
3、修改注册i2c i2s

相关源码:
kernel\sound\soc\nexell\nxp-wm8978.c
kernel\sound\soc\codecs\wm8978.c

kernel\arch\arm\plat-s5p4418\drone\device.c

####################################################################################################### 
2017.11.9
	
1、添加mag3110.c驱动文件
2、在kernel\arch\arm\plat-s5p4418\drone\device.c中注册I2C设备
3、修改\kernel\drivers\hwmon\Makefile 修改\kernel\drivers\hwmon\Kconfig
4、make ARCH=arm menuconfig 配置加载mag3110驱动,并配置加载input-polldev (CONFIG_INPUT_POLLDEV)

#if defined(CONFIG_SENSORS_MAG3110)
#define	MAG3110_I2C_BUS		(2)
/* CODEC */
static struct i2c_board_info __initdata mag3110_i2c_bdi = {
	.type	= "mag3110",
	.addr	= 0x0E,
	.irq	= PB_PIO_IRQ(CFG_IO_MAG3110_INT),
};
#endif

#if defined(CONFIG_SENSORS_MAG3110)
		//TP_I2C_BUS  I2C共用
		printk("plat: add light(mag3110) device\n");
		i2c_register_board_info(MAG3110_I2C_BUS, &mag3110_i2c_bdi, 1);	
#endif

####################################################################################################### 
2017.11.10

getevent -i 
cat /proc/bus/input/devices


logcat -s Sensors  


D/Sensors (  399): the sSensorList[0] is isl29023 light sensor 
D/Sensors (  399): the mSensors[light] is 0 
D/Sensors (  399): LightSensor::LightSensor()
D/Sensors (  399): the sSensorList[1] is BMA255 3-axis Accelerometer 
D/Sensors (  399): the mSensors[accel] is 0 
D/Sensors (  399): AccelerationSensor::AccelerationSensor()
D/Sensors (  399): AccelerationSensor::input_sysfs_path : /sys/class/input/event5/device/
D/Sensors (  399): LightSensor::~enable(0, 0)
D/Sensors (  399): AccelerationSensor::~enable(0, 0)
D/Sensors (  399): AccelerationSensor::~enable(0, 1)
D/Sensors (  399): AccelerationSensor::~setDelay(0, 66667000)
D/Sensors (  399): LightSensor::~enable(0, 1)
D/Sensors (  399): LightSensor::~enable(0, 1)




cat /sys/devices/platform/i2c-gpio.1/i2c-1/1-0044/mode 


####################################################################################################### 
2017.11.14


光传感器移植总结:
1、https://community.nxp.com/thread/384502
数据为上报:
驱动中模式加载应该为中单、并且需要启动线程:schedule_work(&data->work);
在线程中循环上报
2、待解决问题:不会进入中断




####################################################################################################### 
2017.11.17



wm8978数据手册:
引脚功能:
LIP:同相放大连接端
LIN:反相接线端
L2 :同连接端


####################################################################################################### 
2018.01.27

home按键无法上报

你在device目录中keypad_s5p4418_drone.kl中添加这个按键事件
key 172   HOMEPAGE          WAKE

记得删除out目录中的keypad_s5p4418_drone.kl




振子:
echo 4000 > /sys/devices/virtual/misc/xf_vibrator/vibrator_time
logcat *:S vibrator:D -v time

logcat *:S VibratorService:D

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
内容简介   《Android开发入门与实战》内容上涵盖了用Android开发的大部分场景,从Android基础介绍、环境搭建、SDK介绍、Market使用,到应用剖析、组件介绍、实例演示等方面。从技术实现上,讲解了5个Android平台下的完整综合实例及源代码分析,分别是RSS阅读器、基于Google Map的个人GPS、豆瓣网(Web 2.0)客户端、在线音乐播放器、手机信息查看助手。《Android开发入门与实战》注重对实际动手能力的指导,在遵循技术研发知识体系的严密性同时,在容易产生错误、不易理解的环节配以了翔实的开发情景截图,并将重要的知识点和开发技巧以“小实验”、“小提醒”、“小知识”、“注意”等的活泼形式呈现给读者。在程序实例的讲解方面,主要将实例安插在Android开发的精髓知识章节,这为初学者学习与实践结合提供了很好的指导。《Android开发入门与实战》配套有400多分钟的全程开发视频光盘,指导读者快速、无障碍地学通Android实战开发技术。《Android开发入门与实战》适合具备一定软件开发经验,想快速进入Android开发领域的程序员;具备一些手机开发经验的开发者和Android开发爱好者学习用书;也适合作为相关培训学校的Android培训教材。 目录 第1章 掀起你的盖头来——初识Android 1.1 认识Android 1.2 Android的背景 1.2.1 Android的历史 1.2.2 Android的发展 1.3 我的Android我做主 1.3.1 开发基于Android平台的应用 1.3.2 参加Android开发者大赛 1.3.3 个人英雄主义再现——得到更多人的认可和尊重 1.3.4 获得应有的收益——AndroidMarket 1.4 真实体验——Android模拟器 1.4.1 模拟器概述 1.4.2 模拟器和真机的区别 1.4.3 模拟器使用注意事项 1.5 更上一层楼——加入Android开发社区 1.6 本章小结 第2章 工欲善其事 必先利其器——搭建Android开发环境 2.1 开发Android应用前的准备 2.1.1 Android开发系统要求 2.1.2 Android软件开发包 2.1.3 其他注意事项 2.2 Windows开发环境搭建 2.2.1 JDK、Eclipse、AndroidSDK软件安装 2.2.2 SDK的家在哪里——设定AndroidSDKHome 2.2.3 真的准备好了吗——开发环境验证 2.2.4 创建Android虚拟设备(AVD) 2.3 Linux一族——Ubuntu开发环境搭建 2.3.1 Java、Eclipse和ADT插件安装 2.3.2 设定AndroidSDKHome 2.4 MacOS一族——苹果开发环境搭建 2.5 本章小结 第3章 清点可用资本——AndroidSDK介绍 3.1 AndroidSDK基础 3.2 深入探寻AndroidSDK的密码 3.2.1 AndroidSDK目录结构 3.2.2 android.jar及内部结构 3.2.3 SDK文档及阅读技巧 3.2.4 先来热热身——AndroidSDK例子解析 3.2.5 SDK提供的工具介绍 3.3 Android典型包分析 3.3.1 开发的基石——AndroidAPI核心开发包介绍 3.3.2 拓展开发外延——Android可选API介绍 3.4 本章小结 第4章 赚钱的市场——AndroidMarket及应用发布 4.1 GoogleMarket产生背景与目的 4.2 体验“选货”的乐趣——在G1上体验Market的使用 4.3 Android开发活动及特色应用 4.3.1 开发应用的领域 4.3.2 AndroidMarket特色应用一览 4.4 你也可以做东家——申请Market账号 4.4.1 卖东西要先入伙——准备工作 4.4.2 入伙过程——申请 4.5 开张了——在Market上发布应用 4.5.1 发布时可能遇到的错误 4.5.2 卖东西也要签名——生成签名文件 4.5.3 打包、签名、发布应用 4.6 本章小结 第5章 千里之行始于足下——第一个应用HelloWorld 5.1 HelloWorld应用分析 5.1.1 新建一个Android工程 5.1.2 填写工程的信息 5.1.3 编程实现 5.1.4 运行项目 5.2 调试项目 5.2.1 设置断点 5.2.2 Debug项目 5.2.3 断点调试 5.3 本章小结 第6章 磨刀不误砍柴工——Android应用程序结构介绍 6.1 Android体系结构介绍 6.1.1 应用程序(Application) 6.1.2 应用程序框架(ApplicationFramework) 6.1.3 库(Libraries)和运行环境(RunTime) 6.2 Android应用程序组成 6.2.1 Activity介绍 6.2.2 BroadcastIntentReceiver介绍 6.2.3 Service介绍 6.2.4 ContentProvider介绍 6.3 Android应用工程文件组成 6.4 本章小结 第7章 良好的学习开端——Android基本组件介绍 7.1 第一印象很重要——界面UI元素介绍 7.1.1 视图组件(View) 7.1.2 视图容器组件(Viewgroup) 7.1.3 布局组件(Layout) 7.1.4 布局参数(LayoutParams) 7.2 我的美丽我做主——Android中应用界面布局 7.2.1 实例操作演示 7.2.2 实例编程实现 7.3 不积跬步无以至千里——常用widget组件介绍 7.3.1 创建widget组件实例 7.3.2 按钮(Button)介绍与应用 7.3.3 文本框(TextView)介绍与应用 7.3.4 编辑框(EditText)介绍与应用 7.3.5 多项选择(CheckBox)介绍与应用 7.3.6 单项选择(RadioGroup)介绍与应用 7.3.7 下拉列表(Spinner)介绍与应用 7.3.8 自动完成文本(AutoCompleteTextView) 7.3.9 日期选择器(DatePicker)介绍与应用 7.3.10 时间选择器(TimePicker)介绍与应用 7.3.11 滚动视图(ScrollView)介绍与应用 7.3.12 进度条(ProgressBar)介绍与应用 7.3.13 拖动条(SeekBar)介绍与应用 7.3.14 评分组件(RatingBar)介绍与应用 7.3.15 图片视图(ImageView)介绍与应用 7.3.16 图片按钮(ImageButton)介绍与应用 7.3.17 切换图片(ImageSwitcher&Gallery) 7.3.18 网格视图(GridView)介绍与应用 7.3.19 标签(Tab)介绍与应用 7.4 友好的菜单——menu介绍与实例 7.4.1 实例操作演示 7.4.2 实例编程实现 7.5 Android应用的灵魂——Intent和Activity介绍与实例 7.5.1 实例操作演示 7.5.2 实例编程实现 7.6 用好列表,做好程序——列表(ListView)介绍与实例 7.6.1 实例程序演示 7.6.2 实例编程实现 7.7 友好地互动交流——对话框(Dialog)介绍与实例 7.8 温馨的提醒——Toast和Notification应用 7.8.1 实例操作演示 7.8.2 实例编程实现 7.9 本章小结 第8章 移动信息仓库——Android的数据存储操作 8.1 Android数据存储概述 8.2 轻轻地我保护——SharedPreferences存储 8.3 谁的文件,谁主宰——文件存储 8.4 打造自己的数据库存储——SQLite存储方式 8.4.1 Android中对数据库操作 8.4.2 完整地操作数据库——日记本实例 8.5 我的数据你来用——ContentProvider介绍 8.5.1 初识ContentProvider 8.5.2 使用ContentProvider读取系统数据 8.5.3 使用ContentProvider操作数据日记本实例 8.6 再学一招——网络存储 8.7 本章小结 第9章 我来“广播”你的“意图”——Intent和Broadcast面对面 9.1 Android应用程序的核心——Intent 9.1.1 Intent基础 9.1.2 用Intent启动一个新的Activity 9.1.3 Intent详细讲解 9.1.4 Android解析Intent实现 9.2 用广播告诉你——利用Intent来广播(BroadCast)事件 9.2.1 实现Android中的广播事件 9.2.2 BroadCastReceiver介绍 9.3 应用实例详解 9.3.1 程序操作演示 9.3.2 实例编程实现 9.4 本章小结 第10章 一切为用户服务——Service应用实例 10.1 认识Service 10.2 使用Service 10.3 Service的生命周期 10.4 实例学习Service 10.4.1 精彩实例一——定时提醒 10.4.2 精彩实例二——音乐播放器 10.5 本章小结 第11章 循序渐进——开发Android应用的基本步骤 11.1 兵马未动粮草先行——应用规划及架构设计 11.2 应用开发步骤 11.2.1 界面设计始终是第一位——实现UI 11.2.2 必备的动力源泉——数据操作和存储 11.2.3 华丽转身——实现多页面跳转 11.2.4 始终为用户做好服务——增加Service 11.2.5 细节决定成败——完善应用细节 11.3 成功就在眼前——应用测试和发布 11.3.1只欠东风——应用测试 11.3.2 可以赚钱了——发布到AndroidMarket 11.4 本章小结 第12章 Android综合案例一——RSS阅读器实例 12.1 RSS介绍 12.1.1 RSS基础 12.1.2 RSS的历史 12.1.3 RSS语法介绍 12.2 SAX介绍 12.2.1 SAX基础 12.2.2 使用SAX的作用 12.2.3 怎样使用SAX 12.3 RSS阅读器设计 12.3.1 RSS阅读器功能设计 12.3.2 RSS阅读器UI和交互流程设计 12.4 RSS阅读器的实现 12.4.1 程序实体解析 12.4.2 实现一个自己的ContentHandler 12.4.3 Activity的实现 12.5 本章小结 第13章 Android综合案例二——基于GoogleMap开发个人移动地图 13.1 项目UI规划 13.2 数据存储实现 13.2.1 设计数据库及表结构 13.2.2 设计SharePreference存储 13.3 项目实现流程 13.3.1 创建项目工程 13.3.2 项目各功能及界面实现 13.3.3 实现数据存取 13.3.4 实现Service 13.3.5 应用流程整体实现 13.3.6 后续开发完善 13.4 项目程序演示 13.5 项目程序签名、打包和发布 13.6 本章小结 第14章 Android综合案例三——基于Android的豆瓣网(Web2.0)移动客户端开发 14.1 关于豆瓣网和豆瓣网API 14.1.1 豆瓣网介绍 14.1.2 豆瓣网API介绍 14.1.3 豆瓣网API认证 14.1.4 豆瓣网API快速入门 14.1.5 豆瓣网APIJava库介绍 14.2 豆瓣网(Web2.0)客户端设计 14.2.1 客户端功能规划设计 14.2.2 UI和交互流程设计 14.2.3 数据存储设计 14.3 豆瓣网(Web2.0)客户端实现 14.3.1 申请APIKey 14.3.2 Activity实现 14.4 本章小结 第15章 Android综合案例四——在线音乐播放器 15.1 关于YOBO和YOBOAPI 15.1.1 YOBO简介 15.1.2 YOBO功能特点 15.1.3 YOBOAPI介绍 15.2 在线播放器架构设计 15.2.1 在线播放器功能规划设计 15.2.2 在线播放器UI设计 15.2.3 在线播放器数据存储设计 15.3 在线播放器的编程实现 15.3.1 申请APIKey 15.3.2 基础功能实现 15.3.3 实现Activity 15.3.4 实现Service 15.3.5 后续开发展望 15.4 在线音乐播放器应用演示 15.5 在线音乐播放器应用打包、签名和发布 15.6 本章小结 第16章 Android综合案例五——手机信息查看助手 16.1 手机信息查看助手功能规划和可行性分析 16.1.1 手机信息查看助手功能规划 16.1.2 手机信息查看助手可行性分析 16.2 手机信息查看助手功能实现 16.2.1 手机信息查看助手主界面 16.2.2 查看系统信息实现 16.2.3 查看硬件信息 16.2.4 查看软件信息 16.2.5 获取运行时信息 16.2.6 文件浏览器 16.2.7 项目的细节完善 16.3 手机信息查看助手功能展望 16.4 项目的打包、签名和发布 16.5 本章小结 第17章 芝麻开门——Android底层开发和移植概述 17.1 Android原始码下载 17.2 实机测试 17.2.1 NeoFreeRunner介绍 17.2.2 烧录androidfs.jffs2 17.3 Android移植技术概论 17.3.1 Android底层技术的重要性 17.3.2 Android移植项目介绍 17.3.3 Android的技术优点 ·收起全部<< 前言   随着3G的到来,无线带宽越来越高,使得更多内容丰富的应用程序布置在手机上成为可能,如视频通话、视频点播、移动互联网冲浪、在线看书/听歌、内容分享等。为了承载这些数据应用及快速部署,手机功能将会越来越智能,越来越开放,为了实现这些需求,必须有一个好的开发平台来支持,在此由Google公司发起的OHA联盟走在了业界的前列,2007年11月推出了开放的Android平台,任何公司及个人都可以免费获取到源代码及开发SDK。由于其开放性和优异性,Android平台得到了业界广泛的支持,其中包括各大手机厂商和著名的移动运营商等。继2008年9月第一款基于Android平台的手机G1发布之后,预计三星、摩托罗拉、索爱、LG、华为等公司都将推出自Gflg~Android平台的手机,中国移动也将联合各手机厂商共同推出基于Android平台的OPhone。按目前的发展态势,我们有理由相信,Android平台能够在短时间内跻身智能手机开发平台的前列。   由于Android平台被推出的时间才一年左右,了解Android平台软件开发技术的程序员还不多,如何迅速地推广和普及Android平台软件开发技术,让越来越多的人参与到Android应用的开发中,是整个产业链都在关注的一个话题。本书作者较早就从事Android的研究与开发工作,为了帮助开发者更快地进入Android开发行列,他们不辞辛劳地编写了Android开发教程-《Google Android开发入门与实战》。本书系统讲解了Android软件开发的基础知识,图文并茂地帮助读者学习和掌握SDK、开发流程以及常用的API等。书中以讲述实战实例为导向,用一个个典型应用生动地引领读者进行项目开发实践。作为一本既及时、又翔实、理论实践相结合的教程,《Google Android开发入门与实战》一书很值得入门者阅读。   值得一提的是,书中的开发实例很有创意,将传统互联网的内容/服务与移动平台紧密结合起来,如书中的豆瓣网客户端、在线音乐播放器等应用,都体现了移动互联网应用所需的创新精神及良好的用户体验理念,这个设计思路很值得大家去思考和学习。   最后,祝广大开发者的技术日益精进,早日开始Android开发之旅,赶上移动互联网的第一班车,共赢中国3G未来!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值