ラベル linux の投稿を表示しています。 すべての投稿を表示
ラベル linux の投稿を表示しています。 すべての投稿を表示

2011年5月17日火曜日

debian環境の設定メモ

Debian環境でMono/CLIを導入に関するメモ
http://mono-project.com/DistroPackages/Debian

・インストール方法(lenny)
source.list
>deb http://backports.debian.org/debian-backports main

>aptitude update
>aptitude -t lenny-backports install mono-complete

・非公式版
source.list
>deb http://debian.meebey.net/pkg-mono /



あとSSHの設定方法メモ
 http://mono-project.com/DistroPackages/Debian

・インストール方法
>aptitude install ssh

sshd_config
/etc/ssh/sshd_configを開き

PermitRootLogin yes /rootでログインできるようにする
AuthorizedKeyFile %h/.ssh/authorized_keys コメントを外す

# 必要があれば特定ユーザのみログインできるようにする
# DenyUsers ALL
# Allowusers etch

sshアクセス範囲を内部限定にする
/etc/hosts.allow
ALL: 127.0.0.1
sshd: 192.168.

/etc/hosts.deny
sshd: ALL

2011年5月16日月曜日

LinuxでUSB制御(検討編)

Linuxボードがあります。
シリアルポートや、USBポートがあるから制御に使うのが筋ってもの。

しかしどうやって使うの?ドライバーは?という疑問が多々あるので、
今回は導入前の検討編。

1.インストール
 libusbをインストールする。(Debian系列ではusbutils)

2.USB機器を接続して、「lsusb」ベンダIDを調べる。
 Bus 001 Device 001: ID 0123:4567

  ベンダID : 0123
  プロダクトID : 4567

3.サンプルソース(送受信周りがまだ未完成)
#include 

static struct usb_bus *m_bus;
static struct usb_device *m_dev;
static usb_dev_handle *m_dh;



static int USBopen()
{
 usb_init();
 usb_find_busses();
 usb_find_devices();

 /* search target device */
 for (m_bus = usb_get_busses(); m_bus; m_bus = m_bus->next) {
  for (m_dev = m_bus->devices; m_dev; m_dev = m_dev->next) {
   if ((VENDOR_ID == m_dev->descriptor.idVendor) && (PRODUCT_ID == m_dev->descriptor.idProduct)) {
    return (NULL != (m_dh = usb_open(m_dev)))? 1 : -2;
   }
  }
 }
 return -1;
}



//送受信
//アクセスするUSBデバイスの「bmRequestType」や「bRequest」、「wValue」、「wIndex」、「wLength」などとエンドポイントなどを調べておく必要がある。
unsigned char msg[8];
int result=usb_control_msg(dh, bmRequestType, bRequest, wValue, wIndex, msg, sizeof(msg), timeout);
if(result<0){printf ("Control message error. (%s)\n", usb_strerror());}


//read
#define USBclose() usb_close(dh);
#define USBread(readbuf, bytes, timeout) usb_bulk_read(dh, end_point, readbuf, bytes, timeout)


void test(){
 USBOpen();
 USBread(readbuf, bytes, timeout);
 USBClose();
}
4.コンパイル
 cc -o test test.c -I/usr/include/ -L/usr/lib/ -lusb


参考URL
http://penguin.tantin.jp/hard/libusb%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6.html
http://bake-san.com/usb004.htm
http://blog.livedoor.jp/eru_at/archives/1262118.html

2011年5月11日水曜日

LinuxでBASIC言語を使う

今回、組込みボードであるMini6410を購入したので、
あまり触れられてない事をしようと思って、元祖BASICを動かせる環境を構築してみた。

BASICと聞けば、Visual BASICと答える人が大半を占めると思いますが、、
元祖インタプリタ言語、BASICというものがあるのです。(N88-BASIC、F-BASICなど)
当時速さを求める商用利用では、アセンブラやTurbo Cなど、簡単な制御はBASICが多かったんじゃないでしょうか。
時代は移り変わって多種言語化されてますが、
この言語がいくら旧式とはいえ、プログラムに必要な要素が入っているので
現役で使おうと思えば十分使えたりします。

○調べたときに見つけたサイト
 http://ja.wikipedia.org/wiki/BASIC
 http://www2.nsknet.or.jp/~azuma/l/l0088.htm
 http://www2.airnet.ne.jp/sardine/langs/BASIC.html
 http://sourceforge.jp/magazine/03/07/28/1155247

最低でもシリアル通信は使いたいので、使えるものを探していたら
日本産でWin/Linux対応のBASICを発見。
http://hp.vector.co.jp/authors/VA008683/setup.htm

方言がN88-BASICフォーマットではないので注意。

サンプルプログラムがあるので、ためしに実行してみたら動いた。


ちょっと気になった点といえば、16進数表現が&HではなくBVALだったり、
GOTOやGOSUBが行番号指定のジャンプのみというところかな。
これがラベルに対応してくれると結構使える。
個人的には、N88やF-BASIC対応してくれるとやりやすいかも。

2011年4月26日火曜日

ブラウザOS webconverger

Maroniと似たアプローチを取ってるディストリビュージョン「webconverger」。
構成はDebian Squeeze+Firefox。
起動時の高速化など入れてあるみたいですが、気になるのがブラウザをX、Framebufferどちらで
表示してるのかですかね。

自分はWEBブラウザにハード制御を行えるようにしたかったので、
Maroniの構成は、Debian Squeeze+netsurf+Webサーバ(nginx+gnicorn)

メモリー使用量も抑えてFramebuffer上でブラウザ起動、極小WEBサーバ追加で使用メモリーは合計30MBくらい。

ちなみにwebkitでmozillaをX上で起動させる手法を取った事あるけど、
X自身の使用メモリーも大きかったので、使わなかったけど。

こういうディストリビューションが増えてくれるのは嬉しいことだ。


参考URL:
http://webconverger.com/

2011年1月31日月曜日

V4L2を使ってカメラ画像を取得する

V4L2で画像取得してOpenCVで加工する

Webカメラ画像を取得する

LinuxでWebカメラ画像を取得する方法は色々あります。その中で低レベルAPIのV4L2を使った方法でWebカメラから画像を取得してみます。

私が持っているWEBカメラはUVC対応していますが、V4L2上で扱えるフォーマットを調べてみると、

 画像フォーマット:YUYV, 320x240(4fps)

このフォーマットでしかサポートされていない事が判明しました。

このような低スペックの場合、OpenCVライブラリ経由でカメラデバイスの初期化に失敗します。
OpenCVはオープンソースなので、自分でOpenCVライブラリに修正パッチを当てて使えるようにする方法もありますが、今回はV4L2サンプルコードを基にカメラ制御プログラムを作りました。

実装

V4L2のサンプルコードのままだと画像保存が行えないので、
V4L2経由で取得したストリームデータをYUV形式→RGB変換して
OpenCVライブラリのIplImageフォーマットに合わせてデータを入れて画像を保存しました。
これでV4L2のAPIを使って画像を取得して、その後にOpenCVで画像加工が可能になります。

以下、サンプルプログラムの説明。
  1. デバイスオープン(/dev/video0)
  2. V4L2 APIを使ってキャプチャー情報を取得。
  3. ストリームON/OFFでキャプチャデータ取り込み許可を制御。
  4. MMAP経由でデータを取得する。
  5. 取得したデータ形式(YUYV)をBGR形式に変換して、OpenCVを使ってPNG形式で保存。
    (OpenCV内臓のYUV→BGR変換処理はうまく行かなかった)

実際動いたコード公開。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>          /* low-level i/o */
#include <errno.h>
#include <malloc.h>
#include <sys/mman.h>
#include <linux/videodev2.h>
#include <cv.h>
#include <highgui.h>

#define CLEAR(x) memset (&(x), 0, sizeof (x))

struct buffer {
    void *          start;
    size_t          length;
};

const static char * dev_name    = "/dev/video0";
static int          fd          = -1;
#define N_IMAGES                (2)
static IplImage *               images[N_IMAGES];
#define V4L_WIDTH               (320)
#define V4L_HEIGHT              (240)

static void errno_exit(const char *s){
    fprintf (stderr, "%s error %d, %s\n", s, errno, strerror (errno));
    exit (EXIT_FAILURE);
}

static int xioctl(int fd, int request, void *arg){
    int r;
    do r = ioctl (fd, request, arg);
    while (-1 == r && EINTR == errno);
    return r;
}

static void Conv_YUYV2BGR(IplImage *src_img){
    unsigned char *yuyv = src_img->imageDataOrigin;
    unsigned char *bgr = src_img->imageData;
    int z = 0;
    int x;
    int yline;

    for (yline = 0; yline < src_img->height; yline++){
        for (x = 0; x < src_img->width; x++){
            int r, g, b;
            int y, u, v;

            if (!z)
              y = yuyv[0] << 8;
            else
              y = yuyv[2] << 8;
            u = yuyv[1] - 128;
            v = yuyv[3] - 128;

            r = (y + (359 * v)) >> 8;
            g = (y - (88 * u) - (183 * v)) >> 8;
            b = (y + (454 * u)) >> 8;

            *(bgr++) = (b > 255) ? 255 : ((b < 0) ? 0 : b);
            *(bgr++) = (g > 255) ? 255 : ((g < 0) ? 0 : g);
            *(bgr++) = (r > 255) ? 255 : ((r < 0) ? 0 : r);

            if (z++) {
                z = 0;
                yuyv += 4;
            }
        }
    }
}


static void process_image(IplImage *yuv_img){
    //IplImage *frm_img = cvCreateImage(cvSize(V4L_WIDTH, V4L_HEIGHT), IPL_DEPTH_8U, 3);
    //cvCvtColor(yuv_img, frm_img, CV_YCrCb2BGR);
    Conv_YUYV2BGR(yuv_img);
    cvSaveImage("/var/www/fcgi/media/test.png", yuv_img, NULL);
    fputc ('.', stdout);
    fflush (stdout);
}

static int read_frame(void) {
    struct v4l2_buffer buf;
    unsigned int i;

    CLEAR (buf);
    buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
    buf.memory = V4L2_MEMORY_MMAP;

    if (-1 == xioctl (fd, VIDIOC_DQBUF, &buf)) {
        if(EAGAIN == errno) return 0;
        errno_exit ("VIDIOC_DQBUF");
    }
    process_image (images[buf.index]);

    if (-1 == xioctl (fd, VIDIOC_QBUF, &buf)) errno_exit ("VIDIOC_QBUF");

    return 1;
}

static void get_info(){
    struct v4l2_fmtdesc fmtdesc;
    int i = 0;

    for(i = 0; i < 10; i++){
        fmtdesc.type  = V4L2_BUF_TYPE_VIDEO_CAPTURE;
        fmtdesc.index = i;
        if (0 > ioctl(fd, VIDIOC_ENUM_FMT, &fmtdesc) < 0) break;
        printf("format %d : pixelfotmat:%x desc:%s, ", i, fmtdesc.pixelformat, fmtdesc.description);
        if (fmtdesc.pixelformat == V4L2_PIX_FMT_RGB24) printf("RGB24\n");
        if (fmtdesc.pixelformat == V4L2_PIX_FMT_BGR24) printf("BGR24\n");
        if (fmtdesc.pixelformat == V4L2_PIX_FMT_YUYV)  printf("YUYV\n");
    }
    
}


static void mainloop(void){
    unsigned int count;
    for(count = 100; 0<count; count--){
        for (;;) {
            fd_set fds;
            struct timeval tv;
            int r;

            FD_ZERO (&fds);
            FD_SET (fd, &fds);

            /* Timeout. */
            tv.tv_sec = 2;
            tv.tv_usec = 0;

            r = select (fd + 1, &fds, NULL, NULL, &tv);

            if (-1 == r) {
                if (EINTR == errno) continue;
                errno_exit ("select");
            }

            if (0 == r) errno_exit("select timeout\n");

            if (read_frame ()) break;
        }
    }
}

static void open_device(){
    struct v4l2_capability cap;
    struct v4l2_format fmt;
    unsigned int i;
    enum v4l2_buf_type type = V4L2_BUF_TYPE_VIDEO_CAPTURE;

    fd = open (dev_name, O_RDWR | O_NONBLOCK, 0);
    if (-1 == fd) errno_exit("Cannot open device");
    if (-1 == xioctl(fd, VIDIOC_QUERYCAP, &cap)) errno_exit("no V4L2 device");
    if (!(cap.capabilities & V4L2_CAP_VIDEO_CAPTURE)) errno_exit("can't dev");
    if (!(cap.capabilities & V4L2_CAP_STREAMING)) errno_exit("err stream IO");

    get_info(); //debug

    CLEAR (fmt);
    fmt.type                = V4L2_BUF_TYPE_VIDEO_CAPTURE;
    fmt.fmt.pix.width       = V4L_WIDTH; 
    fmt.fmt.pix.height      = V4L_HEIGHT;
    fmt.fmt.pix.pixelformat = V4L2_PIX_FMT_YUYV;
    fmt.fmt.pix.field       = V4L2_FIELD_ANY;
    if (-1 == xioctl (fd, VIDIOC_S_FMT, &fmt)) errno_exit("VIDIOC_S_FMT");
    if((fmt.fmt.pix.width != V4L_WIDTH) || (fmt.fmt.pix.height != V4L_HEIGHT)) errno_exit("unavailable size 320x240");

    //init_mmap
    struct v4l2_requestbuffers req;
    CLEAR (req);
    req.count  = 2;
    req.type   = V4L2_BUF_TYPE_VIDEO_CAPTURE;
    req.memory = V4L2_MEMORY_MMAP;
    if (-1 == xioctl (fd, VIDIOC_REQBUFS, &req)) errno_exit("err mem mapping");
    if (2 > req.count) errno_exit("Insufficient buffer memory on %s\n");

    for (i = 0; i < N_IMAGES; i++) {
        images[i] = cvCreateImage(cvSize(V4L_WIDTH, V4L_HEIGHT), IPL_DEPTH_8U, 3);

        struct v4l2_buffer buf;
        CLEAR (buf);
        buf.type   = V4L2_BUF_TYPE_VIDEO_CAPTURE;
        buf.memory = V4L2_MEMORY_MMAP;
        buf.index  = i;
        if (-1 == xioctl(fd, VIDIOC_QUERYBUF, &buf)) errno_exit("QUERYBUF");
        printf("size:%d:%d\n", images[i]->imageSize, buf.length);
        //images[i]->imageStep = V4L_WIDTH * 2;
        images[i]->imageSize = buf.length;
        images[i]->imageDataOrigin =
            mmap (NULL /* start anywhere */,
                  buf.length,
                  PROT_READ | PROT_WRITE /* required */,
                  MAP_SHARED /* recommended */,
                  fd, buf.m.offset);

        if (MAP_FAILED == images[i]->imageData) errno_exit ("mmap");
        if (-1 == xioctl (fd, VIDIOC_QBUF, &buf)) errno_exit ("VIDIOC_QBUF");
    }

    if (-1 == xioctl (fd, VIDIOC_STREAMON, &type)) errno_exit ("STREAMON");
}

static void close_device(void){
    unsigned int i;
    enum v4l2_buf_type type = V4L2_BUF_TYPE_VIDEO_CAPTURE;

    if (-1 == xioctl (fd, VIDIOC_STREAMOFF, &type)) errno_exit ("STREAMOFF");

    for (i = 0; i < N_IMAGES; i++) {
        munmap (images[i]->imageData, images[i]->imageSize);
        cvReleaseImage(&images[i]);
    }
    close (fd);
}

int main(){
    open_device();
    mainloop();
    close_device();

    exit(EXIT_SUCCESS);
    return 0;
}


関連記事



2011年1月28日金曜日

LinuxでRAMディスクを使う

Linuxはハードディスクを持たないシステムでも動くように設計されていているので、
標準でRAMディスクが使えるように設定されているようである。

動的に割り当てられているRAMディスクは
/dev/shm

ここである。
もし自分で設定するならば、
# mount -t tmpfs -o size=128m tmpfs /dev/shm

もしくは、

# mke2fs /dev/ramdisk
# mkdir /mnt/ramdisk
# mount -t ext2 /dev/ramdisk /mnt/ramdisk

で設定できて、確認する場合は下記コマンドでできる。
df -h

参考URL:http://itpro.nikkeibp.co.jp/article/Keyword/20070330/267007/

2011年1月24日月曜日

tar.bz2ファイル解凍のやり方

2コマンドで行う。

bunzip2 [ファイル名].tar.bz2
tar xvf [ファイル名].tar

2010年12月18日土曜日

mini2440でbusybox環境構築する。

u-boot
kernel
busybox
をビルドしたらrootfs作成へ。

busyboxビルドしたときの_installフォルダに移動。



して下記項目をファイル化して実行する。

>スクリプト内で指定してあるディレクトリは任意の場所に書き換える必要がある。
ツールチェインで使ったライブラリ
・/opt/FriendlyARM/toolchain/4.4.3/arm-none-linux-gnueabi/sys-root/lib/
カーネルuImage
・~/kernel/mini2440
カーネルモジュール
・~/kernel/kernel-modules/


mkdir dev
mkdir -p etc etc/init.d etc/network
mkdir -p var var/run var/log
mkdir -p usr/bin usr/sbin usr/lib usr/local/bin usr/local/sbin usr/local/lib
ln -s usr/bin bin
ln -s usr/sbin sbin
ln -s usr/lib lib
mkdir pt mnt proc sys
mkdir -m 777 tmp
mknod -m 622 dev/console c 5 1
mknod dev/ttySAC0 c 204 64  
mknod dev/tty0 c 4 0
#touch linuxrc
#chmod ug+x linuxrc

#gcc 4.3.2 or 4.4.3 for frienldyARM toolchain
#cp -Rp /opt/FriendlyARM/toolchain/4.4.3/arm-none-linux-gnueabi/sys-root/lib/* lib/
cp -Rp /usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/armv4t/lib/* lib/

#kernel copy
cp ~/kernel/mini2440/uImage boot/
cp -Rp ~/kernel/kernel-modules/lib/* lib/


# The operation of the init program is define in the inittab file, busybox init has the following default behaviour.
printf "::sysinit:/etc/init.d/rcS\n" > ./etc/inittab
printf "::askfirst:-/bin/sh\n" >> ./etc/inittab
printf "::ctrlaltdel:/sbin/reboot\n" >> ./etc/inittab
printf "::shutdown:/bin/umount -a \n" >> ./etc/inittab
printf "::shutdown:/sbin/swapoff -a\n" >> ./etc/inittab
printf "::restart:/sbin/init\n" >> ./etc/inittab
printf "::respawn:/sbin/getty -L 115200 /dev/ttySAC0 vt100\n" >> ./etc/inittab

# Create a rcS job file in the /rootfs/etc/init.d directory to initialize the target system.
printf "#! /bin/sh\n" > ./etc/init.d/rcS
printf "\n" >> ./etc/init.d/rcS
printf "# Setup the bin file location and export to system PATH\n" >> ./etc/init.d/rcS
printf "PATH=/sbin:/bin:/usr/sbin:/usr/bin\n" >> ./etc/init.d/rcS
printf "umask 022\n" >> ./etc/init.d/rcS
printf "export PATH\n" >> ./etc/init.d/rcS
printf "\n" >> ./etc/init.d/rcS
printf "# mount the filesystem directories\n" >> ./etc/init.d/rcS
printf "mount -a\n" >> ./etc/init.d/rcS
printf "mkdir /dev/pts\n" >> ./etc/init.d/rcS
printf "mount -t devpts devpts /dev/pts -o mode=0622\n" >> ./etc/init.d/rcS
printf "\n" >> ./etc/init.d/rcS
printf "# create device nodes and directories\n" >> ./etc/init.d/rcS
printf "echo /sbin/mdev>/proc/sys/kernel/hotplug\n" >> ./etc/init.d/rcS
printf "mdev -s\n" >> ./etc/init.d/rcS
printf "mkdir /var/lock\n" >> ./etc/init.d/rcS
printf "\n" >> ./etc/init.d/rcS
printf "# start logging utility services\n" >> ./etc/init.d/rcS
printf "klogd\n" >> ./etc/init.d/rcS
printf "syslogd\n" >> ./etc/init.d/rcS
printf "\n" >> ./etc/init.d/rcS
printf "# set system clock from RTC\n" >> ./etc/init.d/rcS
printf "hwclock -s\n" >> ./etc/init.d/rcS
printf "\n" >> ./etc/init.d/rcS
printf "# set host and config loopback interface\n" >> ./etc/init.d/rcS
printf "ifconfig lo 127.0.0.1\n" >> ./etc/init.d/rcS
chmod +x ./etc/init.d/rcS

#Create a mdev.conf file in the /rootfs/etc directory for the mdev process to do an initial update of the device files dynamically.
printf "# system all-writable devices\n" > ./etc/mdev.conf
printf "full  0:0 0666\n" >> ./etc/mdev.conf
printf "null  0:0 0666\n" >> ./etc/mdev.conf
printf "ptmx  0:0 0666\n" >> ./etc/mdev.conf
printf "random  0:0 0666\n" >> ./etc/mdev.conf
printf "tty  0:0 0666\n" >> ./etc/mdev.conf
printf "zero  0:0 0666\n" >> ./etc/mdev.conf
printf "\n" >> ./etc/mdev.conf
printf "# console devices\n" >> ./etc/mdev.conf
printf "tty[0-9]* 0:5 0660\n" >> ./etc/mdev.conf
printf "vc/[0-9]* 0:5 0660\n" >> ./etc/mdev.conf
printf "\n" >> ./etc/mdev.conf
printf "# serial port devices\n" >> ./etc/mdev.conf
printf "s3c2410_serial0 0:5 0666 =ttySAC0\n" >> ./etc/mdev.conf
printf "s3c2410_serial1 0:5 0666 =ttySAC1\n" >> ./etc/mdev.conf
printf "s3c2410_serial2 0:5 0666 =ttySAC2\n" >> ./etc/mdev.conf
printf "s3c2410_serial3 0:5 0666 =ttySAC3\n" >> ./etc/mdev.conf
printf "\n" >> ./etc/mdev.conf
printf "# loop devices\n" >> ./etc/mdev.conf
printf "loop[0-9]* 0:0 0660 =loop/\n" >> ./etc/mdev.conf
printf "\n" >> ./etc/mdev.conf
printf "# i2c devices\n" >> ./etc/mdev.conf
printf "i2c-0  0:0 0666 =i2c/0\n" >> ./etc/mdev.conf
printf "i2c-1  0:0 0666 =i2c/1\n" >> ./etc/mdev.conf
printf "\n" >> ./etc/mdev.conf
printf "# frame buffer devices\n" >> ./etc/mdev.conf
printf "fb[0-9]  0:0 0666\n" >> ./etc/mdev.conf
printf "\n" >> ./etc/mdev.conf
printf "# input devices\n" >> ./etc/mdev.conf
printf "mice  0:0 0660 =input/\n" >> ./etc/mdev.conf
printf "mouse.*  0:0 0660 =input/\n" >> ./etc/mdev.conf
printf "event.*  0:0 0660 =input/\n" >> ./etc/mdev.conf
printf "ts.*  0:0 0660 =input/\n" >> ./etc/mdev.conf
printf "\n" >> ./etc/mdev.conf
printf "# rtc devices\n" >> ./etc/mdev.conf
printf "rtc0  0:0 0644 >rtc\n" >> ./etc/mdev.conf
printf "rtc[1-9] 0:0 0644\n" >> ./etc/mdev.conf
printf "\n" >> ./etc/mdev.conf
printf "# misc devices\n" >> ./etc/mdev.conf
printf "mmcblk0p1 0:0 0600 =sdcard */bin/hotplug\n" >> ./etc/mdev.conf
printf "sda1  0:0 0600 =udisk * /bin/hotplug\n" >> ./etc/mdev.conf

#Create a fstab filesystem table in the /rootfs/etc directory to mount the system directories.
printf "# device mount-point type options dump fsck order\n" > ./etc/fstab
printf "proc /proc proc defaults 0 0\n" >> ./etc/fstab
printf "sysfs /sys sysfs defaults 0 0\n" >> ./etc/fstab
printf "tmpfs /dev tmpfs defaults 0 0\n" >> ./etc/fstab
printf "tmpfs /tmp tmpfs defaults 0 0\n" >> ./etc/fstab
printf "var /var tmpfs defaults 0 0\n" >> ./etc/fstab

#Create a group file in /rootfs/etc directory.
printf "grep root /etc/group>group\n" > ./etc/group

#Create a password file in /rootfs/etc directory.
printf "grep root /etc/passwd>passwd\n" > ./etc/password

#Create a system wide 'profile' in /rootfs/etc directory.
printf "USER=\"`id -un`\"\n" >> ./etc/profile
printf "LOGNAME=$USER\n" >> ./etc/profile
printf "PS1='[\\u@\\h \\W]\\# '\n" >> ./etc/profile
printf "PATH=$PATH\n" >> ./etc/profile
printf "HOSTNAME=`/bin/hostname`\n" >> ./etc/profile
printf "export USER LOGNAME PS1 PATH HOSTNAME\n" >> ./etc/profile

#Create a 'hostname' file in /rootfs/etc directory.
printf "mini2440" > ./etc/hostname

#Create a /rootfs/etc/issue to add a welcome prompt to the console login.
printf "Welcome to Mini2440\n" >> ./etc/issue
printf "Kernel \\r on an \\m \(\\l\)\n" >> ./etc/issue

#Finally, create a resolv.conf file in /rootfs/etc directory to configure the 
#DNS address to access the internet with your service provider network domain 
#and ip address.
printf "nameserver 192.168.1.1\n" > ./etc/resolv.conf
printf "auto lo\niface lo inet loopback\n" > ./etc/network/interfaces
printf "auto eth0\niface eth0 inet dhcp\n" >> ./etc/network/interfaces



参考サイト
http://cchia-cwp.blogspot.com/2010/03/build-root-file-system.html
http://for-invent.com/mini2440-linux-kernel-from-scratch-getting-started-with-linux-on-the-mini2440-part-1

2010年12月17日金曜日

debianでupstart導入(ドキュメント読んでみた編)

ARM400MHzメモリー64Mしかないボードだと起動するだけで1分かかる。
これだと組み込み製品にしたとき使い物にならないのでなんとか早くしたい!と思って
upstartのドキュメントを読んでみた。
それで分かった事をメモしていく。

<Ubuntu環境から分かったこと>
1.設定ファイルの居場所
sysvinit→upstartにしたとき、
/etc/inittabに全部の設定を書いていたものが
/etc/init/*.confでばらばらに1ファイル1設定で記述する形式になる。

2.設定内容
試しに
/etc/init/tty1.confを開いてみるとランレベルが無くなる?と、どこかで見た内容とは違い、
ランレベルの設定がある。
start on stopped rcRUNLEVEL=[2345]
stop on runlevel [!2345]

respawn
exec /sbin/getty -8 38400 tty1
この内容だけ見て検討も付けられないけど今まで一行にまとめて記述していたものを分解したイメージなのかな。

これがsysvinitのときの設定。
T0:123:respawn:/sbin/getty 115200 ttySAC0

見比べてみればほぼ一致してるけど新しいパラメータが増えていたり設定できない部分もある。
これ以上みても真相が分からないままなので公式を見に行くことにした。

<公式UpstartのWikiから分かったこと>
http://upstart.ubuntu.com/wiki/

1.1つ1つイベントの状態は変更ができるぽい。
http://upstart.ubuntu.com/getting-started.html
こんな感じにできるんだーって感じで流し読み。
イメージできたものはsysvinitで全部直列でやってたものをパラレル処理できるように
1イベント1プロセスで割り当てて、依存関係は1プロセス内に条件を記述しているんだな程度。
停止するときはどうなんだろう、、とか変な事も考えつつページをそっと閉じた。

2.その他
コマンド一覧などが一杯あるけど、やってみないと分かんないと判断して読むのをやめた。

自分が扱うもので依存しそうなものはないので、
Sysvinitから移植しても動かせれそうな気がしてきた。
移植方針は、似たモジュール設定をコピー書き換えで済ましてやってみようと思う。

2010年12月15日水曜日

netsurfをコンパイルする

1.ダウンロード&インストール
apt-get install libcurl3-dev libxml2-dev libmng-dev libxcb-image0-dev libxcb-icccm1-dev libxcb-keysyms1-dev libxcb-aux0-dev libglade2-dev
svn co -r 10901 svn://svn.netsurf-browser.org/trunk/libparserutils
svn co -r 10901 svn://svn.netsurf-browser.org/trunk/libwapcaplet
svn co -r 10901 svn://svn.netsurf-browser.org/trunk/hubbub
svn co -r 10901 svn://svn.netsurf-browser.org/trunk/libcss 
svn co -r 10901 svn://svn.netsurf-browser.org/trunk/libnsgif
svn co -r 10901 svn://svn.netsurf-browser.org/trunk/libnsbmp
svn co -r 10901 svn://svn.netsurf-browser.org/trunk/librosprite
svn co -r 10901 svn://svn.netsurf-browser.org/trunk/libnsfb
(※リリースされた時期にあわせたリビジョン指定が必要。ちなみに10901はそれらしい日付で合わせてる。)

それぞれのライブラリをコンパイルしてインストール
make
make install

途中で「warning: cast increases required alignment of target type」エラーが出たら
Makefileを開き、コンパイルオプション「-Wcast-align」を取り除く。
(ARMネイティブ環境でコンパイルしたら出たが、VMWare上Ubuntu10.10ではエラーが出なかったのでコンパイラのバージョンか、アーキテクチャの問題で出てるのかな?)

ここからNetsurfソースビルド。
ReadMeをみてみると、iConv対応にするならMakefileに
CFLAGS += -DWITH_ICONV_FILTER
を追加。

今回はFrameBuffer用ブラウザをビルドするので、
make TARGET=framebuffer
make install

これで無事完了。

2010年12月10日金曜日

mpeg-streamerを使ってみる。

KernelでV4L対応になっている事が条件。

1.ファイルダウンロード。
http://sourceforge.net/projects/mjpg-streamer/files/

2.インストール。
$ sudo dpkg --install mjpg-streamer_r94-1_i386.deb

3.実行
$ mjpg_streamer -o "/usr/lib/output_http.so -w /usr/www" -i "/usr/lib/input_uvc.so -y -r 320x240 -f 4"
4.動作確認。
ブラウザからhttp://localhost:8080/にアクセスする。

lennyからsqueezeへアップグレード(暫定)

ただ単純にアップグレードが成功するならこの記事の必要性はないだろうw
サービスパックをあてる様な感覚でLennlyからSqueezeにアップグレードすると
様々なエラートラップにはまるので、それらを切り抜けて完了させる方法を説明していく。

まず前提としてapt-getのみでアップグレードする事を推奨。

$ apt-get install apt aptitude
$ apt-get install perl5 libdpkg-perl
$ apt-get install python2.6 python2.6-minimal
$ apt-get dist-upgrade
・dpkgエラーの場合は、参照リンク
・shエラーの場合は、
$ cd /bin/sh
$ ls -l sh
dashがないのにリンクしていたらbashにリンク張替えて
$ rm sh
$ ln -s bash sh
$ apt-get dist-upgrade
全部完了したところで
$ rm sh
$ ln -s dash sh

これでlennyから無事squeezeへアップグレードした。

・参照リンク
街角のリブロガー: Mini2440のバッドノウハウ

2010年12月8日水曜日

debian lennyで開発環境を入れる

aptitude install build-essestial
を入れれば開発環境のベースが整う。

lenny→squeezeアップグレードエラー

aptitudeでfull-upgradeすると正常に最後までアップグレードができない。
原因はショートカットshがdashインストール前に置き換えられていたり、
dpkgをアップグレードすると正常にインストールできなくなったりする。。

そういうときの対処は、
・shショートカットをbashにする。
ln -s sh bash

・dpkgをlennyで使っていたものに戻す。
wget http://ftp.jp.debian.org/debian/pool/main/d/dpkg/dpkg_1.14.30_armel.deb
dpkg --install dpkg_1.14.30_armel.deb

マイナーバージョンが変わってた場合、Googleで「Debian Lenny dpkg」で
Debianサイトからdpkgなどパッケージのバージョンを調べる必要あり。

これでもエラーしてる場合は、apt動かすのに必要なPythonとPerlを先に
アップデートしておけばおk。
Lennyで使っているPythonやPerlだとエラーするので。。


どうでもいいけどSqueezeが正式リリース前のフリーズ状態になってから半年?経った気がするけど、バグ多いよね。。
乗り換えたいけどARMが使えるディストリって少ないんだよなー

2010年12月7日火曜日

起動エラーについてまとめ

・(none) login:と出る場合
→/sbin/initがinittabファイルを読み込んでランレベルに応じたgetty実行する部分で設定が不足している。

ちなみにinittabは/etc/inittabかと思いきや、/usr/share/sysvinit/inittabなど別の場所にある場合が
あるので注意しておく必要がありそう。


・dhcp読み込んだ後、カーネルパニックが起きた。
→kernel panic - not syncing: vfs: unable to mount root fs on unknown-block(2,0)
ルートをマウントしたけどFS(ファイルシステムの形式)が不明で読み込んだけどよう分からんっとカーネルがパニックしているぽい。
Kernelビルド前にMenuconfigでEXT3なりのオプションが有効になってるかチェックする。
ちなみに4.4.3から4.3.2へGCCのバージョンを変えたら直った。

2010年12月6日月曜日

クロスコンパイラ作成

1.必要なファイルをダウンロード&インストールする
<Synapticsから>
・gawk
・bison
・flex
・texinfo
・automake
・libtool
・cvs
・libncurses5-dev

<Webから>
http://ymorin.is-a-geek.org/download/crosstool-ng/から最新版をダウンロードする。
(現在1.9.0が最新)


2.crosstool-ngをコンパイル&インストール
$ ./configure
$ make
$ sudo make install


3.toolschain作成
フォルダ作成
$ cd ~/
$ mkdir toolchain
$ cd toolchain

Config作成
$ wget http://v3.netyxia.net/~mobyfab/mini2440/.config
自分で設定場合は、
$ ct-ng menuconfig
(設定する項目は後日まとめる)

パッチがあれば当ててからビルド実行
sudo rm ${HOME}/targets/src/.eglibc-trunk.patching
nice ct-ng build.2

4.環境設定
.bashrcに記述する。
export PATH=$PATH:$HOME/toolchain/arm-920t-linux-gnueabi/bin


参考URL
http://mini2440.netyxia.net/viewtopic.php?f=8&t=12
http://www.friendlyarm.net/forum/topic/156

2010年12月3日金曜日

django + python + sqlite

apt-getでこれらパッケージを入れる。
python2.6
python2.6-sqlite
libapache2-mod-python2.6
python-gtkmozembed(処理が重い、Cookie対応)
python-wibkit(処理が早い、Cookie未対応)
python-django

SDメモリーエラー

s3c-sdi s3c2440-sdi: running at 398kHz (requested: 400kHz).
s3c-sdi s3c2440-sdi: powered down.
mmc0: error -110 whilst initialising SD card
s3c-sdi s3c2440-sdi: powered down.

こんなエラーが出た時は大体接触不良。
挿しなおしで解決でちゃったりするから怖い。

2010年12月1日水曜日

debファイルの格納される場所

lenny→squeezeにアップグレードしたとき、dhcpクライアントが消えて
どうしようもなくなったので他から
isc-dhcp-client_4.1.1-P1-12_arm.debファイルを取ってきた。
んで格納した場所はここ。

/var/cache/apt/archives

2010年11月30日火曜日

linuxでキーバインドを変更する

Debian lenny環境を使っていて、デフォルトだと日本語キーボードに設定されていない。
例えば、「WINキー」や「無変換キー」など割り当てが無いので
awesomeを動かすと「WIN+ENTER」キーが使えなくて「xterm」すら開けない自体が起きてしまう。
そこでWINキーを復活させようと思って調べてみたら
「xmodmap」コマンドを使えばできるそうです。

まず、コンソールからXを開いてキーマップを出力する
$ X &
$ xterm -display 0:0 &

X内のxterm上で
$ xmodmap -pke > ~/.xmodmaprc

コンソールからxevを使って割り当てたいキーコードを調べて、.xmodmaprcに書き込む。
$ xev -display 0:0

起動時に設定が反映されるようにしておく。
vim .xinitrc
---
xmodmap .xmodmaprc
...
awesome
---

参考資料
http://forums.fedoraforum.org/archive/index.php/t-251748.html

Androider