为我们刚刚生成的/dev/hello字符设备写访问程序
根据原版写下来没有任何问题 二. 在Android系统中增加C可执行程序来访问硬件驱动程序。
贴上来,在external/建立hello文件夹,
1>hello.c文件
#include<stdio.h>
#include<stdlib.h>
#include<fcntl.h>
#define DEVICE_NAME "/dev/hello"
int main(int argc,char** argv)
{
int fd = -1;
int val = 0;
fd = open(DEVICE_NAME,O_RDWR);
if(fd == -1)
{
printf("Failed to open device %s.\n",DEVICE_NAME);
return -1;
}
printf("Read original value:\n");
read(fd,&val,sizeof(val));
printf("%d.\n\n",val);
val = 5;
printf("Write value %d to %s.\n\n",val,DEVICE_NAME);
write(fd,&val,sizeof(val));
printf("Read the value again:\n");
read(fd,&val,sizeof(val));
printf("%d.\n\n",val);
close(fd);
return 0;
}
显而易见,把字符设备当做普通文件打开/dev/hello,读取他的值,然后改变值写入
以测试是否可以访问成功
2>Makefile文件
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE := hello
LOCAL_SRC_FILES := $(call all-subdir-c-files)
include $(BUILD_EXECUTABLE)
3>进入/external/hello用mm部分编译
在这里,我觉得可以说一下部分编译的做法 。
①source ./build/envsetup.h
source./build/envsetup.sh,其实就是把当前目录下build下的envsetup.sh加载到环境中,下面来看envsetup.sh,
其中包含了若干函数,其中有我们编译需要用到的mm,mmm,当然也包括lunch,即用来选择编译类型的命令
functionhmm() {
cat<<EOF
Invoke". build/envsetup.sh" from your shell to add the followingfunctions to your environment:
-lunch: lunch <product_name>-<build_variant>
-tapas: tapas [<App1> <App2> ...][arm|x86|mips|armv5|arm64|x86_64|mips64] [eng|userdebug|user]
-croot: Changes directory to the top of the tree.
-m: Makes from the top of the tree.
-mm: Builds all of the modules in the current directory, but nottheir dependencies.
-mmm: Builds all of the modules in the supplied directories, butnot their dependencies.
Tolimit the modules being built use the syntax: mmmdir/:target1,target2.
-mma: Builds all of the modules in the current directory, andtheir dependencies.
-mmma: Builds all of the modules in the supplied directories, andtheir dependencies.
-cgrep: Greps on all local C/C++ files.
-ggrep: Greps on all local Gradle files.
-jgrep: Greps on all local Java files.
-resgrep: Greps on all local res/*.xml files.
-sgrep: Greps on all local source files.
-godir: Go to the directory containing a file.
②下面来看lunch实现的一部分内容
lunch是用来让用户选择编译项,来定义product和编译过程中用到的全局变量
functionlunch()
{
localanswer
if[ "$1" ] ; then
answer=$1
else
print_lunch_menu
echo-n "Which would you like? [aosp_arm-eng] "
readanswer
fi
lunch不带参数时,便会调用print_lunch_menu列出菜单,显示Whichwould you like?并返回选择answer
在菜单中选择需要的编译选项,这里我选择build_eng
③顺便提一下./mkimage XXXX build_eng
./mkimage调用的是/device/asus/common/script/build/mkimage.sh,
这是我现在这版本的code的mkimage.sh文件内容
echo"PRODUCT_NAME:"
echo" Z00L : ze550kl"
echo" Z00T : ze551kl"
echo"Actions:"
echo" build_eng : build eng mode image which saved in\"Image\" folder"
这也就是./mkimageZ00L build_eng命令的由来
部分编译成功后,把/out/target/product/Z00L/system/bin下生成的hello可执行程序push到手机/system/bin下
运行hello
结果so easy
这样呢,至少可以证明我们建好的字符设备正常,可读可写
Thanks~~~