'임베디드'에 해당되는 글 112건

  1. 2011.03.22 [android][error] /dev/pmem, libhgl.so 에러
  2. 2011.03.22 [android][error] BatteryService 패치
  3. 2011.03.22 [android][error] power.c 패치
  4. 2011.03.22 [android][error] can't find any keycharmaps & can't open keycharmaps file
  5. 2011.03.21 [android] HOME key 살리기
  6. 2011.03.21 [android,cupcake] 안드로이드용 파일 시스템 구축 스크립트
  7. 2011.03.15 [s3c6410] SDL + tslib 환경 설정값
  8. 2011.03.14 [s3c6410] busybox의 telnetd 을 사용해 보자
  9. 2011.03.14 [S3C6410,Android] tslib 포팅 for Android
  10. 2011.03.10 [S3C6410] cs8900 device driver

[android][error] /dev/pmem, libhgl.so 에러

안드로이드가 부팅하면서 로그를 보면 /dev/pmem 과 libhgl.so 라이브러리를 못 찾겠다는 에러가 발생하는데, 이 두 개는 large physically contiguous memory와 관계가 있는 부분이기 때문에 현재의 안드로이드용 보드들에서는 별 상관없다.

[android][error] BatteryService 패치

  • 위치 : frameworks/base/services/jni
  • 파일 : com_android_server_BatteryService.cpp
  • 에러메세지 :
    1. E/BatteryService( 1866): Could not open '/junk_battery/class/power_supply/battery/status'

    2. W/BatteryService( 1866): Unknown battery health[2] '100'

  • 패치 내용 :
static void android_server_BatteryService_update(JNIEnv* env, jobject obj)
{
#if 0
    setBooleanField(env, obj, AC_ONLINE_PATH, gFieldIds.mAcOnline);
    setBooleanField(env, obj, USB_ONLINE_PATH, gFieldIds.mUsbOnline);
    setBooleanField(env, obj, BATTERY_PRESENT_PATH, gFieldIds.mBatteryPresent);
   
    setIntField(env, obj, BATTERY_CAPACITY_PATH, gFieldIds.mBatteryLevel);
    setIntField(env, obj, BATTERY_VOLTAGE_PATH, gFieldIds.mBatteryVoltage);
    setIntField(env, obj, BATTERY_TEMPERATURE_PATH, gFieldIds.mBatteryTemperature);
   
    const int SIZE = 128;
    char buf[SIZE];
   
    if (readFromFile(BATTERY_STATUS_PATH, buf, SIZE) > 0)
        env->SetIntField(obj, gFieldIds.mBatteryStatus, getBatteryStatus(buf));
   
    if (readFromFile(BATTERY_HEALTH_PATH, buf, SIZE) > 0)
        env->SetIntField(obj, gFieldIds.mBatteryHealth, getBatteryHealth(buf));

    if (readFromFile(BATTERY_TECHNOLOGY_PATH, buf, SIZE) > 0)
        env->SetObjectField(obj, gFieldIds.mBatteryTechnology, env->NewStringUTF(buf));
#else
    env->SetBooleanField(obj, gFieldIds.mAcOnline, true);
    env->SetBooleanField(obj, gFieldIds.mUsbOnline, false);
    env->SetBooleanField(obj, gFieldIds.mBatteryPresent, false);

    env->SetIntField(obj, gFieldIds.mBatteryLevel, 100);
    env->SetIntField(obj, gFieldIds.mBatteryVoltage, 15);
    env->SetIntField(obj, gFieldIds.mBatteryTemperature, 20);

    const int SIZE = 128;
    char buf[SIZE];
   
        env->SetIntField(obj, gFieldIds.mBatteryStatus, getBatteryStatus("F"));
   
        env->SetIntField(obj, gFieldIds.mBatteryHealth, getBatteryHealth("G"));

        env->SetObjectField(obj, gFieldIds.mBatteryTechnology, env->NewStringUTF("Nemus"));
#endif
}



[android][error] power.c 패치

  • 위치 : hardware/libhardware_legacy/power 
  • 파일 : power.c 
  • 에러 메세지 : 
    1. "E/power ( 1866): Failed setting last user activity: g_error=0"
  • 수정내용


    int
    set_screen_state(int on)
    {
    QEMU_FALLBACK(set_screen_state(on));

    //LOGI("*** set_screen_state %d", on);

    initialize_fds();

    //LOGI("go_to_sleep eventTime=%lld now=%lld g_error=%s\n", eventTime,
    // systemTime(), strerror(g_error));

    //if (g_error) return g_error;

    char buf[32];
    int len;
    if(on)
    len = sprintf(buf, on_state);
    else
    len = sprintf(buf, off_state);
    len = write(g_fds[REQUEST_STATE], buf, len);
    if(len < 0) {
    LOGE("Failed setting last user activity: g_error=%d\n", g_error);
    }
    return 0;
    }

[android][error] can't find any keycharmaps & can't open keycharmaps file

- 위 2개 에러는 퍼미션 때문에 생기는 에러
- /system/usr/keychars 안에 있는 모든 파일에 644퍼미션을 주면 해결 된다.

[android] HOME key 살리기

1. 안드로이드 플랫폼 포팅 시.

작업파일 : development/apps/SdkSetup/Android.mk

LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := foo
LOCAL_SRC_FILES := $(call all-subdir-java-files)
LOCAL_PACKAGE_NAME := SdkSetup
LOCAL_CERTIFICATE := platform
include $(BUILD_PACKAGE)

파일 내용을 위와 같이 수정해 주면 
out/target/product/generic/system/app/SdkSetup.apk 파일이 생긴다.
이 파일이 설치되면 keyquard가 동작하게 되면 homekey도 작동하게 된다.

2. sqlite db 파일 수정

작업파일 : data/data/com.android.providers.settings/databases/settings.db
table : secure
column : name컬럼에 "device_provisioned" 의 값을 1로 설정해 주면 된다.

sql :
insert into secure(name,value) values('device_provisioned',1);
or
update secure set value=0 when name='device_provisioned';

 

[android,cupcake] 안드로이드용 파일 시스템 구축 스크립트

아직 작업 중....


-- sd 카드용 디렉토리 생성 스크립트 

#!/bin/sh 
ARGS=1
TARGET_DIR=$1
PWD=`pwd`

if [ $# -ne "$ARGS" ]
then 
    echo "USAGE : `basename $0` [TARGET DIRECTORY]"
    echo $1
    exit 65
fi


cd $TARGET_DIR
mkdir sdcard cache sqlite_stmt_journals
cd $PWD 


-- junk battery 용 스크립트

#!/bin/sh


ARGS=1

TARGET_DIR=$1

PWD=`pwd`



if [ $# -ne "$ARGS" ]

then

    echo "USAGE : `basename $0` [TARGET DIRECTORY]"

    exit 65

fi


make_directory_file() {

    mkdir -p junk_battery/class/power_supply/ac 

    cd junk_battery/class/power_supply 

    mkdir usb battery

#    touch ac/online usb/online battery/stats battery/health battery/present battery/capacity battery/batt_vol battery/batt_temp battery/technology

    echo "100" > ac/online 

    echo "100" > usb/online 

    echo "100" > battery/stats 

    echo "100" > battery/health 

    echo "100" > battery/present 

    echo "100" > battery/capacity 

    echo "100" > battery/batt_vol 

    echo "100" > battery/batt_temp 

    echo "100" > battery/technology

}




cd $TARGET_DIR 

make_directory_file

cd $PWD


[s3c6410] SDL + tslib 환경 설정값

SDL 과 tslib을 같이 사용하기 위해서는 환경 설정값이 필요하다.
하나라도 빠지게 되면 sdl상에서의 마우스 움직임이 틀려진다.

- TSLIB
export TSLIB_TSDEVICE=/dev/input/event1
export TSLIB_CONFFILE=/etc/ts.conf
export TSLIB_FBDEVICE=/dev/fb0

- SDL
export SDL_MOUSEDRV=TSLIB
export SDL_MOUSEDEV=/dev/input/event1

* tslib의 calibration 데이터 file : /etc/pointercal 
* 위 데이터는 ts_calibration을 해주면 생성되게 된다.

[s3c6410] busybox의 telnetd 을 사용해 보자

  • 버젼 : 1.18.0
  • 사전 확인 사항 :
    • 커널 옵션에서 Device Drivers -> Character devices -> Unix98 PTY support 항목이 선택 되었는지 확인(Support multiple instances of devpts 마찬가지)
    • busybox 설정에서 확인
      • CONFIG_LOGIN=y
      • CONFIG_FEATURE_SUID=y
      • CONFIG_TELNETD=y 
  • 타겟보드 부팅 후 작업
    • mount -t devpts devpts /dev/pts
      • mount 되었는지 확인해 보자
      • 자동으로 마운트 되게 하려면 /etc/fstab에 아래와 같이 추가해 주자
        • devpts      /dev/pts      devpts     default      0   0
    • ptyp0~9번까지 생성
      • mknod /dev/ptyp0 c 2 0 
      • ~
      • mknod /dev/ptyp9 c 2 9
    • /etc/nsswitch.conf 파일 내용이 아래와 같은지 확인.(틀리면 수정)
      • passwd:        files
      • group:           files
      • shadow:        files
    • telnet에 접속할 수 있는 사용자를 추가 하자.
      • adduser -h /home/user user
      • 사용자가 추가 되었는지 /etc/passwd, /etc/shadow 을 확인하자.
      • 램디스크인 상태라면 다음 재부팅 할 때 사용자에 대한 정보는 초기화 될 것이다. 이걸 해결하려면 좀 전에 추가한 사용자에 대한 정보를 /etc/passwd, /etc/shadow에서 복사해서 호스트에서 구축하는 램디스크에 동일한 파일에 동일한 내용으로 추가해 주면 된다.
      • /etc/services, /etc/protocols, /etc/securetty 파일이 존재 하는지 확인, 없으면 호스트에 있는 파일들을 타겟에 넣어준다.
      • /etc/securetty 파일 안에 아래와 같은 내용을 넣어준다.
        • ttyS0
        • ttyS1
        • ttyS2
        • ttyS3
        • tty1
        • tty2
        • tty3
        • tty4
        • pts/0
        • pts/1
        • pts/2
        • pts/3
        • pts/4
        • pts/5
        • pts/6
        • pts/7
        • pts/8
        • pts/9

[S3C6410,Android] tslib 포팅 for Android

안드로이드 상에서 tslib을 이용한 calibration

첨부된 파일 참조

[S3C6410] cs8900 device driver

1. arch/arm/mach-s3c6400/include/mach/map.h에 내용 추가

/* CS8900 */
#define S3C64XX_PA_CS8900       (0x18800000)
#define S3C64XX_VA_CS8900       S3C_ADDR(0x03b00000)

2. arch/arm/mach-s3c6410/mach-smdk6410.c 에 내용 추가

struct map_desc smdk6410_iodesc[] = {
        {
                .virtual        = (unsigned long)S3C64XX_VA_CS8900,
                .pfn            = __phys_to_pfn(S3C64XX_PA_CS8900),
                .length         = SZ_4K,
                .type           = MT_DEVICE,
        },
};

3. 첨부 파일 사용 
4. 인터럽트, 어드레스 같은 보드 특성 값은 재설정
prev 1 ··· 4 5 6 7 8 9 10 ··· 12 next