東川印記

一本東川,笑看爭龍斗虎;寰茫兦者,度橫佰昧人生。

android源码编译之06XXXServicesFramework编写之可行性试验02编写Linux内核驱动程序

2015年4月10日星期五



1,Android源码中添加C可执行程序测试自定义linux内核驱动程序
①创建相关文件
  1. senrsl@senrsl-ubuntu:~$ cd android/source/WORKING_DIRECTORY/
  2. senrsl@senrsl-ubuntu:~/android/source/WORKING_DIRECTORY$ cd external/
  3. senrsl@senrsl-ubuntu:~/android/source/WORKING_DIRECTORY/external$ mkdir senrsl
  4. senrsl@senrsl-ubuntu:~/android/source/WORKING_DIRECTORY/external$ touch senrsl.csenrsl@senrsl-ubuntu:~/android/source/WORKING_DIRECTORY/external$ cd senrsl
  5. senrsl@senrsl-ubuntu:~/android/source/WORKING_DIRECTORY/external/senrsl$ touch senrsl.c
  6. senrsl@senrsl-ubuntu:~/android/source/WORKING_DIRECTORY/external/senrsl$ gedit senrsl.c
  7. senrsl@senrsl-ubuntu:~/android/source/WORKING_DIRECTORY/external/senrsl$ touch Android.mk
  8. senrsl@senrsl-ubuntu:~/android/source/WORKING_DIRECTORY/external/senrsl$ gedit Android.mk
  9. senrsl@senrsl-ubuntu:~/android/source/WORKING_DIRECTORY/external/senrsl$
1)文件senrsl.c
  1. /**
  2. *
  3. *这个程序的作用中,打开/dev/senrsl文件,然后先读出/dev/senrsl文件中的值,接着写入值 5到/dev/senrsl中去,最后再次读出/dev/senrsl文件中的值,看看是否是我们刚才写入的值5。从/dev /senrsl文件读写的值实际上就是我们虚拟的硬件的寄存器val的值。
  4. */
  5. #include <stdio.h>
  6. #include <stdlib.h>
  7. #include <fcntl.h>
  8. #define DEVICE_NAME "/dev/senrsl"
  9. int main(int argc, char** argv)
  10. {
  11.     int fd = -1;
  12.     int val = 0;
  13.     fd = open(DEVICE_NAME, O_RDWR);
  14.     if(fd == -1) {
  15.         printf("Failed to open device %s.\n", DEVICE_NAME);
  16.         return -1;
  17.     }
  18.    
  19.     printf("Read original value shi:\n");
  20.     read(fd, &val, sizeof(val));
  21.     printf("%d.\n\n", val);
  22.     val = 5;
  23.     printf("Write value %d to %s.\n\n", val, DEVICE_NAME);
  24.         write(fd, &val, sizeof(val));
  25.    
  26.     printf("Read the value again shi:\n");
  27.         read(fd, &val, sizeof(val));
  28.         printf("%d.\n\n", val);
  29.     close(fd);
  30.     return 0;
  31. }

2)编译脚本Android.mk
  1.  LOCAL_PATH := $(call my-dir)
  2. include $(CLEAR_VARS)
  3. LOCAL_MODULE_TAGS := optional
  4. LOCAL_MODULE := senrsl
  5. LOCAL_SRC_FILES := $(call all-subdir-c-files)
  6. #BUILD_EXECUTABLE表示我们要编译的是可执行程序。
  7. include $(BUILD_EXECUTABLE)
②编译模块
  1. senrsl@senrsl-ubuntu:~/android/source/WORKING_DIRECTORY$ mmm ./external/senrsl/
  2. ============================================
  3. PLATFORM_VERSION_CODENAME=REL
  4. PLATFORM_VERSION=4.4.2
  5. TARGET_PRODUCT=aosp_arm
  6. TARGET_BUILD_VARIANT=eng
  7. TARGET_BUILD_TYPE=release
  8. TARGET_BUILD_APPS=
  9. TARGET_ARCH=arm
  10. TARGET_ARCH_VARIANT=armv7-a
  11. TARGET_CPU_VARIANT=generic
  12. HOST_ARCH=x86
  13. HOST_OS=linux
  14. HOST_OS_EXTRA=Linux-3.13.0-37-generic-x86_64-with-Ubuntu-14.04-trusty
  15. HOST_BUILD_TYPE=release
  16. BUILD_ID=KVT49L
  17. OUT_DIR=out
  18. ============================================
  19. make:进入目录'/home/senrsl/android/source /WORKING_DIRECTORY'
  20. Import includes file: out/target/product/generic/obj/EXECUTABLES/senrsl_intermediates/import_includes
  21. target thumb C: senrsl <= external/senrsl/senrsl.c
  22. target Executable: senrsl (out/target/product/generic/obj/EXECUTABLES/senrsl_intermediates/LINKED/senrsl)
  23. target Symbolic: senrsl (out/target/product/generic/symbols/system/bin/senrsl)
  24. Export includes file: external/senrsl/Android.mk -- out/target/product/generic/obj/EXECUTABLES/senrsl_intermediates/export_includes
  25. target Strip: senrsl (out/target/product/generic/obj/EXECUTABLES/senrsl_intermediates/senrsl)
  26. Install: out/target/product/generic/system/bin/senrsl
  27. make:离开目录"/home/senrsl/android/source /WORKING_DIRECTORY"
③重新打包system.img
  1. senrsl@senrsl-ubuntu:~/android/source/WORKING_DIRECTORY$ make snod
  2. ============================================
  3. PLATFORM_VERSION_CODENAME=REL
  4. PLATFORM_VERSION=4.4.2
  5. TARGET_PRODUCT=aosp_arm
  6. TARGET_BUILD_VARIANT=eng
  7. TARGET_BUILD_TYPE=release
  8. TARGET_BUILD_APPS=
  9. TARGET_ARCH=arm
  10. TARGET_ARCH_VARIANT=armv7-a
  11. TARGET_CPU_VARIANT=generic
  12. HOST_ARCH=x86
  13. HOST_OS=linux
  14. HOST_OS_EXTRA=Linux-3.13.0-37-generic-x86_64-with-Ubuntu-14.04-trusty
  15. HOST_BUILD_TYPE=release
  16. BUILD_ID=KVT49L
  17. OUT_DIR=out
  18. ============================================
  19. build/core/Makefile:860: Warning: with dexpreopt enabled, you may need a full rebuild.
  20. make snod: ignoring dependencies
  21. Target system fs image: out/target/product/generic/system.img
  22. Running:  mkuserimg.sh out/target/product/generic/system out/target/product/generic/system.img ext4 system 576716800 out/target/product/generic/root/file_contexts
  23. + echo 'in mkuserimg.sh PATH=out/host/linux-x86/bin/:/home/senrsl/java/jdk1.6.0_45/bin:/home/senrsl/android/source/WORKING_DIRECTORY/out/host/linux-x86/bin:/home/senrsl/android/source/WORKING_DIRECTORY/prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.7/bin:/home/senrsl/android/source/WORKING_DIRECTORY/prebuilts/gcc/linux-x86/arm/arm-eabi-4.7/bin:/home/senrsl/android/source/WORKING_DIRECTORY/prebuilts/gcc/linux-x86/mips/mipsel-linux-android-4.7/bin:/home/senrsl/android/source/WORKING_DIRECTORY/development/emulator/qtools:/home/senrsl/android/source/WORKING_DIRECTORY/prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.7/bin:/home/senrsl/android/source/WORKING_DIRECTORY/prebuilts/gcc/linux-x86/arm/arm-eabi-4.7/bin:/home/senrsl/android/source/WORKING_DIRECTORY/development/scripts:/home/senrsl/android/source/WORKING_DIRECTORY/prebuilts/devtools/tools:/home/senrsl/test/depot_tools:/home/senrsl/android/android-ndk-r10b:/home/senrsl/android/adt-bundle-linux-x86_64-20140702/sdk/tools:/home/senrsl/android/adt-bundl e-linux-x86_64-20140702/sdk/platform-tools:/home/senrsl/java/jdk1.6.0_45/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games'
  24. in mkuserimg.sh PATH=out/host/linux-x86/bin/:/home/senrsl/java/jdk1.6.0_45/bin:/home/senrsl/android/source/WORKING_DIRECTORY/out/host/linux-x86/bin:/home/senrsl/android/source/WORKING_DIRECTORY/prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.7/bin:/home/senrsl/android/source/WORKING_DIRECTORY/prebuilts/gcc/linux-x86/arm/arm-eabi-4.7/bin:/home/senrsl/android/source/WORKING_DIRECTORY/prebuilts/gcc/linux-x86/mips/mipsel-linux-android-4.7/bin:/home/senrsl/android/source/WORKING_DIRECTORY/development/emulator/qtools:/home/senrsl/android/source/WORKING_DIRECTORY/prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.7/bin:/home/senrsl/android/source/WORKING_DIRECTORY/prebuilts/gcc/linux-x86/arm/arm-eabi-4.7/bin:/home/senrsl/android/source/WORKING_DIRECTORY/development/scripts:/home/senrsl/android/source/WORKING_DIRECTORY/prebuilts/devtools/tools:/home/senrsl/test/depot_tools:/home/senrsl/android/android-ndk-r10b:/home/senrsl/android/adt-bundle-linux-x86_64-20140702/sdk/tools:/home/senrsl/android/adt-bundl e-linux-x86_64-20140702/sdk/platform-tools:/home/senrsl/java/jdk1.6.0_45/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
  25. + ENABLE_SPARSE_IMAGE=
  26. + '[' out/target/product/generic/system = -s ']'
  27. + '[' 6 -ne 5 -a 6 -ne 6 ']'
  28. + SRC_DIR=out/target/product/generic/system
  29. + '[' '!' -d out/target/product/generic/system ']'
  30. + OUTPUT_FILE=out/target/product/generic/system.img
  31. + EXT_VARIANT=ext4
  32. + MOUNT_POINT=system
  33. + SIZE=576716800
  34. + FC=out/target/product/generic/root/file_contexts
  35. + case $EXT_VARIANT in
  36. + '[' -z system ']'
  37. + '[' -z 576716800 ']'
  38. + '[' -n out/target/product/generic/root/file_contexts ']'
  39. + FCOPT='-S out/target/product/generic/root/file_contexts'
  40. + MAKE_EXT4FS_CMD='make_ext4fs  -S out/target/product/generic/root/file_contexts -l 576716800 -a system out/target/product/generic/system.img out/target/product/generic/system'
  41. + echo make_ext4fs -S out/target/product/generic/root/file_contexts -l 576716800 -a system out/target/product/generic/system.img out/target/product/generic/system
  42. make_ext4fs -S out/target/product/generic/root/file_contexts -l 576716800 -a system out/target/product/generic/system.img out/target/product/generic/system
  43. + make_ext4fs -S out/target/product/generic/root/file_contexts -l 576716800 -a system out/target/product/generic/system.img out/target/product/generic/system
  44. Creating filesystem with parameters:
  45.     Size: 576716800
  46.     Block size: 4096
  47.     Blocks per group: 32768
  48.     Inodes per group: 7040
  49.     Inode size: 256
  50.     Journal blocks: 2200
  51.     Label:
  52.     Blocks: 140800
  53.     Block groups: 5
  54.     Reserved block group size: 39
  55. Created filesystem with 1282/35200 inodes and 78283/140800 blocks
  56. + '[' 0 -ne 0 ']'
  57. out/target/product/generic/system.img maxsize=588791808 blocksize=2112 total=576716800 reserve=5947392
④启动测试
1)启动模拟器
  1. senrsl@senrsl-ubuntu:~/android/source/WORKING_DIRECTORY$ emulator -kernel /home/senrsl/android/source/kernel/goldfish/arch/arm/boot/zImage

2)测试
  1. senrsl@senrsl-ubuntu:~$ adb shell
  2. root@generic:/ # cd system/bin/                                               
  3. root@generic:/system/bin # ./sen
  4. sendevent       senrsl          sensorservice  
  5. root@generic:/system/bin # ./senrsl                                           
  6. Read original value shi:
  7. 0.
  8. Write value 5 to /dev/senrsl.
  9. Read the value again shi:
  10. 5.
  11. root@generic:/system/bin #
OK!
2015年04月10日15:32:26

--
senRsl
2015年04月10日13:28:51

没有评论 :

发表评论