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
インターネット上にある断片化された情報を切り取って、リブログする。 主にソフトウェア、Ubuntu関連、CPUなど気になったニュース、また、日々の面白い出来事やニュースもリブログします。
2011年5月17日火曜日
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.サンプルソース(送受信周りがまだ未完成)
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
シリアルポートや、USBポートがあるから制御に使うのが筋ってもの。
しかしどうやって使うの?ドライバーは?という疑問が多々あるので、
今回は導入前の検討編。
1.インストール
libusbをインストールする。(Debian系列ではusbutils)
2.USB機器を接続して、「lsusb」ベンダIDを調べる。
Bus 001 Device 001: ID 0123:4567
ベンダID : 0123
プロダクトID : 4567
3.サンプルソース(送受信周りがまだ未完成)
#include4.コンパイル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(); }
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
ラベル:
linux
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対応してくれるとやりやすいかも。
あまり触れられてない事をしようと思って、元祖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対応してくれるとやりやすいかも。
ラベル:
linux
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/
構成はDebian Squeeze+Firefox。
起動時の高速化など入れてあるみたいですが、気になるのがブラウザをX、Framebufferどちらで
表示してるのかですかね。
自分はWEBブラウザにハード制御を行えるようにしたかったので、
Maroniの構成は、Debian Squeeze+netsurf+Webサーバ(nginx+gnicorn)
メモリー使用量も抑えてFramebuffer上でブラウザ起動、極小WEBサーバ追加で使用メモリーは合計30MBくらい。
ちなみにwebkitでmozillaをX上で起動させる手法を取った事あるけど、
X自身の使用メモリーも大きかったので、使わなかったけど。
こういうディストリビューションが増えてくれるのは嬉しいことだ。
参考URL:
http://webconverger.com/
ラベル:
linux
2011年1月31日月曜日
V4L2を使ってカメラ画像を取得する
![]() |
| V4L2で画像取得してOpenCVで加工する |
Webカメラ画像を取得する
私が持っているWEBカメラはUVC対応していますが、V4L2上で扱えるフォーマットを調べてみると、
画像フォーマット:YUYV, 320x240(4fps)
このフォーマットでしかサポートされていない事が判明しました。
このような低スペックの場合、OpenCVライブラリ経由でカメラデバイスの初期化に失敗します。
OpenCVはオープンソースなので、自分でOpenCVライブラリに修正パッチを当てて使えるようにする方法もありますが、今回はV4L2サンプルコードを基にカメラ制御プログラムを作りました。
実装
V4L2のサンプルコードのままだと画像保存が行えないので、V4L2経由で取得したストリームデータをYUV形式→RGB変換して
OpenCVライブラリのIplImageフォーマットに合わせてデータを入れて画像を保存しました。
これでV4L2のAPIを使って画像を取得して、その後にOpenCVで画像加工が可能になります。
以下、サンプルプログラムの説明。
- デバイスオープン(/dev/video0)
- V4L2 APIを使ってキャプチャー情報を取得。
- ストリームON/OFFでキャプチャデータ取り込み許可を制御。
- MMAP経由でデータを取得する。
- 取得したデータ形式(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;
}
関連記事
ラベル:
linux
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/
標準で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/
ラベル:
linux
2011年1月24日月曜日
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/
参考サイト
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
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を開いてみるとランレベルが無くなる?と、どこかで見た内容とは違い、
ランレベルの設定がある。
これがsysvinitのときの設定。
見比べてみればほぼ一致してるけど新しいパラメータが増えていたり設定できない部分もある。
これ以上みても真相が分からないままなので公式を見に行くことにした。
<公式UpstartのWikiから分かったこと>
http://upstart.ubuntu.com/wiki/
1.1つ1つイベントの状態は変更ができるぽい。
http://upstart.ubuntu.com/getting-started.html
こんな感じにできるんだーって感じで流し読み。
イメージできたものはsysvinitで全部直列でやってたものをパラレル処理できるように
1イベント1プロセスで割り当てて、依存関係は1プロセス内に条件を記述しているんだな程度。
停止するときはどうなんだろう、、とか変な事も考えつつページをそっと閉じた。
2.その他
コマンド一覧などが一杯あるけど、やってみないと分かんないと判断して読むのをやめた。
自分が扱うもので依存しそうなものはないので、
Sysvinitから移植しても動かせれそうな気がしてきた。
移植方針は、似たモジュール設定をコピー書き換えで済ましてやってみようと思う。
これだと組み込み製品にしたとき使い物にならないのでなんとか早くしたい!と思って
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から移植しても動かせれそうな気がしてきた。
移植方針は、似たモジュール設定をコピー書き換えで済ましてやってみようと思う。
ラベル:
linux
2010年12月15日水曜日
netsurfをコンパイルする
1.ダウンロード&インストール
それぞれのライブラリをコンパイルしてインストール
途中で「warning: cast increases required alignment of target type」エラーが出たら
Makefileを開き、コンパイルオプション「-Wcast-align」を取り除く。
(ARMネイティブ環境でコンパイルしたら出たが、VMWare上Ubuntu10.10ではエラーが出なかったのでコンパイラのバージョンか、アーキテクチャの問題で出てるのかな?)
ここからNetsurfソースビルド。
ReadMeをみてみると、iConv対応にするならMakefileに
CFLAGS += -DWITH_ICONV_FILTER
を追加。
今回はFrameBuffer用ブラウザをビルドするので、
これで無事完了。
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
これで無事完了。
ラベル:
linux
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/にアクセスする。
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のバッドノウハウ
サービスパックをあてる様な感覚で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日水曜日
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が使えるディストリって少ないんだよなー
原因はショートカット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のバージョンを変えたら直った。
→/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のバージョンを変えたら直った。
ラベル:
linux
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
<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
ラベル:
linux
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
python2.6
python2.6-sqlite
libapache2-mod-python2.6
python-gtkmozembed(処理が重い、Cookie対応)
python-wibkit(処理が早い、Cookie未対応)
python-django
ラベル:
linux
2010年12月1日水曜日
debファイルの格納される場所
lenny→squeezeにアップグレードしたとき、dhcpクライアントが消えて
どうしようもなくなったので他から
isc-dhcp-client_4.1.1-P1-12_arm.debファイルを取ってきた。
んで格納した場所はここ。
/var/cache/apt/archives
どうしようもなくなったので他から
isc-dhcp-client_4.1.1-P1-12_arm.debファイルを取ってきた。
んで格納した場所はここ。
/var/cache/apt/archives
ラベル:
linux
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
例えば、「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
登録:
投稿 (Atom)
