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