Chinaunix首页 | 论坛 | 博客
  • 博客访问: 980923
  • 博文数量: 192
  • 博客积分: 3070
  • 博客等级: 中校
  • 技术积分: 1861
  • 用 户 组: 普通用户
  • 注册时间: 2007-06-27 23:44
个人简介

Start Linux Leave Linux a while Back to Linux

文章分类

全部博文(192)

文章存档

2023年(18)

2022年(11)

2021年(8)

2020年(14)

2019年(7)

2018年(13)

2017年(16)

2016年(4)

2012年(2)

2011年(13)

2010年(26)

2009年(13)

2008年(27)

2007年(20)

我的朋友

分类: LINUX

2010-09-24 13:53:41

 
记录一下在Android 调试 LED HAL 的过程, 今天终于调通了。一个简单的LED驱动居然断断续续地调试了2个星期。
 
先浏览一下这个 LED HAL 的流程:
 
  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
   APP     (JAVA/ledclient.java)
  -----------------
   JAR Package (JAVA/ledservice.java -> 生成 ledservice.jar)
  -----------------
  -----------------  JNI
   LED Server  (C/com_taner_ledservice.cpp -> 生成 libled_runtime.so)
  -----------------
   LED Stub    (C/led.c -> 生成 led.goldfish.so/led.default.so)
  -----------------
   LED Driver (C, *.ko)
  ==================
   Linux Kernel 
 
  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
  只要了解了这个过程, 下面的开发的比较简单了。一个个文件来分析, 同时也跟大空分享一下在调试过过程中出现的问题及解决方法。
 
  ledclient.java 为Application 的源代码,只要在 Eclipse 中新建一个 Android 工程就可以了。
  在这一步可能会出现
  (x) import com.taner.ledservice;
  这样的错误,导致无法编译通过。其原因是因为 com.taner.ledservice.jar 这个包没有做好。
  下面将介绍如何制作这个 jar 包。
 
 
 
  第二步是制作 com.taner.ledserver.jar 这个包. 这一步试了很久才成功.
  1. 假设我们这个文件的类名是 ledservice.
     那么对应的目录及文件名应为: com/taner/ledserver.java
     在这个文件中最开始的一行应为:
     package com.taner;
     ...
     ...
     public final class ledserver {
     ...
     }
  2. 有了这个原始的 java 档之后, 那么如何将她转为 jar 档案呢?
     1) 新建一个 test 目录, 目录结构如下:
        test
          |-com
             |-taner
                 |-ledserver.java
 
        这个目录结构不能有错.
      2) cd test
         javac com/taner/ledserver.java    <--生成 class 文件
         jar cvf com.taner.ledserver.jar com/  
 
         之前由于没有生成 class 文件这一步,所以做出来的一直都不能用.
         至此, jar 档案制作完成.
 
 
  第三步制作2个SO文件。
   
  这样上层的AP层就可以了。编译也是可以通过的。下面开始运行这个程序。
  启动 Android ,按MENU可以看到 myHal 这一个图标。点击这一图标通过 LOGCAT 可以看到
  trying to load lib /data/data/com.taner.ledclient/lib/libled.runtime.so
  failed load lib /data/data/com.taner.ledclient/lib/libled.runtime.so
  这样的信息, 很明显 load lib 出错了。
 
  这里也犯了一个错误, 之前以为如何将 so 文件加入到 elipse中, 其实不用这么做的, 只需将这两个 so 文件放到 /data/data/com.taner/ledclient/lib 和 system/lib/hw 目录下就可以了.
 
 
  在开发的过程中还有两个问题要注意的:
  1. 在放两个 *.so 文件时有可能会出现一些错误,
   1)如使用 adb push 时提示 the filesystem is readonly.
     解决方法: adb remount
   2)还有可能会出现 out of memory, 这样就需配置一下模拟器的 memory size 了
     解决方法: emulator -avd AVD_2_2 -partition-size 256
 
  2. 在做最后一个库 libled.runtime.so 时, 需要注意这个库的名称, 这个库的名称是与 led.h 中的 LED_HARDWARE_MODULE_ID 一致的. 不然会提示找不到这个 lib.
     之前觉得 #define LED_HARDWARE_MODULE_ID "led" 这个不太好, 后来改为 "led test", 呵呵, 这样就出问题了, 提示找不到 libled.runtime.so. 
 
  3. 还有一个问题也挺奇怪的, 就是在 led.c (stub) 中调用 system() 或 open() 函数居然不成功, 这是标准的C函数啊. 后来上网查了一下, 要 chmod 777 filename 才行,  chmod 666 都不可以, 不知道为什么, 但是 system() 还是无法使用.
 
阅读(1505) | 评论(2) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2010-09-27 10:43:41

很好的, 收藏了 推荐一个博客,提供很多免费软件编程电子书下载: http://free-ebooks.appspot.com

chinaunix网友2010-09-27 07:53:16

很高兴认识你,看看我的博客中的文章吧,对生活很有好处,下面是一些推荐的链接。 电脑一族必看的科学饮食 http://blog.chinaunix.net/u3/119126/showart_2337806.html 抵御电脑辐射从吃开始 http://blog.chinaunix.net/u3/119126/showart_2337785.html 上班族的五种防病食物 http://blog.chinaunix.net/u3/119126/showart_2337764.html 哪些人群最应该喝酸奶 http://blog.chinaunix.net/u3/119126/showart_2337734.html 计算机族必喝的健康饮料 http://blog.chinaunix.net/u3/119126/showart_2337676.html