2019-04-06 13:21:46 chenzhen1080 阅读数 235
  • Android驱动深度开发视频教程

    也许是中国第一个讲解android驱动的课程,涵盖: bootloader,内核移植,INIT进程,框架(BINDER IPC,SERVICE FRAMEWORK Activity Manager Serive,JNI,HAL等),binder驱动,logger,Ashmen,电源管理,常用驱动(如灯光系统,输入系统,显示系统等),构建Android,定制ROM

    25443 人正在学习 去看看 韦东山

将韦东山视频的代码在高通平台上移植,所有的代码参考韦东山一期驱动部分以及二期驱动,代码的扩充也是根据韦东山老师视频里的思路逐步的深入,由浅入深

平台:MSM8917 32位

内核版本:3.18.31

操作系统:ubuntu12.04

Android版本:7.1.2

 

1 驱动的编译

1.a 直接编译到内核

修改Makefile,在Makefile里添加(假设源文件名为foo)

obj-y += foo.o

然后编译出bootimage,烧录bootimage,重启机器进行验证

make bootimage -j4

adb reboot bootloader

fastboot flash boot bootimage

 

1.b 编译成模块

同样修改Makefile,在Makefile里添加(假设源文件名为foo)

obj-m += foo.o

可以直接编译bootimage

make bootimage -j4

编译boogimage的同时会编译modules,生成的modules一般在/system/lib/modules目录下

其它编译方法见另一篇文章

 

2 log的查看

添加的log,可以开机识别adb后,用

adb shell dmesg

或者

adb shell dmesg > d:\1\dmesg01.txt (打印到文件里查看)

或者

adb shell cat /dev/kmsg (实时打印log)

或者连接串口线,通过串口工具查看

 

 

3 应用程序编译

3.a在android源代码里编译

编写代码

编写Android.mk

示例(假设编译的源文件名为foo.c,编译出的模块名为foo)

LOCAL_PATH:= $(call my-dir)

include $(CLEAR_VARS)

LOCAL_SHARED_LIBRARIES := libcutils liblog (链接的共享库)

LOCAL_INCLUDES += $(LOCAL_PATH)

LOCAL_SRC_FILES +=foo.c

LOCAL_MODULE:= foo

include $(BUILD_EXECUTABLE)

 

在android根目录(android源码必须全编译过)

source build/envsetup.sh

lunch工程

mmm Android.mk所在的目录

生成的bin文件一般在目录下 out/target/product/工程/system/bin/

 

3.b 通过arm-linux-gcc静态编译(必须静态编译)

原则:下载的工具链,可以编译,编译出的程序可以执行就可以了

下载工具链

下载网址

https://www.veryarm.com/arm-none-linux-gnueabi-gcc

编写代码

编译源代码

arm-linux-gcc -o foo foo.c -static

 

4 可执行文件的验证

push可执行文件到机器进行验证

adb root

adb remount

adb mkdir /data/my

adb push foo /data/my/foo

adb shell chmod 777 /data/my/foo

adb shell /data/my/foo

 

文章列表

【韦东山驱动代码移植高通平台之一】驱动代码的结构

【韦东山驱动代码移植高通平台之二】创建了一个简单的字符设备驱动

【韦东山驱动代码移植高通平台之三】自动创建设备节点

【韦东山驱动代码移植高通平台之四】创建多个设备节点

【韦东山驱动代码移植高通平台之五】读取按键值

【韦东山驱动代码移植高通平台之六】中断读取按键值

【韦东山驱动代码移植高通平台之七】通过poll机制读取按键值

【韦东山驱动代码移植高通平台之八】通过异步通知读取按键值

【韦东山驱动代码移植高通平台之九】通过ioctl返回值读取按键值

【韦东山驱动代码移植高通平台之十】ioctl通过指针返回按键值

【韦东山驱动代码移植高通平台之十一】 通过input子系统上报按键值

【韦东山驱动代码移植高通平台之十二】通过tasklet上报键值

【韦东山驱动代码移植高通平台之十三】通过工作队列上报键值

【韦东山驱动代码移植高通平台之十四】通过定时器上报键值

【韦东山驱动代码移植高通平台之十五】互斥量

【韦东山驱动代码移植高通平台之十六】信号量

【韦东山驱动代码移植高通平台之十七】原子变量

【韦东山驱动代码移植高通平台之十八】平台设备驱动模型

【韦东山驱动代码移植高通平台之十九】平台设备通过device tree实现

【韦东山驱动代码移植高通平台之二十】结构体的使用

【韦东山驱动代码移植高通平台之二十一】proc节点的创建

【韦东山驱动代码移植高通平台之二十二】sysfs节点的创建

【驱动代码移植高通平台之二十三】高通平台i2c设备驱动

2019-01-13 11:40:52 z2066411585 阅读数 355
  • Android驱动深度开发视频教程

    也许是中国第一个讲解android驱动的课程,涵盖: bootloader,内核移植,INIT进程,框架(BINDER IPC,SERVICE FRAMEWORK Activity Manager Serive,JNI,HAL等),binder驱动,logger,Ashmen,电源管理,常用驱动(如灯光系统,输入系统,显示系统等),构建Android,定制ROM

    25443 人正在学习 去看看 韦东山

Android 源码版本比较多, 这里选择的是 韦东山第四期 Andriod 教程中的 Android-5.0.2, 直接从百问网公开的百度网盘链接下载。由于源码本身已经集成了 Tiny 4412开发板相关配置,省去了很多工作量。

百问网提供配置好编译环境的虚拟机,初步使用了一段时间,诸多不便,这里记录下在Ubuntu 18.04 编译源码的过程。 更方便的是使用Docker安装编译环境,一次配置即可。

构建环境

编译安卓源码之前,需要安装一些依赖包,最好的方式看官网文档
Establishing a Build Environment
,写的比较详细。

安装JDK
  • 每个Android 需要的JDK版本是不一样。这里Android 5.0.2 需要安装 OpenJDK 7 , 如下:
➜  bin java -version
java version "1.7.0_161"
OpenJDK Runtime Environment (IcedTea 2.6.12) (7u161-2.6.12-1)
OpenJDK 64-Bit Server VM (build 24.161-b01, mixed mode)

在这里插入图片描述

// 如果安装JDK不是7,编译报错如下:
make -j4 

PLATFORM_VERSION_CODENAME=REL
PLATFORM_VERSION=5.0.2
TARGET_PRODUCT=full_tiny4412
TARGET_BUILD_VARIANT=eng
TARGET_BUILD_TYPE=release
TARGET_BUILD_APPS=
TARGET_ARCH=arm
TARGET_ARCH_VARIANT=armv7-a-neon
TARGET_CPU_VARIANT=cortex-a9
TARGET_2ND_ARCH=
TARGET_2ND_ARCH_VARIANT=
TARGET_2ND_CPU_VARIANT=
HOST_ARCH=x86_64
HOST_OS=linux
HOST_OS_EXTRA=Linux-4.4.0-116-generic-x86_64-with-Ubuntu-16.04-xenial
HOST_BUILD_TYPE=release
BUILD_ID=LRX22G
OUT_DIR=out
============================================
Checking build tools versions...
/bin/bash: javac: command not found
************************************************************
You are attempting to build with the incorrect version
of java.
 
Your version is: openjdk version "1.8.0_151" OpenJDK Runtime Environment (build 1.8.0_151-8u151-b12-0ubuntu0.16.04.2-b12) OpenJDK 64-Bit Server VM (build 25.151-b12, mixed mode).
The required version is: "1.7.x"
 
Please follow the machine setup instructions at
    https://source.android.com/source/initializing.html
************************************************************
build/core/main.mk:167: *** stop.  Stop.

#### make failed to build some targets (16 seconds) ####
安装依赖包
  • 官方文档 给出的详细介绍,每个Ubuntu 版本安装的依赖项略有区别

在这里插入图片描述

// 本机 Ubuntu 18.04  安装的依赖项
sudo apt-get install git-core gnupg flex bison gperf build-essential zip curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z-dev libgl1-mesa-dev libxml2-utils xsltproc unzip
编译
  • 设置环境变量,执行 android-5.0.2 中的 setenv
  • 执行 lunch,选择对应的板级配置,这里选择 full_tiny4412-eng
  • 执行make,开始编译,通过**-j**选择CPU核数,加速编译的过程。 一般3~4h,编译过程中,会出现编译错误,解决错误之后,继续编译即可。
  • 执行gen-img.sh,生成固件
编译报错解决

实际编译过程中,有一些编译错误,总结一下,并给出解决方案 。


  • /bin/bash: prebuilts/misc/linux-x86/bison/bison: No such file or directory

参考 failed to build aosp. says subcommand failed

解决方案

sudo dpkg --add-architecture i386
sudo apt-get update
sudo apt-get install libc6:i386 libncurses5:i386 libstdc++6:i386

  • prebuilts/misc/linux-x86/bison/bison: m4 subprocess failed:

解决方案

sudo apt-get install bison 

  • flex-2.5.39: loadlocale.c:130: _nl_intern_locale_data: Assertion `cnt < (sizeof (_nl_value_type_LC_TIME) / sizeof (_nl_value_type_LC_TIME[0]))’ failed.

参考 ubuntu 18.04 编译android 8.1 问题记录

Error when build LineageOS: “make: *** [ninja_wrapper] Error 1”

解决方案

export LC_ALL=C

  • opy xml: out/target/product/tiny4412/system/etc/apns-conf.xml
    Copy xml: out/target/product/tiny4412/system/etc/permissions/handheld_core_hardware.xml
    /bin/bash: xmllint: command not found
    /bin/bash: xmllint: command not found

解决方案

 sudo apt-get  install libxml2-utils 

  • clang: error: linker command failed with exit code 1 (use -v to see invocation)
prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.11-4.6//x86_64-linux/include/c++/4.6/bits/basic_string.h:270: error: unsupported reloc 43
prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.11-4.6//x86_64-linux/include/c++/4.6/bits/basic_string.h:270: error: unsupported reloc 43
prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.11-4.6//x86_64-linux/include/c++/4.6/bits/basic_string.h:235: error: unsupported reloc 43
prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.11-4.6//x86_64-linux/include/c++/4.6/bits/basic_string.h:235: error: unsupported reloc 43

libnativehelper/JNIHelp.cpp:338: error: unsupported reloc 43
libnativehelper/JniConstants.cpp:89: error: unsupported reloc 43
..............

clang: error: linker command failed with exit code 1 (use -v to see invocation)
build/core/host_shared_library_internal.mk:44: recipe for target 'out/host/linux-x86/obj32/lib/libnativehelper.so' failed
make: *** [out/host/linux-x86/obj32/lib/libnativehelper.so] Error 1
make: *** Waiting for unfinished jobs....

#### make failed to build some targets (46:54 (mm:ss)) ####

参考Android build error on Ubuntu 16.04 LTS 该方法无效

Ubuntu16 编译Android5.1 lollipop 源码出错 unsupported reloc 43 采用该方法解决

解决方案

cp /usr/bin/ld.gold prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.11-4.6/x86_64-linux/bin/ld

  • 在源码编译3h之后报的错误
Copying: out/target/common/obj/APPS/Bluetooth_intermediates/noproguard.classes.jar
target SharedLib: libGLES_trace (out/target/product/tiny4412/obj/SHARED_LIBRARIES/libGLES_trace_intermediates/LINKED/libGLES_trace.so)
target SharedLib: libbinder (out/target/product/tiny4412/obj/SHARED_LIBRARIES/libbinder_intermediates/LINKED/libbinder.so)
target Symbolic: libharfbuzz_ng (out/target/product/tiny4412/symbols/system/lib/libharfbuzz_ng.so)
out/target/common/obj/PACKAGING/public_api.txt:20: error 5: Added public field android.Manifest.permission.BACKUP
out/target/common/obj/PACKAGING/public_api.txt:81: error 5: Added public field android.Manifest.permission.INVOKE_CARRIER_SETUP
out/target/common/obj/PACKAGING/public_api.txt:105: error 5: Added public field android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE
out/target/common/obj/PACKAGING/public_api.txt:115: error 5: Added public field android.Manifest.permission.RECEIVE_EMERGENCY_BROADCAST

******************************
You have tried to change the API from what has been previously approved.

To make these errors go away, you have two choices:
   1) You can add "@hide" javadoc comments to the methods, etc. listed in the
      errors above.

   2) You can update current.txt by executing the following command:
         make update-api

      To submit the revised current.txt to the main Android repository,
      you will need approval.
******************************

build/core/tasks/apicheck.mk:57: recipe for target 'out/target/common/obj/PACKAGING/checkapi-current-timestamp' failed
make: *** [out/target/common/obj/PACKAGING/checkapi-current-timestamp] Error 38
make: *** Waiting for unfinished jobs....
target SharedLib: libbcc (out/target/product/tiny4412/obj/SHARED_LIBRARIES/libbcc_intermediates/LINKED/libbcc.so)
clang: warning: argument unused during compilation: '-nodefaultlibs'
Note: Some input files use or override a deprecated API.
Note: Recompile with -Xlint:deprecation for details.

#### make failed to build some targets (03:18:04 (hh:mm:ss)) ####

参考[How to fix this API error](make update-api && make -j4make update-api && make -j4make update-api && make -j4)

解决方案

make update-api && make -j4

顺利编译完成,整体编译大约持续4h

Install: out/target/product/tiny4412/system/lib/libwebviewchromium.so
Install: out/target/product/tiny4412/system/app/webview/webview.apk
mkdir -p out/target/product/tiny4412/system/app/webview/lib/arm  ;ln -sf /system/lib/libwebviewchromium.so out/target/product/tiny4412/system/app/webview/lib/arm/libwebviewchromium.so
build/tools/generate-notice-files.py  out/target/product/tiny4412/obj/NOTICE.txt  out/target/product/tiny4412/obj/NOTICE.html "Notices for files contained in the filesystem images in this directory:" out/target/product/tiny4412/obj/NOTICE_FILES/src
Combining NOTICE files into HTML
Combining NOTICE files into text
Installed file list: out/target/product/tiny4412/installed-files.txt
Target system fs image: out/target/product/tiny4412/obj/PACKAGING/systemimage_intermediates/system.img
Running:  mkuserimg.sh -s out/target/product/tiny4412/system out/target/product/tiny4412/obj/PACKAGING/systemimage_intermediates/system.img ext4 system 629145600 out/target/product/tiny4412/root/file_contexts
make_ext4fs -s -T -1 -S out/target/product/tiny4412/root/file_contexts -l 629145600 -a system out/target/product/tiny4412/obj/PACKAGING/systemimage_intermediates/system.img out/target/product/tiny4412/system
Creating filesystem with parameters:
    Size: 629145600
    Block size: 4096
    Blocks per group: 32768
    Inodes per group: 7680
    Inode size: 256
    Journal blocks: 2400
    Label: 
    Blocks: 153600
    Block groups: 5
    Reserved block group size: 39
Created filesystem with 1874/38400 inodes and 136196/153600 blocks
Install system fs image: out/target/product/tiny4412/system.img
out/target/product/tiny4412/system.img+ maxsize=642318336 blocksize=4224 total=549692400 reserve=6488064

#### make completed successfully (39:39 (mm:ss)) ####

  • ./gen-img.sh: line 31: mkimage: command not found

编译 u-boot 得到 mkimage 工具,并拷贝到 /usr/bin路径

sudo cp tools/mkimage /usr/bin/

参考的博客
2016-06-16 09:27:41 wenjs0620 阅读数 1307
  • Android驱动深度开发视频教程

    也许是中国第一个讲解android驱动的课程,涵盖: bootloader,内核移植,INIT进程,框架(BINDER IPC,SERVICE FRAMEWORK Activity Manager Serive,JNI,HAL等),binder驱动,logger,Ashmen,电源管理,常用驱动(如灯光系统,输入系统,显示系统等),构建Android,定制ROM

    25443 人正在学习 去看看 韦东山

PC机:ubuntu 12.04.5
开发板:tiny4412 
Android版本:5.0.2
Android IDE:Android Studio

前提:
PC机已经搭建好 Android 开发环境,已经安装好交叉编译器,
已经编译好 Android 内核 以及 Android 源码, 

编写 Android APP,实现以下功能:
1、一个 button 控制全部 LED,按一下全开,按一下全关
2、四个 CheckBox 分别单独控制每个LED,按一下对应的LED开,再按一下关
------------------------------------------------------------------------
------------------------------------------------------------------------
使用 Android Studio 建立 APP 工程,具体建立过程请 Google
界面建立完成后,开始编写操作 LED 的代码
在 F:\AndroidTest\APP_0001_LEDDemo\app\src\main\java\com\example\wenjs\目录下,建立一个 hardlibrary 目录
在 hardlibrary 目录下,建立一个 HardLibrary.java 文件,用来编写 ledOpen、ledCtrl、ledClose 等本地方法

新建一个文件夹,用来保存动态链接库的源代码,参考之前的 jni 教程,建立一个本地的 .c 文件
按照 jni 的规则,编写 hardlibrary.c 文件,完成本地的 led_open、led_ctrl、led_close 等函数

编写完成后,把 hardlibrary.c 上传到 Linux 并进行交叉编译,执行以下命令:

arm-linux-gcc -fPIC -shared hardlibrary.c -o libhardlibrary.so -I/usr/lib/jvm/java-7-openjdk-amd64/include/

编译参数解释:
-I 表示指定 jni.h 的文件路径位置 
-fPIC 表示生成位置无关码,参考博客: http://blog.sina.com.cn/s/blog_54f82cc201011op1.html
-shared 表示生成动态链接库 .so 文件
-o 表示生成目标文件

编译完成后,生成 libhardlibrary.so 文件,在 F:\AndroidTest\APP_0001_LEDDemo\app\libs 目录下新建 armeabi 文件夹
把 libhardlibrary.so 上传到 armeabi 文件夹中
同时,修改APP工程的 build.gradle(Module:app),添加以下内容:

sourceSets{
        main{
            jniLibs.srcDirs = ['libs']
        }
}

这个表示我们的 jni lib 文件存放在 libs 目录里面,这种方式是会把.so文件编译进APK文件里
以上工作完成后,把应用程序在开发板上运行,程序出现崩溃,
查看调试信息,发现 could not load library "libc.so.6" needed by "libhardlibrary.so"
libhardlibrary.so 的运行依赖于 libc.so.6
查看开发板的终端,ls /vendor/lib 或者 ls /system/lib/libc.*  发现没有 libc.so.6
在Android源码目录 /opt/work/source_code/android-5.0.2/,查找libc.so 
find -iname "libc.so*"

修改一下 hardlibrary.c 的编译选项,改为如下:

arm-linux-gcc -fPIC -shared hardlibrary.c -o libhardlibrary.so -I/usr/lib/jvm/java-7-openjdk-amd64/include/ \
-nostdlib /opt/work/source_code/android-5.0.2/prebuilts/ndk/9/platforms/android-19/arch-arm/usr/lib/libc.so

nostdlib表示不使用标准库,而使用 Android 源码目录下的libc库:

/opt/work/source_code/android-5.0.2/prebuilts/ndk/9/platforms/android-19/arch-arm/usr/lib/libc.so

修改完成后,重新编译运行 Android APP,程序运行正确。表明 Android APP 已经成功调用了本地的 c 库
继续修改 Android APP的代码,调用 ledOpen、ledCtrl、ledClose 等方法
修改 hardlibrary.c 文件,添加 Android 的打印信息,适用以下函数:

#include <android/log.h>    //包含这个头文件

__android_log_print(ANDROID_LOG_INFO, "JniX431FileTest", "lsx_init");  //打印语句

ANDROID_LOG_INFO:是日志级别;
"JniX431FileTest":是要过滤的标签,可以在LogCat视图中过滤。
"lsx_init":是实际的日志内容。

再次执行以下命令编译 hardlibrary.c ,提示找不到 android/log.h
到 Android 源码目录查找一下,发现 android/log.h 在以下路径:

/opt/work/source_code/android-5.0.2/prebuilts/ndk/9/platforms/android-19/arch-arm/usr/include/android/log.h

更改编译选项为以下内容:

arm-linux-gcc -fPIC -shared hardlibrary.c -o libhardlibrary.so -I/usr/lib/jvm/java-7-openjdk-amd64/include/ \
-nostdlib /opt/work/source_code/android-5.0.2/prebuilts/ndk/9/platforms/android-19/arch-arm/usr/lib/libc.so \
-I/opt/work/source_code/android-5.0.2/prebuilts/ndk/9/platforms/android-19/arch-arm/usr/include/

hardlibrary.c 编译成功,重新上传到 Android APP的 armeabi 目录,再次运行 APP
运行失败,根据提示信息:dlopen failed: cannot locate symbol "__android_log_print" ,打开动态库失败

到 Android 源码目录查找一下,发现 liblog 在以下路径:

/opt/work/source_code/android-5.0.2/prebuilts/ndk/9/platforms/android-19/arch-arm/usr/lib/liblog.so

更改编译选项为以下内容:

arm-linux-gcc -fPIC -shared hardlibrary.c -o libhardlibrary.so -I/usr/lib/jvm/java-7-openjdk-amd64/include/ \
-nostdlib /opt/work/source_code/android-5.0.2/prebuilts/ndk/9/platforms/android-19/arch-arm/usr/lib/libc.so \
-I/opt/work/source_code/android-5.0.2/prebuilts/ndk/9/platforms/android-19/arch-arm/usr/include/ \
/opt/work/source_code/android-5.0.2/prebuilts/ndk/9/platforms/android-19/arch-arm/usr/lib/liblog.so

经过以上操作,Android APP 和 本地方法  libhardlibrary.so 编译成功
把 app 下载到开发板上运行,点击 button 和 checkbox,程序正确运行,但此时还没有编写硬件驱动,只有打印信息
--------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------
编写 led 硬件驱动程序
参考韦东山Linux第二期视频,使用字符设备驱动模型,来开发led驱动程序,此处不再重复
以下是驱动源码:

#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/miscdevice.h>
#include <linux/fs.h>
#include <linux/types.h>
#include <linux/moduleparam.h>
#include <linux/slab.h>
#include <linux/ioctl.h>
#include <linux/cdev.h>
#include <linux/delay.h>
#include <linux/gpio.h>
#include <mach/gpio.h>
#include <plat/gpio-cfg.h>
#include <device.h>
static int major = 0;
static struct class *led_class;

static int led_gpios[] = {
        EXYNOS4212_GPM4(0),
        EXYNOS4212_GPM4(1),
        EXYNOS4212_GPM4(2),
        EXYNOS4212_GPM4(3),
};

static int led_open(void)
{
        /* set gpio output */
        int i = 0;
        
        for(i=0;i<4;i++)
        {
                s3c_gpio_cfgpin(led_gpios[i], S3C_GPIO_OUTPUT);
                //gpio_set_value(led_gpios[i], 1);
        }	
        return 0;
}

//app : ioctl(fd,cmd,arg)
static long led_ioctl(struct file *filp, unsigned int cmd,unsigned long arg)
{
       if((cmd != 0) && (cmd != 1))
       return -EINVAL;

       if(arg > 4)
       return -EINVAL;
		
       gpio_set_value(led_gpios[arg], !cmd);

       return 0;
}

static struct file_operastions leds_fops = {
        .owner			= THIS_MODULE,
        .open	                = led_open,
        .unlocked_ioctl	        = led_ioctl,
};

int leds_init(void)
{
        major = register_chrdev(0,"leds",&leds_fops);

        led_class = class_create(THIS_MODULE,"leds");
        device_create(led_class, NULL, MKDEV(major,0), NULL, "leds");
	
        return 0;
}

void leds_exit(void)
{	
        device_destroy(led_class, MKDEV(major,0));
        class_destroy(led_class);
        unregister_chrdev(major,"leds");
}

module_init(leds_init);
module_exit(leds_exit);

MODULE_LICENSE("GPL");
MODULE_AUTHOR("wenjs0620@163.com");

把led驱动放入 Android kernel 的 device/char目录。
修改Android 内核的makefile,添加编译选项,重新编译 make zImage
重新烧写内核到开发板。
-----------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------
再次修改 hardlibrary.c 文件,修改里面的 led_open、led_close、led_ctrl 函数,
在里面的这些函数里,使用 open 、read 、write 函数来操作硬件
重新编译 hardlibrary.c 为 libhardlibrary.so ,并重新上传到Android app 的 armeabi 目录
重新编译 Android app 工程,运行,可以使用app操作开发板上的led了

整个层次关系如下:
Android APP ----> 加载 c 库
--------------------------------------------
JNI 本地接口函数(其实就是Linux的应用层)
--------------------------------------------
Linux 驱动程序

 

 

2015-12-29 16:48:42 chengdong1314 阅读数 2204
  • Android驱动深度开发视频教程

    也许是中国第一个讲解android驱动的课程,涵盖: bootloader,内核移植,INIT进程,框架(BINDER IPC,SERVICE FRAMEWORK Activity Manager Serive,JNI,HAL等),binder驱动,logger,Ashmen,电源管理,常用驱动(如灯光系统,输入系统,显示系统等),构建Android,定制ROM

    25443 人正在学习 去看看 韦东山

参考  《百问网精智JZ2440开发板4.3寸LCD版使用手册.pdf2015/12/29》
修改环境变量:
sudo vi /etc/environment
修改:PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/arm/4.3.2/bin"
改为:PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/work/tools/gcc-3.4.5-glibc-2.3.6/bin/"

编译依赖库/work/GUI/qtopia/deps/jpegsrc.v6b.tar.gz
tar xzf jpegsrc.v6b.tar.gz
cd jpeg-6b/
./configure --enable-shared --enable-static --prefix=/work/tools/gcc-3.4.5-glibc-2.3.6/arm-linux --build=i386 --host=arm
make
make install-lib

编译依赖库/wok/GUI/qtopia/deps/e2fsprogs-1.40.2.tar.gz
mkdir build
cd build
../configure --with-cc=arm-linux-gcc --with-linker=arm-linux-ld --enable-elf-shlibs --host=arm -prefix=/work/tools/gcc-3.4.5-glibc-2.3.6/arm-linux
make
make install-libs

编译依赖库/wok//GUI/qtopia/deps/libpng-1.2.23.tar.bz2
tar xjf libpng-1.2.23.tar.bz2
cd libpng-1.2.23/
cp scripts/makefile.linux ./Makefile
修改 Makefile,以下是修改后的结果,都加上了“ arm-linux-”前缀:
AR_RC=arm-linux-ar rc
CC=arm-linux-gcc
……
RANLIB=arm-linux-ranlib
……
prefix=/work/tools/gcc-3.4.5-glibc-2.3.6/arm-linux
make
make install

编译依赖库/wok/GUI/qtopia/deps/tslib-1.3.tar.bz2
./autogen.sh
echo "ac_cv_func_malloc_0_nonnull=yes" >arm-linux.cache
./configure --host=arm-linux --cache-file=arm-linux.cache --enable-inputapi=no --prefix=/work/tools/gcc-3.4.5-glibc-2.3.6/arm-linux
在 make 之前,为了支持触摸屏修改 src/ts_read_raw.c 文件,如下修改代码:
char *defaulttseventtype="UCB1x00";
改为:
char *defaulttseventtype="H3600";
步骤如下:
vi src/ts_read_raw.c
为 了 防 止 出 现 “libtool:link: only absolute run-paths are allowed “ 的 错 误 , 在
plugins/Makefile 里面找 rpath,找到将其注释并加上绝对路径:
#LDFLAGS :=$(LDFLAGS) -rpath $(PLUGIN_DIR)
LDFLAGS :=$(LDFLAGS) -rpath `cd $(PLUGIN_DIR) && pwd`
步骤如下:
vi plugins/Makefile
/rpath
make
make install

使用补丁修改、编译 QT
/wok/GUI/qtopia 目 录 下 , qtopia-free-src-2.2.0.tar.gz 是 未 经 修 改 的 内 核 源 码 ,
qtopia-free-2.2.0_jz2440.patch 是针对 JZ2440 开发板的补丁文件。
tar xzf qtopia-free-src-2.2.0.tar.gz
cd qtopia-free-2.2.0
patch -p1 < ../qtopia-free-2.2.0_jz2440.patch
./configure -qte '-embedded -xplatform linux-arm-g++ -qconfig qpe -depths 16,24 -no-qvfb -system-jpeg -system-libpng -system-zlib -tslib -gif -thread -lts' -qpe '-xplatform linux-arm-g++ -edition pda -displaysize 240x320' -qt2 '-no-xft' -dqt '-no-xft'
make
make install

制作根目录:
sudo tar xjf fs_mini_mdev.tar.bz2
mv fs_mini_mdev fs_myqtopia
sudo chown book:book fs_myqtopia –R

复制依赖库:
cd /work/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/lib/
cp libpng.so* /work/nfs_root/fs_myqtopia/lib/ -d
cp libjpeg.so* /work/nfs_root/fs_myqtopia/lib/ -d
cp libuuid.so* /work/nfs_root/fs_myqtopia/lib/ -d
cp libz.so* /work/nfs_root/fs_myqtopia/lib/ -d

安装触摸屏所依赖文件:
cd /work/GUI/qtopia/deps/tslib-1.3
make prefix=/work/nfs_root/fs_myqtopia/usr/ install
cp /work/nfs_root/fs_myqtopia/usr/etc/ts.conf /work/nfs_root/fs_myqtopia/etc/
cd /work/nfs_root/fs_myqtopia/etc/
vi ts.conf

复制字库:
cd /work/GUI/qtopia/qtopia-free-2.2.0/
mkdir image/opt/Qtopia/lib/ -p
cp -rf qt2/lib/fonts qtopia/image/opt/Qtopia/lib/
cp -rf qtopia/image/opt /work/nfs_root/fs_myqtopia

创建时区文件
cd /work/nfs_root/fs_myqtopia
mkdir -p usr/share/zoneinfo/
cp -rf /usr/share/zoneinfo/America usr/share/zoneinfo/
cp /usr/share/zoneinfo/zone.tab usr/share/zoneinfo/

建立一个脚本文件, 用来较验触摸屏
在单板根目录/bin 下建立 ts_cal.sh 文件,内容如下:
#!/bin/sh
export HOME=/root
export QTDIR=/opt/Qtopia
export QPEDIR=/opt/Qtopia
export QWS_DISPLAY=LinuxFb:/dev/fb0
export QWS_KEYBOARD="TTY:/dev/tty1"
#export QWS_MOUSE_PROTO="USB:/dev/mouse0"
export QWS_MOUSE_PROTO="TPanel:/dev/ts0"
export PATH=$QPEDIR/bin:$PATH
export LD_LIBRARY_PATH=$QPEDIR/lib:$LD_LIBRARY_PATH
export TSLIB_TSDEVICE=/dev/ts0
export TSLIB_CONSOLEDEVICE=none
export TSLIB_FBDEVICE=/dev/fb0
export TSLIB_CONFFILE=/etc/ts.conf
export TSLIB_PLUGINDIR=/usr/share/ts/plugins
export TSLIB_TSEVENTTYPE="H3600"
/usr/bin/ts_calibrate
步骤如下:
vi bin/ts_cal.sh
chmod +x /work/nfs_root/fs_myqtopia/bin/ts_cal.sh

建立一个脚本文件, 用来运行 qtopia
在单板根目录/bin 下建立 qpe.sh 文件, 它用来设置环境变量、 启动 qtopia。 内容如下:
#!/bin/sh
export HOME=/root
export QTDIR=/opt/Qtopia
export QPEDIR=/opt/Qtopia
export QWS_DISPLAY=LinuxFb:/dev/fb0
export QWS_KEYBOARD="TTY:/dev/tty1"
#export QWS_MOUSE_PROTO="USB:/dev/mouse0"
export QWS_MOUSE_PROTO="TPanel:/dev/ts0"
export PATH=$QPEDIR/bin:$PATH
export LD_LIBRARY_PATH=$QPEDIR/lib:$LD_LIBRARY_PATH
export TSLIB_TSDEVICE=/dev/ts0
export TSLIB_CONSOLEDEVICE=none
export TSLIB_FBDEVICE=/dev/fb0
export TSLIB_CONFFILE=/etc/ts.conf
export TSLIB_PLUGINDIR=/usr/share/ts/plugins
export TSLIB_TSEVENTTYPE="H3600"
if [ ! -e /etc/pointercal ]
then
/bin/ts_cal.sh
fi
$QPEDIR/bin/qpe &
步骤如下:
vi bin/qpe.sh

建立/root 目录:
mkdir -p /work/nfs_root/fs_myqtopia/root

修改根文件系统的启动脚本:
mkdir -p /work/nfs_root/fs_myqtopia/tmp
vi /work/nfs_root/fs_myqtopia/etc/fstab
加入:tmpfs /tmp tmpfs defaults 0 0
最后,修改启动脚本/work/nfs_root/fs_qtopia/etc/init.d/rcS,在最后加入以下一行:
/bin/qpe.sh &
还要修改它的属性:
$ chmod +x /work/nfs_root/fs_qtopia/bin/qpe.sh
步骤如下:
vi /work/nfs_root/fs_myqtopia/etc/init.d/rcS
chmod +x /work/nfs_root/fs_myqtopia/bin/qpe.sh

set bootargs noinitrd root=/dev/nfs nfsroot=192.168.1.113:/work/nfs_root/fs_myqtopia ip=192.168.1.17:192.168.1.19:192.168.1.1:255.255.255.0::eth0:off init=/linuxrc console=ttySAC0,115200 user_debug=0xff
nfs 30000000 192.168.1.113:/work/nfs_root/uImage_4.3 ; bootm 30000000

程序编译:
export QTDIR=/work/GUI/qtopia/qtopia-free-2.2.0/qt2
export QPEDIR=/work/GUI/qtopia/qtopia-free-2.2.0/qtopia/
export QMAKESPEC=/work/GUI/qtopia/qtopia-free-2.2.0/qtopia/mkspecs/qws/linux-arm-g++/
$QPEDIR/bin/qmake
cp ./helloworld.png /work/nfs_root/fs_myqtopia/opt/Qtopia/pics/
cp ./helloworld /work/nfs_root/fs_myqtopia/opt/Qtopia/bin/
cp ./helloworld.desktop /work/nfs_root/fs_myqtopia/opt/Qtopia/apps/Applications/

挂载U盘和SD卡
mount /dev/sda1 /root/Applications/Dictionary

mount /dev/mmcblk0p1 /mnt

 

到此QT移植成功

有图有真相,现在把实验图片上传上来:

但是这里有一个问题,就是这里的音乐播放器不能够播放SD卡了的音乐,浏览也不行,我把SD卡挂载到/mnt目录已经成功了,但是音乐确实播放不了

这一点有待研究!

这里把最后得到的更文件目录和内核上传上来:

http://download.csdn.net/detail/chengdong1314/9382353

2014-11-26 10:23:27 jsntghf 阅读数 212
  • Android驱动深度开发视频教程

    也许是中国第一个讲解android驱动的课程,涵盖: bootloader,内核移植,INIT进程,框架(BINDER IPC,SERVICE FRAMEWORK Activity Manager Serive,JNI,HAL等),binder驱动,logger,Ashmen,电源管理,常用驱动(如灯光系统,输入系统,显示系统等),构建Android,定制ROM

    25443 人正在学习 去看看 韦东山

制作arm-linux交叉编译工具链一般通过crosstool工具或者crosstool-NG,前者使用方便,但是制作会受到一些限制,使用crosstool最多只能编译gcc4.1.1、glibc2.x的版本,无法编译版本高于2.6.29的linux内核。crosstool-NG是新的用来建立交叉编译工具链的工具,它是crosstool的替代者。crosstool-NG有更好的定制性,并且一直保持着更新,对新版本的编译工具链的支持比较好,当然也带来了一些麻烦,它并不是下载下来就可以使用的,必须先配置安装。我们这里选用crosstool-NG来制作编译工具链。

 

本文使用的系统是Ubuntu Kylin(3.13.0-32-generic #57-Ubuntu SMP Tue Jul 15 03:51:08 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux),建议都使用Ubuntu系统,安装软件比较方便。

 

一、安装crosstool-NG

1、建立arm-linux-tools目录,并进入该目录

$ mkdir arm-linux-tools
$ cd arm-linux-tools

 

2、获取crosstool-NG的源码

$ wget http://crosstool-ng.org/download/crosstool-ng/crosstool-ng-1.20.0.tar.bz2

 

3、解压crosstool-NG的源码

$ tar xvjf crosstool-ng-1.20.0.tar.bz2

考虑到后续将要使用到的各种目录,在这里先建立好后续所需的目录。

$ mkdir crosstool-build crosstool-install src

 

4、配置并进行依赖检测

$ cd crosstool-ng-1.20.0
$ ./configure --prefix /home/eric/arm-linux-tools/crosstool-install/

 

在配置之前,需要确保以下软件已经安装

1)gperf

2)bison

3)flex

4)texinfo

5)gawk

6)libtool

7)automake

8)libncurses5-dev

9)g++

 

在进行配置时,会进行依赖检测,如果存在包缺失的现象,安装好之后再执行配置即可。

成功配置之后会自动创建我们需要的Makefile文件。

 

5、编译并安装

$ make
$ make install

 

6、配置环境变量

$ export PATH=$PATH:/home/eric/arm-linux-tools/crosstool-install/bin/

 

7、检查crosstool-NG是否安装成功

$ ct-ng -v


 

二、配置交叉编译工具链

在crosstool-NG中有很多已经做好的默认配置(位于crosstool-ng-1.20.0/samples目录下),这里只需要进行修改就可以了。因为是制作arm-linux的交叉编译工具链,所以选择arm-unknown-linux-gnueabi进行配置。

 

1、将arm-unknown-linux-gnueabi文件夹复制到crosstool-build目录下

$ cd samples
$ cp -r arm-unknown-linux-gnueabi/ ../../crosstool-build/ 

 

2、将默认配置文件拷贝到crosstool-build目录下并改名为.config

$ cd ~/arm-linux-tools/crosstool-build
$ cp arm-unknown-linux-gnueabi/crosstool.config .config

 

3、执行ct-ng menuconfig进入配置界面进行配置

$ ct-ng menuconfig

配置界面如下图所示:

 

(1)设定源码包路径和交叉编译器的安装路径

1)源码包路径:设置Paths and misc options下的Local tarballs directory为/home/eric/arm-linux-tools/src

2)交叉编译器的安装路径:设置Paths and misc options下的Prefix directory为/home/eric/arm-linux-tools/x-tools/${CT_TARGET}

 

(2)修改交叉编译器针对的架构

1)设置Target options下的Architecture level为armv4t

2)设置Target options下的Emit assembly for CPU为arm9tdmi

3)设置Target options下的Tune for CPU为arm920t

 

以上这几个参数是如何得出来的,可以参考gcc的man手册。你可以在下载的gcc-4.9.1.tar.bz2解压后的文件夹中找到(gcc-4.9.1/gcc/doc/gcc.1)

执行以下命令打开gcc.1

$ man ./gcc.1

你可以在其中看到下面这段:

......
 ARM Options
......
-march=name
           This specifies the name of the target ARM architecture.  GCC uses
           this name to determine what kind of instructions it can emit when
           generating assembly code.  This option can be used in conjunction
           with or instead of the -mcpu= option.  Permissible names are:
           armv2, armv2a, armv3, armv3m, armv4, armv4t, armv5, armv5t, armv5e,
           armv5te, armv6, armv6j, armv6t2, armv6z, armv6zk, armv6-m, armv7,
           armv7-a, armv7-r, armv7-m, armv7e-m, armv7ve, armv8-a, armv8-a+crc,
           iwmmxt, iwmmxt2, ep9312.
		      
-mtune=name
           This option specifies the name of the target ARM processor for
           which GCC should tune the performance of the code.  For some ARM
           implementations better performance can be obtained by using this
           option.  Permissible names are: arm2, arm250, arm3, arm6, arm60,
           arm600, arm610, arm620, arm7, arm7m, arm7d, arm7dm, arm7di,
           arm7dmi, arm70, arm700, arm700i, arm710, arm710c, arm7100, arm720,
           arm7500, arm7500fe, arm7tdmi, arm7tdmi-s, arm710t, arm720t,
           arm740t, strongarm, strongarm110, strongarm1100, strongarm1110,
           arm8, arm810, arm9, arm9e, arm920, arm920t, arm922t, arm946e-s,
           arm966e-s, arm968e-s, arm926ej-s, arm940t, arm9tdmi, arm10tdmi,
           arm1020t, arm1026ej-s, arm10e, arm1020e, arm1022e, arm1136j-s,
           arm1136jf-s, mpcore, mpcorenovfp, arm1156t2-s, arm1156t2f-s,
           arm1176jz-s, arm1176jzf-s, cortex-a5, cortex-a7, cortex-a8,
           cortex-a9, cortex-a12, cortex-a15, cortex-a53, cortex-a57,
           cortex-r4, cortex-r4f, cortex-r5, cortex-r7, cortex-m4, cortex-m3,
           cortex-m1, cortex-m0, cortex-m0plus, marvell-pj4, xscale, iwmmxt,
           iwmmxt2, ep9312, fa526, fa626, fa606te, fa626te, fmp626, fa726te.
		   
		   Additionally, this option can specify that GCC should tune the
		   performance of the code for a big.LITTLE system.  Permissible names
		   are: cortex-a15.cortex-a7, cortex-a57.cortex-a53.
		      
-mcpu=name
           This specifies the name of the target ARM processor.  GCC uses this
           name to derive the name of the target ARM architecture (as if
           specified by -march) and the ARM processor type for which to tune
           for performance (as if specified by -mtune).  Where this option is
           used in conjunction with -march or -mtune, those options take
           precedence over the appropriate part of this option.

           Permissible names for this option are the same as those for -mtune.

           -mcpu=generic-arch is also permissible, and is equivalent to
           -march=arch -mtune=generic-arch.  See -mtune for more information.

           -mcpu=native causes the compiler to auto-detect the CPU of the
           build computer.  At present, this feature is only supported on
           Linux, and not all architectures are recognized.  If the auto-
           detect is unsuccessful the option has no effect.
......

-march=name对应Architecture level

-mtune=name对应Tune for CPU

-mcpu=name对应Emit assembly for CPU

 

(3)设置编译时的并行进程数

1)设置Paths and misc options下的Number of parallel jobs为4

这个数值不宜过大,应该为CPU核心数量的两倍。

 

(4)设置编译器前缀

1)设置Toolchain options下的Tuple's vendor string为S3C2440,这样生成的编译器的前缀就是arm-S3C2440-linux-gnueabi-

 

4、安装termcap

$ cd /tmp
$ wget ftp://ftp.gnu.org/gnu/termcap/termcap-1.3.1.tar.gz
$ tar xvzf termcap-1.3.1.tar.gz
$ cd termcap-1.3.1
$ ./configure --prefix=/usr
$ make
$ make install

 

5、编译

在crosstool-build目录下执行以下命令进行编译

$ ct-ng build.4

 

整个编译过程时间比较长,crosstool-ng会自动下载相应的包和内核文件,然后解压、配置、编译、链接,但有个别包在自动下载过程中会出错,例如duma_2_5_15和expat-2.1.0,需要手动下载这两个包放入Local tarballs directory指定的目录(这里为/home/eric/arm-linux-tools/src),然后再重新执行编译即可。

 

编译过程中,在安装到cross-gdb时,出现configure: error: expat is missing or unusable的错误,安装libexpat1-dev即可。

编译过程中,出现g++: Internal error: Killed (program cc1plus)的错误,尝试着将可用内存加大。

 

如下图所示,代表安装成功了。

 

6、配置环境变量

$ echo "PATH=$PATH:/home/eric/arm-linux-tools/x-tools/arm-S3C2440-linux-gnueabi/bin" >> ~/.bashrc
$ source ~/.bashrc

 

7、确认安装完成

$ arm-S3C2440-linux-gnueabi-gcc -v

 

8、编译成功后的交叉编译器路径

(1)编译器路径:/home/eric/arm-linux-tools/x-tools/arm-S3C2440-linux-gnueabi/bin

(2)库文件路径:/home/eric/arm-linux-tools/x-tools/arm-S3C2440-linux-gnueabi/arm-S3C2440-linux-gnueabi/lib

 

三、编译测试

1、写一个简单的C程序:Hello, World

#include <stdio.h>

int main() {
    printf("Hello, World\n");

    return 0;
}

 

2、编译

$ arm-S3C2440-linux-gnueabi-gcc -o hello hello.c

 

3、上传至目标板并执行

$ chmod +x ./hello
$ ./hello

 

如上图所示,创建的交叉编译链可以成功编译成目标板能够识别的指令。

 

关于crosstool-ng的详细介绍和使用,请参考:http://www.crifan.com/files/doc/docbook/crosstool_ng/release/htmls/index.html

需要的依赖包下载:http://download.csdn.net/detail/jsntghf/8198753

编译后的交叉编译工具链下载:http://download.csdn.net/detail/jsntghf/8206693

jz2440开始(一)

阅读数 2232

UVC摄像头移植总结

阅读数 2326

没有更多推荐了,返回首页