2015年8月14日金曜日

Qiita

プログラミング/技術系のTipsは、Qiitaにメモしていきます。

2015年3月25日水曜日

おかげさまで Xperia Z1f + MVNO SIMでテザリングできた!
( ..)φメモメモ

root不要でsettings.dbを編集する方法
テザリング制限を解除したいときは
開発者向けオプションでUSBデバッグを有効にして
コマンドプロンプトで
adb shell
settings put global tether_dun_required 0
と一行ずつ入力します。
ドコモXperiaのMVNOでのテザリング制限の解除にも使えるのでは無いでしょうか。

2015年2月25日水曜日

Symbolic Links With Vagrant Windows

Windowsのvagrantでsymlinkは、ほぼ使えないと言っても過言ではない。ド嵌る前にメモ。
http://blog.rudylee.com/2014/10/27/symbolic-links-with-vagrant-windows/

2015年1月25日日曜日

Docker Network Configuration

Dockerのネットワーク構成のメモ。

(1) Docker Host
dockerdを起動すると、docker用のローカルインタフェースdocker0ができる。適当なアドレス空間、この場合172.17.0.0/16が割り当てられる。
containerを起動すると各コンテナ毎に仮想ethインタフェースveth(この場合veth88b6e5a)ができる。
$ ifconfig -a
docker0 Link encap:Ethernet HWaddr 56:84:7a:fe:97:99
inet addr:172.17.42.1 Bcast:0.0.0.0 Mask:255.255.0.0
inet6 addr: fe80::5484:7aff:fefe:9799/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:38 errors:0 dropped:0 overruns:0 frame:0
TX packets:34 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:2466 (2.4 KB) TX bytes:2572 (2.5 KB)
......
veth88b6e5a Link encap:Ethernet HWaddr 9e:fa:9d:17:c9:47
inet6 addr: fe80::9cfa:9dff:fe17:c947/64 Scope:Link
UP BROADCAST RUNNING MTU:1500 Metric:1
RX packets:24 errors:0 dropped:0 overruns:0 frame:0
TX packets:28 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:1866 (1.8 KB) TX bytes:2108 (2.1 KB)
$ netstat -r
Kernel IP routing table
Destination Gateway Genmask Flags MSS Window irtt Iface
default 10.0.2.2 0.0.0.0 UG 0 0 0 eth0
10.0.2.0 * 255.255.255.0 U 0 0 0 eth0
172.17.0.0 * 255.255.0.0 U 0 0 0 docker0


(2) Docker Container
docker0のネットワーク(172.17.0.0/16)につながるインタフェースeth0がみえる。
root@1365d04a68c9:/# ip addr
1: lo: mtu 65536 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
9: eth0: mtu 1500 qdisc noqueue state UP
link/ether 02:42:ac:11:00:04 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.4/16 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::42:acff:fe11:4/64 scope link
valid_lft forever preferred_lft forever

root@1365d04a68c9:/# ip route
default via 172.17.42.1 dev eth0 

172.17.0.0/16 dev eth0  proto kernel  scope link  src 172.17.0.4

(3) Communication btw Containers
Container間で通信を行うためには

  • EXPOSEでポートを公開する。
  • --link container_name:aliase でIPアドレス、ポート情報を取得できるようにする

外部から通信を行うためには-p host_port:container_portを使って、ホスト側のポートをContainerにマップする





2014年6月22日日曜日

markdownでスライド作成

Mac上でのスライドを作る必要に迫られて、impress.jsいじってみたものの「生html,生css無理」
ということでmarkdownでちゃっちゃとできないか調べてみた結果、rubyで動くslideshowを採用!
これでimpress.jsの悪夢から解放される...

2014年2月23日日曜日

Logitec LAN-W150N/U2ABをBeagleboard Ubuntuで使う

LAN-W150N/U2ABはMediaTek (Ralink)のRT2870を使っている。これならubuntu13.10入れたBeagleBoardに挿すだけで使えると思ったけれども、挿してもwlan0が現れない。ということで、顛末をメモ。
(1) vendor ID, product IDを確認。
$ lsusb
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 002: ID 0789:0168 Logitec Corp. LAN-W150N/U2 Wireless LAN Adapter
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

(2) rt2800usbドライバに認識させるよう new_id に登録してみる。
# modprobe rt2800usb
# echo "0789 0168" > /sys/bus/usb/drivers/rt2800usb/new_id

(3) 動いた!ということでconfigファイルを作っておく。起動時にrt2800usbをロードするようにしておく。
$ cat /etc/modprobe.d/lan-w150nu2.conf
install rt2800usb /sbin/modprobe --ignore-install rt2800usb; /bin/echo "0789 0168" > /sys/bus/usb/drivers/rt2800usb/new_id
$ cat /etc/modules
rt2800usb


2009年9月26日土曜日

DVD ripping on Linux

Linux上でDVDをリッピングする方法のメモ。
(1) DVDを/mntにmountして
$ vobcopy -m -i/mnt
カレントディレクトリ以下にVIDEO_TS以下がコピーされる。
(2) VLCであればコピーしたディレクトリを直接再生可能。
(3) DVDにもう一度書き込むのであれば,ISOファイルを作成する。
$ mkisofs -dvd-video -o dvd_img.iso ./DVD_DIR
(4) PS3(or iPod, PSP)用に再エンコードをするのであれば,HandBrakeを使う。字幕はエンコード時に映像に埋め込まれるのでHandBrakeのオプション-Nで埋め込む字幕を選択しておく。
$ HandBrakeCLI -Z PS3 -L -N jpn -i ./DVD_DIR -o ./out.mp4

2009年7月1日水曜日

RFBServer on Cupcake

1.0のソースコードには含まれていたSurfaceFlingerのVNC Server機能をAndroid 1.5へマージしてみた。

RFBServer on cupcake

(1) 1.0 のソースコードから frameworks/base/libs/surfaceflinger/RFBServer.{cpp,h} をコピーする。
(2) 外部から接続できるようRFBServerをすべてのインタフェースにbindするために下記のように変更。
*** RFBServer.cpp       2009-07-12 11:56:19.000000000 +0900
--- RFBServer.cpp.orig 2009-07-12 11:55:46.000000000 +0900
***************
*** 112,119 ****
do {
retry:
if (serverfd < 0) {
! // serverfd = socket_loopback_server(port, SOCK_STREAM);
! serverfd = socket_inaddr_any_server(port, SOCK_STREAM);
if (serverfd < 0) {
if ((errno == EADDRINUSE) && (port < (VNC_PORT+10))) {
LOGW("port %d already in use, trying %d", port, port+1);
--- 112,118 ----
do {
retry:
if (serverfd < 0) {
! serverfd = socket_loopback_server(port, SOCK_STREAM);
if (serverfd < 0) {
if ((errno == EADDRINUSE) && (port < (VNC_PORT+10))) {
LOGW("port %d already in use, trying %d", port, port+1);


(3) 1.0のSurfaceFlinger.cppを参考にVNC処理部分を追加していく。
diff --git a/libs/surfaceflinger/SurfaceFlinger.cpp b/libs/surfaceflinger/Surfac
eFlinger.cpp
index c2adf07..030a8e9 100644
--- a/libs/surfaceflinger/SurfaceFlinger.cpp
+++ b/libs/surfaceflinger/SurfaceFlinger.cpp
@@ -55,6 +55,7 @@
#include "LayerBitmap.h"
#include "LayerOrientationAnim.h"
#include "OrientationAnimation.h"
+#include "RFBServer.h"
#include "SurfaceFlinger.h"
#include "VRamHeap.h"

@@ -64,6 +65,11 @@

#define DISPLAY_COUNT 1

+// the VNC server even on local ports presents a significant
+// thread as it can allow an application to control and "see" other
+// applications, de-facto bypassing security permissions.
+#define ENABLE_VNC_SERVER 1
+
namespace android {

// ---------------------------------------------------------------------------
@@ -455,6 +461,9 @@ status_t SurfaceFlinger::readyToRun()
if (mDebugNoBootAnimation == false)
mBootAnimation = new BootAnimation(this);

+ if (ENABLE_VNC_SERVER)
+ mRFBServer = new RFBServer(w, h, f);
+
return NO_ERROR;
}

@@ -572,6 +581,18 @@ void SurfaceFlinger::postFramebuffer()
debugShowFPS();
}

+ if (UNLIKELY(ENABLE_VNC_SERVER &&
+ mRFBServer!=0 && mRFBServer->isConnected())) {
+ if (!mSecureFrameBuffer) {
+ GGLSurface fb;
+ // backbufer, is going to become the front buffer really soon
+ hw.getDisplaySurface(&fb);
+ if (LIKELY(fb.data != 0)) {
+ mRFBServer->frameBufferUpdated(fb, mInvalidRegion);
+ }
+ }
+ }
+
hw.flip(mInvalidRegion);

mInvalidRegion.clear();

diff --git a/libs/surfaceflinger/SurfaceFlinger.h b/libs/surfaceflinger/SurfaceF
linger.h
index e023182..d18c324 100644
--- a/libs/surfaceflinger/SurfaceFlinger.h
+++ b/libs/surfaceflinger/SurfaceFlinger.h
@@ -40,6 +40,7 @@
#include "CPUGauge.h"
#include "Layer.h"
#include "Tokenizer.h"
+#include "RFBServer.h"

struct copybit_device_t;
struct overlay_device_t;
@@ -348,6 +349,7 @@ private:
sp mGPU;
GLuint mWormholeTexName;
sp mBootAnimation;
+ sp mRFBServer;
nsecs_t mBootTime;

// Can only accessed from the main thread, these members

2009年6月29日月曜日

Android Music App on Beagle Board (3)

SDカードをAndroid上で正しくmountするため,vold他を設定する。

(1) SDカードのパーティション構成
SDカードはBeagleBoard自体のブートにも使用するため以下のようなパーティション構成とする。
/dev/mmcblk0p1  W95 FAT32 (LBA)
/dev/mmcblk0p2 W95 FAT32 (LBA)
/dev/mmcblk0p3 Linux
mmcblk0p1はuBoot, Linux kernel (uImage)を格納したvfat,mmcblk0p2はMusicなどのコンテンツを格納するvfat,mmcblk0p3はubuntuのユーザランド,androidを格納するext2とした。

(2) vold.confの設定
BeagleBoard上のSDは/sys/devices/platform/mmci-omap-hs.0/mmcに見えているので,以下のようにandroidの/system/etc/vold.confを設定する。
## vold configuration file for beagleboard
volume_sdcard {
media_path /devices/platform/mmci-omap-hs.0/mmc_host/mmc0
media_type mmc
mount_point /sdcard
ums_path /devices/platform/usb_mass_storage/lun0
}
(3) voldソースコードの修正
voldはSDカード上の最初に見つかったvfatパーティションを/sdcardにmountしようとするが,それだとBeagleBoardのブート用パーティションがmountされてしまうため,最初のパーティション(mmcblk0p1)をスキップするようvoldのコードを修正する。
diff --git a/vold/volmgr.c b/vold/volmgr.c
index 17c9a49..4aa7397 100644
--- a/vold/volmgr.c
+++ b/vold/volmgr.c
@@ -573,7 +573,12 @@ static int _volmgr_consider_disk_and_vol(volume_t *vol, blk
dev_t *dev)

rc = -ENODEV;
int i;
- for (i = 0; i dev->nr_parts; i++) {
+ /*
+ * 1st partition of mmc is used as boot partition,
+ * so skip this partition from mounting on /sdcard.
+ */
+ // for (i = 0; i dev->nr_parts; i++) {
+ for (i = 1; i dev->nr_parts; i++) {
blkdev_t *part = blkdev_lookup_by_devno(dev->major, (i+1));
if (!part) {
LOGE("Error - unable to lookup partition for blkdev %d:%d", dev->major, (i+1));
これでSDカードのmmcblk0p2が/sdcardにmountされ,Musicアプリから曲の再生ができるようになる。

I/vold    ( 1725): Android Volume Daemon version 2.0
E/vold ( 1725): Unable to chdir to /sys/class/mmc_host/mmc0/slot_name (m)
E/vold ( 1725): Error bootstrapping card '/sys/class/mmc_host/mmc0/slot_name' (m)
I/vold ( 1725): New MMC card 'SD8GB' (serial 1526730553) added @ /devices/platform/mmci-omap-hs.0/mmc_host/mmc0/mmc0:0007
I/vold ( 1725): Disk (blkdev 179:0), 16019456 secs (7822 MB) 3 partitions
I/vold ( 1725): New blkdev 179.0 on media SD8GB, media path /devices/platform/mmci-omap-hs.0/mmc_host/mmc0/mmc0:0007, Dpp 3
I/vold ( 1725): Partition (blkdev 179:1), 240912 secs (117 MB) type 0xc
I/vold ( 1725): New blkdev 179.1 on media SD8GB, media path /devices/platform/mmci-omap-hs.0/mmc_host/mmc0/mmc0:0007, Dpp 2
I/vold ( 1725): Partition (blkdev 179:2), 2120580 secs (1035 MB) type 0xc
I/vold ( 1725): New blkdev 179.2 on media SD8GB, media path /devices/platform/mmci-omap-hs.0/mmc_host/mmc0/mmc0:0007, Dpp 1
I/vold ( 1725): Partition (blkdev 179:3), 13655250 secs (6667 MB) type 0x83
I/vold ( 1725): New blkdev 179.3 on media SD8GB, media path /devices/platform/mmci-omap-hs.0/mmc_host/mmc0/mmc0:0007, Dpp 0
I/vold ( 1725): Evaluating dev '/devices/platform/mmci-omap-hs.0/mmc_host/mmc0/mmc0:0007/block/mmcblk0' for mountable filesystems for '/sdcard'
D/vold ( 1725): Bootstrapping complete

2009年6月22日月曜日

Android Music App on Beagle Board (2)

MusicやContactアプリ等を起動するとacoreがエラーとなる。これはtouchscreenがない場合のres/layoutが存在しないため。
res/layout-finger以下のリソースをres/layout-notouchにコピーすることで回避は可能だが,uinputの使い方を調べるついでにダミーのtouchscreenデバイスを作ってやることで回避してみる。以下のようなコードを実行することで/dev/inputの下にダミーのtouchscreenデバイスが作成される。この状態でchrootでandroidを起動してやればMusic,Contactは普通に使用できるようになる。

#define UINPUT_DEV "/dev/input/uinput"
#define DEV_NAME "Dummy Touch Screen"

static int uinput_fd = 0;

void uinput_touch_init(const char* uinput_dev, const char* dev_name) {
struct uinput_user_dev dev;

uinput_fd = open(uinput_dev, O_WRONLY);
if (uinput_fd <= 0) {
perror("Error opening uinput device.\n");
return;
}
memset(&dev, 0, sizeof(dev));
strcpy(dev.name, dev_name);
write(uinput_fd, &dev, sizeof(dev));

/* touch screen event */
ioctl(uinput_fd, UI_SET_EVBIT, EV_ABS);
ioctl(uinput_fd, UI_SET_ABSBIT, ABS_X);
ioctl(uinput_fd, UI_SET_ABSBIT, ABS_Y);
ioctl(uinput_fd, UI_SET_EVBIT, EV_KEY);
ioctl(uinput_fd, UI_SET_KEYBIT, BTN_TOUCH);

/* register */
ioctl(uinput_fd, UI_DEV_CREATE, 0);
}

int main(int argc, char* argv[]) {
uinput_touch_init(UINPUT_DEV, DEV_NAME);
while(1) {
sleep(60);
}
}

参考:
http://groups.google.co.jp/group/android-porting/browse_thread/thread/f13cb06a4bff0b9
Instead of hacking up the default Google apps, I just added a trivial
fake touchscreen driver using uinput, it only has to register an abs
event uinput device to made Android happy. We use it on our non-
touchscreen Android ports since those apps are easily navigated using
keyboard and trackpad/mouse.
-Matt

2009年6月20日土曜日

Android Music App on Beagle Board (1)

Android on Beagle Board 上で音楽アプリを使えるようにするための手順。
(1) ALSA ドライバをkernelに組み込む。
(2) ALSA関連のプロジェクトをrepoできるようにmydroid/.repo/local_manifest.xmlに以下のプロジェクトを追加してrepo syncする。
<project path="external/alsa-lib" name="platform/external/alsa-lib"/>
<project path="external/alsa-utils" name="platform/external/alsa-utils"/>
<project path="hardware/alsa_sound" name="platform/hardware/alsa_sound"/>

(3) ALSAを有効にするため vendor/embinux/beagle/BoardConfig.mkに以下を追加してmake
#BOARD_USES_GENERIC_AUDIO := true
BOARD_USES_ALSA_AUDIO := true
BUILD_WITH_ALSA_UTILS := true

(4) ビルドされたkernel, androidで起動すると以下のようなエラーが発生する。
adb logcat:
E/ALSALib ( 2204): external/alsa-lib/src/control/control.c:909:(snd_ctl_open_noupdate) Invalid CTL AndroidPlayback
E/AudioHardwareALSA( 2204): Unable to attach mixer to device AndroidPlayback: No such file or directory
E/AudioHardwareALSA( 2204): Unable to attach mixer to device default: No such file or directory
E/ALSALib ( 2204): external/alsa-lib/src/control/control.c:909:(snd_ctl_open_noupdate) Invalid CTL AndroidRecord
E/AudioHardwareALSA( 2204): Unable to attach mixer to device AndroidRecord: No such file or directory
E/AudioHardwareALSA( 2204): Unable to attach mixer to device default: No such file or directory

原因はAudioFlingerが参照するALSAデバイスファイルの位置が/dev/sndではなく/dev直下なため。シンボリックリンクを作成するようinit.rcを修正する。
# setup for alsa snd device
symlink /dev/snd/pcmC0D0c /dev/pcmC0D0c
symlink /dev/snd/pcmC0D0p /dev/pcmC0D0p
symlink /dev/snd/controlC0 /dev/controlC0
symlink /dev/snd/timer /dev/timer
chmod 0777 /dev/pcmC0D0c
chmod 0777 /dev/pcmC0D0p
chmod 0777 /dev/controlC0
chmod 0777 /dev/timer
chown root audio /dev/snd/controlC0
chown root audio /dev/snd/pcmC0D0c
chown root audio /dev/snd/pcmC0D0p
chown root audio /dev/snd/timer
参考:
http://d.hatena.ne.jp/bs-android/20090603/1244043649

2009年6月1日月曜日

embinux Android

embinuxのgit repositryからrepo syncしたAndroidにはTLSパッチがあたっていないようなので,とりあえず以下の修正を入れてAndroidを起動。

diff --git a/libc/private/bionic_tls.h b/libc/private/bionic_tls.h
index da34344..5b8d8fc 100644
--- a/libc/private/bionic_tls.h
+++ b/libc/private/bionic_tls.h
@@ -81,7 +81,9 @@ extern int __set_tls(void *ptr);

/* get the TLS */
#ifdef __arm__
-# define __get_tls() ( *((volatile void **) 0xffff0ff0) )
+/*# define __get_tls() ( *((volatile void **) 0xffff0ff0) )*/
+typedef void* (__get_tls_t) (void);
+static const __get_tls_t* __get_tls = (const __get_tls_t *)0xffff0fe0;
#else
extern void* __get_tls( void );
#endif

diff --git a/opengl/libs/hooks.h b/opengl/libs/hooks.h
index 63fb017..22c7b98 100644
--- a/opengl/libs/hooks.h
+++ b/opengl/libs/hooks.h
@@ -35,7 +35,7 @@
#define MAX_NUMBER_OF_GL_EXTENSIONS 32


-#if defined(HAVE_ANDROID_OS) && !USE_SLOW_BINDING && !GL_LOGGER && __OPTIMIZE__
+#if 0 && defined(HAVE_ANDROID_OS) && !USE_SLOW_BINDING && !GL_LOGGER && __OPTIM
IZE__
#define USE_FAST_TLS_KEY 1
#else
#define USE_FAST_TLS_KEY 0

2009年5月31日日曜日

USB Gadget EthernetとOS X

Linux USB Gadget Ethernetはイーサーネットアドレスをランダムで設定するため,OS Xに繋ぐ度にOS X側のネットワークインタフェース(en?)が増えていってしまう。これを防ぐためにLinux側のg_etherモジュールでMACアドレスを固定的に割り当てるよう以下のように設定する。
$ cat /etc/modprobe.d/options.conf
# assigne fixed MAC addresses
options g_ether host_addr=46:0d:9e:67:69:eb dev_addr=46:0d:9e:67:69:ec
$ cat /etc/network/interfaces
auto lo
iface lo inet loopback

auto usb0
iface usb0 inet static
address 192.168.1.2
netmask 255.255.255.0
gateway 192.168.1.1
$ sudo modprobe g_ether
$ ifconfig usb0
usb0 Link encap:Ethernet HWaddr 46:0d:9e:67:69:ec
inet addr:192.168.1.2 Bcast:192.168.1.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:106 errors:0 dropped:0 overruns:0 frame:0
TX packets:10 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:12842 (12.8 KB) TX bytes:420 (420.0 B)

OS X側に作成されてしまった余分なenインタフェースを削除するためには
/Library/Preferences/SystemConfiguration/NetworkInterfaces.plist
を削除すればよい。

2009年5月24日日曜日

Android VNC Server

SurfaceFlingerのVNC Server機能を使ってみる。
(1) frameworks/base/libs/surfaceflinger/SurfaceFlinger.cppの中のENABLE_VNC_SERVERを有効にしてAndroidをビルドする。
#define ENABLE_VNC_SERVER   1
(2) VNC Serverはローカルにbindされるので外からアクセスできない。"Android VNC Server ?"の投稿に従ってsimple-tcp-proxyを実行する。
$ simple-tcp-proxy 192.168.1.2 5900 127.0.0.1 5900
(3) 192.168.1.2:5900のVNCサーバに接続するとAndroidの画面が表示される。
Android VNC Server
* Android1.5ではこのVNC機能がソースコードより削除された模様……。

2009年5月16日土曜日

Android Linux 2.6.29 for BeagleBoard

EMBINUXで公開されているAndroidのカーネルではHDMI端子に接続したBRAVIAに画面表示することができなかった。DSS2を使えばHDMIから画面表示できることは事前に確認できていたので,ディスプレイドライバにDSS2を使ったBeagle Board用Androidカーネルをビルドすることにする。以下はその手順。

1.  Androidの取得
repo init & sync で Android の master branch をダウンロードする。

2. Android patch の作成
Linux 2.6.29に対してのAndroid修正分の差分patchを作成する。gitを使ってtag 2.6.29とandroid-2.6.29ブランチの差分をとる。
$ cd mydroid/kernel
$ git diff 2.6.29 android-2.6.29 > android_diff-2.6.29.patch

3. Beagle Board用Linuxの取得
 linux-omapのmaster branchを持ってきて,tag  2.6.29-omap を checkoutする。
$ git clone git://git.kernel.org/pub/scm/linux/kernel/git/tmlind/linux-omap-2.6.git linux-omap-2.6
$ cd linux-omap-2.6
$ git checkout -b beagle_android-2.6.29 2.6.29-omap

4. DSS2パッチの適用
2.6.29に対するDSS2パッチをrcn-ee.comより取得・適用する。
$ wget http://www.rcn-ee.com/deb/kernel/beagle/jaunty/v2.6.29-58cf2f1-oer33/v2.6.29-58cf2f1-oer33.diff
$ patch -p1 < v2.6.29-58cf2f1-oer33.diff

5. Android パッチの適用
2.6.29に対するAndroid修正分のパッチを適用する。
$ patch -p1 < android_diff-2.6.29.patch

reject された部分を手で修正(2ファイル)

6. Kernel Build
dss_omap3_beagle_defconfigを元に,menuconfig で Android に必要なカーネルオプションを有効にしてカーネルをビルドする。
$ make ARCH=arm dss_omap3_beagle_defconfig
$ make ARCH=arm menuconfig
$ make CROSS_COMPILE=arm-none-linux-gnueabi- ARCH=arm uImage

7. Androidのビルド
EMBINUXからAndroidをrepo syncしてmakeする。
あとは,BeagleboardUbuntuに従って用意したUbuntu環境にuImageとAndroidを組み合わせればOK

8. その他
* キーボードが効かなかったが,/system/usr/{keylayout,keychars}/のファイルを chmod 666 することで解決。感謝>Android Zaurus

2009年5月9日土曜日

Cut the Zsh Prompt Down to Size

zsh でプロンプトにカレントディレクトリを表示するとき,長いパス名を適当に短くして表示するための設定。
set_rps1() {
DIR=`pwd|sed -e "s|$HOME|~|"`
if [ ${#DIR} -gt 30 ]; then
CurDir=${DIR[1,12]}...${DIR[${#DIR}-15,${#DIR}]};
else
CurDir=$DIR;
fi
RPS1="(${CurDir})"
}
precmd() {
set_rps1
}

.zshrcに設定しておくと,以下のような表示になる。
nishio@macBook[1]$                                                       (~)
nishio@macBook[2]$ cd /opt/codesourcery/libexec/gcc/arm-none-linux-gnueabi/
nishio@macBook[3]$ (/opt/codesou...ne-linux-gnueabi)

参照:Customizing the Terminal: The Prompt

2009年2月14日土曜日

x86 Android のネットワーク設定

1. 固定アドレスでネットワーク接続
以下の設定をしてインストーライメージを作成,インストールする。
vendor/asus/eee_701/init.eee_701.sh で eth0 を設定する。
vendor/asus/eee_701/init.rcでadbdを起動する。
diff --git a/init.eee_701.sh b/init.eee_701.sh
index 2891d24..3c4ee3c 100755
--- a/init.eee_701.sh
+++ b/init.eee_701.sh
@@ -3,8 +3,9 @@
# no sleep!
echo EeeNoSleep > /sys/android_power/acquire_partial_wake_lock

-netcfg eth0 dhcp
-setprop net.dns1 4.2.2.2
+ifconfig eth0 172.16.38.10 netmask 255.255.255.0 up
+route add default gw 172.16.38.1 dev eth0
+setprop net.dns 172.16.38.1

## For wifi, we'll need this:

diff --git a/init.rc b/init.rc
index 00aa93c..7437f30 100644
--- a/init.rc
+++ b/init.rc
@@ -179,7 +179,7 @@ service console /system/bin/sh

# adbd is controlled by the persist.service.adb.enable system property
service adbd /sbin/adbd
- disabled
+ start adbd

on property:persist.service.adb.enable=1
start adbd
2. DHCPでネットワーク接続
DHCPが使用するPacket socket (CONFIG_PACKET) を組み込んだカーネルでインストーライメージを作成,インストールする。

x86android & adb

2009年1月22日木曜日

x86 Android on VMWare

1. Android Master Branch の取得
repo init & sync で Android の master branch をダウンロードする。

2. EeePC701 project の取得
local manifest を編集、repo syncして、ASUS Eee PC 701 用の project を
ダウンロードする。
$ cat ./.repo/local_manifest.xml
<manifest>
<project name="platform/vendor/asus/eee_701" path="vendor/asus/eee_701"/>
</manifest>
3. x86 kernel の Build
(1) VESA FB、PCNET32をサポートした kernel をコンパイルする。
./vendor/asus/eee_701/kernel/kernel.config を元にして
$ cp ./vendor/asus/eee_701/kernel.confg kernel/.config
$ cd ./kernel; make menuconfig
$ make bzImage
(2) build した kernel を ./vendor/asus/eee_701 にある precompiled
kernel と置き換える。
$ cp ./kernel/arch/x86/boot/bzImage ./vendor/asus/eee_701/kernel
(3) kernel の起動オプションに vga=788 を加えるために BoardConfig.mk を
編集する。
$ vi ./vendor/asus/eee_701/BoardConfig.mk
...
BOARD_KERNEL_CMDLINE := vga=788 console=tty0 console=ttyS1,115200n8 console=tty0 androidboot.hardware=eee_701
...

4. x86 Android の Build
(1) x86 ターゲットの Android の installer を build する。
$ TARGET_ARCH=x86 TARGET_PRODUCT=eee_701 DISABLE_DEXPREOPT=true make installer_img
(2) build 結果の確認
$ ls  ./out/target/product/eee_701/
boot.img grub/ kernel root/ system.img
clean_steps.mk installer/ obj/ symbols/ userdata.img
data/ installer.img ramdisk.img system/

5. VMWare への install
(1) installer disk imageの作成
installer.vmdk ファイルを作成する。
Extent description のサイズ値は「installer.img のサイズ/512」とする。
# Disk DescriptorFile
version=1
CID=b01deebc
parentCID=ffffffff
createType="monolithicFlat"
# Extent description
RW 799902 FLAT "installer.img" 0
# The Disk Data Base
#DDB
ddb.virtualHWVersion = "4"
ddb.geometry.cylinders = "49"
ddb.geometry.heads = "255"
ddb.geometry.sectors = "63"
ddb.adapterType = "ide"
ddb.toolsVersion = "0"
QEMUに付属のqemu-imgコマンドが利用できればより簡単に作成可能。
$ qemu-img convert installer.img -O vmdk installer.vmdk
(2) インストール先の仮想ディスクの作成
インストール先となる仮想ディスク(2GB程度)のvmdkを作成する。QEMUに付属のqemu-imgコマンドが利用できれば下記の通りで作成可能。
$ qemu-img create -f vmdk android.vmdk 2G
(3) VMWare 上での IDE ディスクの設定
IDE primary master にandroid.vmdkを,
IDE primary slave に installer.vmdk を設定

(4) installer disk での起動
BIOS 設定で IDE primary slave から VM を起動するとインストールが始まる。
"Successfully configured 6 images." と出てインストールは終了。

(5) Android の起動
VM を再起動して IDE primary master から Android を起動。

References
  • "Howto build Android full source for X86 Architecture like EeePC(ASUS)" http://groups.google.com/group/android-porting/msg/fe85782f1bc3ad2f?hl=en
  • http://d.hatena.ne.jp/androidzaurus/20081230/1230610811

x86android

2008年9月2日火曜日

Cortex M3開発環境 on Mac OS X

Design Wave 2008年5月号STM32基板の開発環境をできるだけ簡単にOS X上に構築する。

(1) クロスコンパイラ
CodeSourceryのGNU Toolchainをコンパイルするのが手っ取り早そうだが,コンパイルすら面倒ということでdevkitARMのOS X版を使うことに。幸いrelease 23bのgccは4.3.0なのでcortex-m3に対応している。

(2) プロジェクトテンプレートの作成
以下の構成のディレクトリを作成する。
$ ls ./gcc_template
FWLib/ USBLib/ ld_script/ src/
Makefile include/ lib/

(3) Firmware Library, USB Library
Design Wave 2008年5月号付属CD-ROM,あるいはSTMicroからダウンロードできるFirmware Library, USB LibraryをFWLib, USBLibディレクトリの下にコピーする。
$ ls -R ./gcc_template/{FWLib,USBLib}
./gcc_template/FWLib:
library/

./gcc_template/FWLib/library:
inc/ src/

./gcc_template/FWLib/library/inc:
cortexm3_macro.h stm32f10x_i2c.h stm32f10x_spi.h
stm32f10x_adc.h stm32f10x_iwdg.h stm32f10x_systick.h
stm32f10x_bkp.h stm32f10x_lib.h stm32f10x_tim.h
stm32f10x_can.h stm32f10x_map.h stm32f10x_tim1.h
stm32f10x_dma.h stm32f10x_nvic.h stm32f10x_type.h
stm32f10x_exti.h stm32f10x_pwr.h stm32f10x_usart.h
stm32f10x_flash.h stm32f10x_rcc.h stm32f10x_wwdg.h
stm32f10x_gpio.h stm32f10x_rtc.h

./gcc_template/FWLib/library/src:
stm32f10x_adc.c stm32f10x_i2c.c stm32f10x_spi.c
stm32f10x_bkp.c stm32f10x_iwdg.c stm32f10x_systick.c
stm32f10x_can.c stm32f10x_lib.c stm32f10x_tim.c
stm32f10x_dma.c stm32f10x_nvic.c stm32f10x_tim1.c
stm32f10x_exti.c stm32f10x_pwr.c stm32f10x_usart.c
stm32f10x_flash.c stm32f10x_rcc.c stm32f10x_wwdg.c
stm32f10x_gpio.c stm32f10x_rtc.c

./gcc_template/USBLib:
library/

./gcc_template/USBLib/library:
inc/ src/

./gcc_template/USBLib/library/inc:
usb_core.h usb_init.h usb_lib.h usb_regs.h
usb_def.h usb_int.h usb_mem.h usb_type.h

./gcc_template/USBLib/library/src:
usb_core.c usb_init.c usb_int.c usb_mem.c usb_regs.c

(4) プログラムスケルトン
付属CD-ROMの「STM32F10xxxのサンプル・プログラムおよびマニュアル/STM32F10xFWLib/FWLib/project」および「STM32F10xxxのサンプル・プログラムおよびマニュアル/STM32F10xFWLib/FWLib/project/RIDE」からプログラムスケルトンとなるソースファイルを./gcc_template/{src,include}にコピーする。
$ ls ./gcc_template/{src,include}
./gcc_template/include:
stm32f10x_conf.h stm32f10x_it.h usb_conf.h

./gcc_template/src:
cortexm3_macro.s stm32f10x_it.c
main.c stm32f10x_vector.c


(5) リンカスクリプト
Design Wave 2008年6月号のJTAGデバッガ自作記事のデータをダウンロードする。ダウンロードしたdata.zipを展開してdata/CQ/ARM_OCD_myJTAG/workspace/LED/ld_scriptにあるリンカスクリプトを./gcc_template/ld_scriptへコピーする。
$ ls ./gcc_template/ld_script
STM32_128K_20K_FLASH.ld STM32_SEC_RAM.ld
STM32_COMMON.ld STM32_SEC_RAMonly.ld
STM32_SEC_EXT.ld stm32.ld
STM32_SEC_FLASH.ld

また,DFU領域を書き潰さないようにstm32.ldを以下のように修正しておく。
9c9
< INCLUDE "./ld_script/STM32_COMMON.ld"
---
> INCLUDE "../ld_script/STM32_COMMON.ld"
15,16c15,16
< /* FLASH (rx) : ORIGIN = 0x8000000, LENGTH = 128K */
> FLASH (rx) : ORIGIN = 0x8003000, LENGTH = 128K - 12K
---
< FLASH (rx) : ORIGIN = 0x8000000, LENGTH = 128K
> /*FLASH (rx) : ORIGIN = 0x8003000, LENGTH = 128K - 12K */
29c29
< INCLUDE "./ld_script/STM32_SEC_FLASH.ld"
---
> INCLUDE "../ld_script/STM32_SEC_FLASH.ld"


(6) Thum2ライブラリ
data/CQ/ARM_OCD_myJTAG/workspace/LED/lib_thumb2にあるThumb2でコンパイルされたライブラリを./gcc_template/libへコピーする。
$ ls ./gcc_template/lib
libc.a libgcc.a libiberty.a
libg.a libgcov.a libm.a

また,data/CQ/ARM_OCD_myJTAG/workspace/LED/src/syscalls.cを./gcc_template/srcへコピーしておく。

(7) Makefile
以下の内容でmakefileを作成する。
###
### Makefile for STM32F10x Cortex-M3
###

PROG = target

SRCDIR = ./src
CFILES = ${SRCDIR}/main.c \
${SRCDIR}/stm32f10x_vector.c \
${SRCDIR}/stm32f10x_it.c
SFILES = ${SRCDIR}/cortexm3_macro.s

CC = arm-eabi-gcc
AS = arm-eabi-as
AR = arm-eabi-ar
LD = arm-eabi-ld
OBJCOPY = arm-eabi-objcopy

CFLAGS = -mcpu=cortex-m3 -mthumb -Wall -g -O2
ASFLAGS = -mthumb
LDFLAGS = --cref -gc-sections -Map=${PROG}.map -T ld_script/stm32.ld -L ./lib

INCLUDES = -I./include -I./FWLib/library/inc -I./USBLib/library/inc

# Firmware Library source files
FWLIBDIR = ./FWLib/library/src
FWLIBFILES = \
${FWLIBDIR}/stm32f10x_adc.c\
${FWLIBDIR}/stm32f10x_bkp.c\
${FWLIBDIR}/stm32f10x_can.c\
${FWLIBDIR}/stm32f10x_dma.c\
${FWLIBDIR}/stm32f10x_exti.c\
${FWLIBDIR}/stm32f10x_flash.c\
${FWLIBDIR}/stm32f10x_gpio.c\
${FWLIBDIR}/stm32f10x_i2c.c\
${FWLIBDIR}/stm32f10x_iwdg.c\
${FWLIBDIR}/stm32f10x_lib.c\
${FWLIBDIR}/stm32f10x_nvic.c\
${FWLIBDIR}/stm32f10x_pwr.c\
${FWLIBDIR}/stm32f10x_rcc.c\
${FWLIBDIR}/stm32f10x_rtc.c\
${FWLIBDIR}/stm32f10x_spi.c\
${FWLIBDIR}/stm32f10x_systick.c\
${FWLIBDIR}/stm32f10x_tim.c\
${FWLIBDIR}/stm32f10x_tim1.c\
${FWLIBDIR}/stm32f10x_usart.c\
${FWLIBDIR}/stm32f10x_wwdg.c

# USB Library source files
USBLIBDIR = ./USBLib/library/src
USBLIBFILES = \
${USBLIBDIR}/usb_core.c\
${USBLIBDIR}/usb_init.c\
${USBLIBDIR}/usb_int.c\
${USBLIBDIR}/usb_mem.c\
${USBLIBDIR}/usb_regs.c

OBJS = ${CFILES:.c=.o} ${SFILES:.s=.o}
LIBOBJS = ${FWLIBFILES:.c=.o} ${USBLIBFILES:.c=.o}

.SUFFIXES: .c .s .o

.c.o:
${CC} ${CFLAGS} ${INCLUDES} -c $< -o $@

.s.o:
${AS} ${ASFLAGS} $< -o $@

all: ${PROG}.s19

./lib/libstm32.a : ${LIBOBJS}
${AR} cr $@ ${LIBOBJS}

${PROG}.elf : ${OBJS} ./lib/libstm32.a
${LD} ${LDFLAGS} ${OBJS} -lstm32 -o $@

${PROG}.s19: ${PROG}.elf
$(OBJCOPY) -O srec ${PROG}.elf ${PROG}.s19

${PROG}.hex: ${PROG}.elf
$(OBJCOPY) -O ihex ${PROG}.elf ${PROG}.hex

clean :
rm -rf ${OBJS} ${LIBOBJS} ${PROG}.elf ${PROG}.s19 ${PROG}.hex ${PROG}.map ./lib/libstm32.a

2008年5月8日木曜日

gpSP 改のインストール

GBAエミュレータgpSP改をPSPへインストールしてみたので手順をメモ。

GBA BIOSの吸い出し
まず,GBA本体からBIOSを吸い出す。吸い出しに必要な
  1. USBケーブル (Flash2AdvanceのUSB Linkerを使用)
  2. FlashManager for GBA
  3. FM3_Debug - BIOS吸い出しプログラム
を用意。吸い出し手順は以下の通り。
  1. FlashManagerを起動してGBAとリンクさせる
  2. GBAデバッグモードにする
  3. デバッグモードで「実行」ボタンを押すとプログラム選択画面となるのでFM3_Debug.binを選択
  4. [A+START]ボタンでBIOS吸い出しを開始
  5. 吸い出されたBIOSイメージはbios.binに保存される
gpSPのインストール
吸い出したBIOSイメージとゲームのROMイメージを用意してPSPのメモリースティックに必要なファイルをコピーする。
  1. gpSP改のページからgpsp.zipを入手,展開。
  2. BIOSイメージを./gpsp/gba_bios.binの名前で置く。
  3. GBA ROMファイル xxx.gba を ./gpsp/GBA/ROM/xxx.gbaに置く。saveファイルがあれば ./gpsp/GBA/SAV/xxx.savに。
  4. gpsp以下をCustomFirmware化されたPSPのms0:/PSP/GAME150/gpspへコピー。