odroid7 kernel을 준비 한다.
http://com.odroid.com/sigong/nf_file_board/nfile_board_view.php?keyword=&bid=41
아래 경로에서 kernel 소스를 다운 받는다.
https://github.com/Kwiboo/kernel_samsung_crespo/tree/master/drivers/gpu
drivers/gpu 폴더을 odroid7 kernel에 덮어쓴다.
git로 부터 최신 android 소스를 받는다.
repo init -u https://android.googlesource.com/platform/manifest -b android-4.0.1_r1.2
repo sync
아래 링크에서 odroid7으로 빌드가 가능한도록 수정한 폴더들을 받아 device와 vendor를 덮어쓴다.
http://dl.dropbox.com/u/4485660/ICS.tar.gz
vendor의 파일들은 아래 링크에서 받은 Nexus S의 ICS ROM에서 얻은 것 들이다.
http://www.multiupload.com/F0F156G363
crespo project를 지운다.
rm -rf device/samsung/crespo*
chmod u+x device/hardkerenl/odroid7/build_android.sh
안드로이드를 빌드한다.
device/hardkerenl/odroid7/build_android.sh
build가 완료되면 odroid-7 처럼 f-flash에 복사하고 zImage와 ramdisk-uboot.img를 fastboot로 write한다.
아래 소스를 고치면 마우스 없이 touch까지 가능합니다.
kernel/drivers/input/touchscreen/odroid7_MT_touch_portrait.c
169 input_sync(hkc1xx_touch.driver);
170
171 //codewalker
172 input_mt_sync(hkc1xx_touch.driver);
173
174 input_sync(hkc1xx_touch.driver);
175
176
177 #if defined(DEBUG_HKC1XX_TOUCH_MSG)
178 printk("%s : Penup event send[x = %d, y = %d]\n", __FUNCTION__, hkc1xx_touch.x, hkc1xx_touch.y);
179 #endif
소리가 나오게 하는 방법은 ICS ROM에서 두 파일을 odroid7으로 이름을 바꿔서 넣어 주시면 됩니다.
/system/lib/hw/audio.primary.herring.so 를 audio.primary.odroid7.so
/system/lib/hw/audio_policy.herring.so 를 audio_policy.odroid7.so
wifi 가능 하도록 수정 방법
device/hardkernel/odroid7/BoardConfigCommon.mk
71 #WIFI_DRIVER_MODULE_ARG := "firmware_path=/vendor/firmware/fw_bcm4329.bin nvram_path=/vendor/firmware/nvram_net.txt iface_name=wlan" 72 WIFI_DRIVER_MODULE_ARG := "iface_name=wlan firmware_path=/vendor/firmware/fw_bcm4329.bin nvram_path=/vendor/firmware/nvram"
71 #WIFI_DRIVER_MODULE_ARG := "firmware_path=/vendor/firmware/fw_bcm4329.bin nvram_path=/vendor/firmware/nvram_net.txt iface_name=wlan" 72 WIFI_DRIVER_MODULE_ARG := "iface_name=wlan firmware_path=/vendor/firmware/fw_bcm4329.bin nvram_path=/vendor/firmware/nvram"
WIFI_DRIVER_MODULE_ARG를 수정하고 odroid7dml fw_bcm4329.bin, nvram을 해당 위치에 복사합니다.
hardware/libhardware_legacy/wifi/wifi.c
102 103 #define WIFI_WAKEUP_CTL_FP "/sys/devices/platform/hkc1xx-sysfs/wifi_wakeup" // 1 -> wakeup on 104 #define WIFI_REG_CTL_FP "/sys/devices/platform/hkc1xx-sysfs/wifi_reg" // 1 -> reg on 105 #define WIFI_RESET_CTL_FP "/sys/devices/platform/hkc1xx-sysfs/wifi_reset" // 1 -> reset on 106 107 int wifi_set_module_status (char *ctl_fp, unsigned char status); 108 int wifi_get_module_status (char *ctl_fp); 109 110 111 static int insmod(const char *filename, const char *args) 112 {
206 int wifi_load_driver() 207 { 208 #ifdef WIFI_DRIVER_MODULE_PATH 209 char driver_status[PROPERTY_VALUE_MAX]; 210 int count = 100; /* wait at most 20 seconds for completion */ 211 212 if (is_wifi_driver_loaded()) { 213 return 0; 214 } 215 216 // Wifi power control & wakeup enable 217 wifi_set_module_status(WIFI_WAKEUP_CTL_FP, 1); usleep(10000); 218 wifi_set_module_status(WIFI_REG_CTL_FP, 1); usleep(10000); 219 wifi_set_module_status(WIFI_RESET_CTL_FP, 1); sleep(1); sync(); 220 221 222 if (insmod(DRIVER_MODULE_PATH, DRIVER_MODULE_ARG) < 0) { 223 LOGE("insmod(DRIVER_MODULE_PATH = %s, DRIVER_MODULE_ARG = %s) FAIL!!!", DRIVER_MODULE_PATH, DRIVER_MODULE_ARG); 224 wifi_set_module_status(WIFI_WAKEUP_CTL_FP, 0); usleep(10000); 225 wifi_set_module_status(WIFI_REG_CTL_FP, 0); usleep(10000); 226 wifi_set_module_status(WIFI_RESET_CTL_FP, 0); sleep(1); sync(); 227 return -1; 228 } 229 230 if (strcmp(FIRMWARE_LOADER,"") == 0) {
259 int wifi_unload_driver() 260 { 261 usleep(200000); /* allow to finish interface down */ 262 #ifdef WIFI_DRIVER_MODULE_PATH 263 if (rmmod(DRIVER_MODULE_NAME) == 0) { 264 int count = 20; /* wait at most 10 seconds for completion */ 265 while (count-- > 0) { 266 if (!is_wifi_driver_loaded()) 267 break; 268 usleep(500000); 269 } 270 271 wifi_set_module_status(WIFI_WAKEUP_CTL_FP, 0); usleep(10000); 272 wifi_set_module_status(WIFI_REG_CTL_FP, 0); usleep(10000); 273 wifi_set_module_status(WIFI_RESET_CTL_FP, 0); sleep(1); sync(); 274 275 276 usleep(500000); /* allow card removal */ 277 if (count) { 278 return 0;
int wifi_set_module_status(char *ctl_fp, unsigned char status) { int fd, ret, nwr; char buf[10]; if((fd = open(ctl_fp, O_RDWR)) < 0) { LOGE("%s(%s) : Cannot access \"%s\"", __FILE__, __FUNCTION__, ctl_fp); return -1; // fd open fail } memset((void *)buf, 0x00, sizeof(buf)); if(status) nwr = sprintf(buf, "%d\n", 1); else nwr = sprintf(buf, "%d\n", 0); ret = write(fd, buf, nwr); close(fd); if(ret == nwr) { LOGI("%s : write success (on = %d)", ctl_fp, status); return 0; } else { LOGE("%s : write fail (on = %d)", ctl_fp, status); return -1; } } //---------------------------------------------------------------------------------------------------------------- int wifi_get_module_status(char *ctl_fp) { int fd, ret, nrd; char buf[10]; if((fd = open(ctl_fp, O_RDONLY)) < 0) { LOGE("%s(%s) : Cannot access \"%s\"", __FILE__, __FUNCTION__, ctl_fp); return -1; // fd open fail } memset((void *)buf, 0x00, sizeof(buf)); nrd = read(fd, buf, sizeof(buf)); close(fd); // read ok if(nrd) { if(!strncmp(buf, "1", 1)) { LOGI("%s : status == 1", ctl_fp); return 1; // wakeup } else { LOGI("%s : status == 0", ctl_fp); return 0; // suspend } } LOGI("%s(%s) : module status == unknown", __FILE__, __FUNCTION__); return -1; } //---------------------------------------------------------------------------------------------------------------- int wifi_module_wakeup_status() { int fd, ret, nrd; char buf[10]; if((fd = open(WIFI_WAKEUP_CTL_FP, O_RDONLY)) < 0) { LOGE("%s(%s) : Cannot access \"%s\"", __FILE__, __FUNCTION__, WIFI_WAKEUP_CTL_FP); return -1; // fd open fail } memset((void *)buf, 0x00, sizeof(buf)); nrd = read(fd, buf, sizeof(buf)); close(fd); // read ok if(nrd) { if(!strncmp(buf, "1", 1)) { LOGI("%s(%s) : module status == wakeup", __FILE__, __FUNCTION__); return 1; // wakeup } else { LOGI("%s(%s) : module status == suspend", __FILE__, __FUNCTION__); return 0; // suspend } } LOGI("%s(%s) : module status == unknown", __FILE__, __FUNCTION__); return -1; } //---------------------------------------------------------------------------------------------------------------- int wifi_module_wait_time(int waitTime) { LOGI("%s(%s) : module wait time = %d sec", __FILE__, __FUNCTION__, waitTime); sleep(waitTime); sync(); return 0; }
위와 같이 수정 하고 libhardware_legacy.so를 넣습니다.
bcm4329.ko는 kernel에서 make modules로 만들어 넣습니다.
market 사용
gapps는 아래 파일에서 받았습니다.
위에 system을 adb push로 밀어 넣으면 몇개 중복되는 apk가 존재하여 문제가 발생합니다.
그래서 중복되는 apk를 삭제하여 묶었습니다.
http://dl.dropbox.com/u/4485660/gapps-ics-20111122-full-blade_codewalker.tar.gz
android-4.0.3_r1(IML74k) 올려 봤습니다.
gps
odroid-7 gingerbread의 gps library를 드대로 사용하니 gps도 동작하네요.
int.rc에 gps 노드만 바꾸면 됩니다.
29 chown gps root /sys/class/sec/gps/GPS_PWR_EN/value
30 chmod 660 /sys/class/sec/gps/GPS_PWR_EN/value
31
32 #===================================================================
33 #
34 # Odroid GPS Device name Setting
35 #
36 #===================================================================
37 setprop ro.kernel.android.gps s3c2410_serial1
38 chmod 0666 /dev/s3c2410_serial1
39
40
41 on fs
42 mkdir /efs 0775 radio radio
가속 센서 역시 odroid7의 orientationd, geomagneticd, sensors.odroid7.so를 그대로 사용하니 동작 합니다.
지자기 센서는 역시 동작하지 않네요.
앞에서 추가적으로 수정된 내용은 ICS.tar.gz에 계속 반영 됩니다.