*WWW::Mechanizeでフォームのデフォルト値を読む:
my $res = $mech->get('ないしょ'); # $mechはWWW::Mechanizeオブジェクト
my $form = $mech->form_number(番号);
my $textarea = $form->find_input(inputタグのname)->{value};
switch(cmd){
case NBBQVIO_AMSR:
/* int am */
x = copy_from_user(&lval,(void *)arg,4);
set_amsr((char)lval);
break;
case NBBQVIO_READ16:
/* ulong addr, ushort data */
x =copy_from_user(&addr,(void *)arg,4);
vread16(addr,&sval);
x = copy_to_user((void *)arg+4,&sval,2);
break;
case NBBQVIO_READ32:
/* ulong addr, ulong data */
x = copy_from_user(&addr,(void *)arg,4);
vread32(addr,&lval);
x = copy_to_user((void *)arg+4,&lval,4);
break;
case NBBQVIO_WRITE16:
/* ulong addr, ushort data */
x = copy_from_user(&addr,(void *)arg,4);
x = copy_from_user(&sval,(void *)arg+4,2);
vwrite16(addr,&sval);
break;
case NBBQVIO_WRITE32:
/* ulong addr, ulong data */
x = copy_from_user(&addr,(void *)arg,4);
x = copy_from_user(&lval,(void *)arg+4,4);
vwrite32(addr,&lval);
break;
case NBBQVIO_DMAR16:
break;
case NBBQVIO_DMAR32:
break;
case NBBQVIO_DMAW16:
break;
case NBBQVIO_DMAW32:
break;
#ifdef ISERIES
/* i-seriese */
case NBBQVIO_AMSR_I:
/* int am */
x = copy_from_user(&lval,(void *)arg,4);
x = copy_from_user(&dn,(void*)arg+4,4);
set_amsr_i((char)lval,dn);
break;
case NBBQVIO_READ16_I:
/* ulong addr, ushort data */
x = copy_from_user(&addr,(void *)arg,4);
x = copy_from_user(&dn,(void *)arg+4,4);
vread16_i(addr,&sval,dn);
x = copy_to_user((void *)arg+8,&sval,2);
break;
case NBBQVIO_READ32_I:
/* ulong addr, ulong data */
x = copy_from_user(&addr,(void *)arg,4);
x = copy_from_user(&dn,(void *)arg+4,4);
vread32_i(addr,&lval,dn);
x = copy_to_user((void *)arg+8,&lval,4);
break;
case NBBQVIO_WRITE16_I:
/* ulong addr, ushort data */
x = copy_from_user(&addr,(void *)arg,4);
x = copy_from_user(&sval,(void *)arg+4,2);
x = copy_from_user(&dn,(void *)arg+8,4);
vwrite16_i(addr,&sval,dn);
break;
case NBBQVIO_WRITE32_I:
/* ulong addr, ulong data */
x = copy_from_user(&addr,(void *)arg,4);
x = copy_from_user(&lval,(void *)arg+4,4);
x = copy_from_user(&dn,(void *)arg+8,4);
vwrite32_i(addr,&lval,dn);
break;
case NBBQVIO_DMAR16_I:
break;
case NBBQVIO_DMAR32_I:
break;
case NBBQVIO_DMAW16_I:
break;
case NBBQVIO_DMAW32_I:
break;
#endif
}
return 1;
}
結局vread, vwriteを使用している。
なので、おそらくcmdvmeでアクセサに_iを付け足してやればよい?
i-seriesのioctlを使うときはリクエスト定数末尾に_Iを付加してやる。
/* i-seriese */
case NBBQVIO_AMSR_I:
case NBBQVIO_READ16_I:
case NBBQVIO_READ32_I:
case NBBQVIO_WRITE16_I:
case NBBQVIO_WRITE32_I:
case NBBQVIO_DMAR16_I:
case NBBQVIO_DMAR32_I:
case NBBQVIO_DMAW16_I:
case NBBQVIO_DMAW32_I:
ioctl(i-series)--------------
case NBBQVIO_READ32_I:
/* ulong addr, ulong data */
x = copy_from_user(&addr,(void *)arg,4);
x = copy_from_user(&dn,(void *)arg+4,4);
vread32_i(addr,&lval,dn);
x = copy_to_user((void *)arg+8,&lval,4);
break;
******
case NBBQVIO_WRITE32_I:
/* ulong addr, ulong data */
x = copy_from_user(&addr,(void *)arg,4);
x = copy_from_user(&lval,(void *)arg+4,4);
x = copy_from_user(&dn,(void *)arg+8,4);
vwrite32_i(addr,&lval,dn);
break;
memo391 : WP-1130
*#1 Tue Nov 30 16:57:49 2010 / Wed Dec 1 00:55:46 2010
*Neut減衰長 => memo391
*putty:ウィンドウ->変換で文字コードをUTF-8にしとくと、imagesenderで日本語使っても大丈夫。
*WWW::Mechanizeでフォームのデフォルト値を読む:
my $res = $mech->get('ないしょ'); # $mechはWWW::Mechanizeオブジェクト
my $form = $mech->form_number(番号);
my $textarea = $form->find_input(inputタグのname)->{value};
* nbbqデーモンをstopしたらnebula01が落ちた・・・->モブゆきさんありがとう!
* nbbqcomに、コマンドを打つたびにperlスクリプトを起動させる処理をぶっこむ。
→Mechanizeでnebulaページを自動更新!! => memo381
*[LINK] <- シドニア4巻。
カバーデザイナーが交代、テイストが若干変わった。どことなくBLAME!を感じる。
あと題字のフォントにディテールが入って、そこにもきゅんと来る。
*しくった・・・ vmeutil, vmestatのバックアップを忘れていた。ていうかusr/nbbq全体のバックアップをとっておくべきだった。
*#2 Tue Nov 30 17:40:39 2010 / Tue Nov 30 18:32:12 2010
run87(ロングラン)
D207, D213(+VU103)でゲインシフトを観察。
D207, D213->同期
VU103->非同期
(18:32:12)
→これで原因がだいたい特定できた。
・LEMO-34chとQDCの接続部
・QDCそのもの
おそらく前者。
ケーブルを挿し直してから現象が見られるまでにdayオーダーのラグがあるので。
*#3 Tue Nov 30 17:42:10 2010 / Tue Nov 30 23:53:48 2010
N101 on run79 => memo389
のぼり3800mm
くだり4400mm.
カタスペでは380cm(in bulk).
->[LINK]
同様の方法で全neutのA.L.をざっくり見た(18:51:02)。
ただし、neut領域はY in [-900,+900]だが、
安全マージンとしてフィットは[-800,+800]で行う。
-----------------------------------------------------------------
NID Au[mm] Ad[mm]
101 3619.54 4406.70 <-上の例との不一致は、例では-900,+900でフィットしてたから
102 3476.59 3764.07
103 3829.70 3026.35
104 3810.44 3903.95
105 3417.07 3676.55
106 4204.97 4121.28
107 3215.70 3062.81
108 2881.22 3888.69
109 4019.89 4461.18
110 3888.39 4209.04
111 3292.81 2911.53
112 3075.50 2753.07
113 3565.53 3763.88
114 4041.53 3123.93
115 4352.73 4412.23
平均 3646 3699
偏差 411 566
201 3574.86 3991.49
202 3859.74 4323.93
203 3044.72 4146.66
204 3676.28 3465.60
205 3581.93 4740.12
206 3228.40 4009.45
207 4405.62 4070.50
208 3509.70 3095.49
209 3609.24 4227.08
210 4173.76 3953.66
211 3226.52 4343.80
212 4865.75 4302.70
213 5337.89 7272.46 !
214 4288.18 3922.43
215 7328.05 4923.46 ?
平均 3997 4111
偏差 1071 459
(213は除外して計算、215も除外すると100番台とまあまあ一致する)
----------------------------------------------
*#4 Wed Dec 1 01:25:36 2010 / Wed Dec 1 05:37:55 2010
iseriesの機能を使うには ISERIESがdefineされている必要がある。
これはdriversのbb-modules.hで定義されていた。
bb-modules.hは10/7更新。
nbbqvio
file_operations構造体でデバイスをいじるときの作法を定義する?
ioctlとして何を使うかもここで指定。
きれいにまとまってる?=>[LINK]
/usr/nbbq/nbbqvio/nbbqvio.c:114: ret = register_chrdev(nbbqvio_major,nbbqvio_name,&nbbqvio_fops);
最後のnbbqvio_fopsがfile_operations構造体。
nbbqvio.cで使用されているv***関数(vread,vwriteなど)はコントローラ独自のアクセサ。
関数名v***はまわりまわってdef-sbs620.hで定義されているマクロに従って独自のアクセサ関数名に置換される。
アクセサの実体はsbs620.cにある。
インクルード関係:
nbbqvio.c <- nbbqvio.h
<- vioctrl.h
vioctrl.h <- def-sbs620.h
cmdvmeは cmdvme.c, libnbbqvio.cにのみ依存している。
cmdvme : cmdvme.o libnbbqvio.o
$(CC) $(CFLAGS) cmdvme.o libnbbqvio.o -o cmdvme
cmdvme.c <- nbbqvio.h
libnbbqvio.c <- nbbqvio.h
sbs620.cにある実体は、read, write(readl, writel)でデバイスファイルにアクセスする処理。
libnbbq.cにあるアクセサは、nbbqvio_fopsにセットされたioctlを使う。
#if LINUX_VERSION_CODE >= 0x020600
static struct file_operations nbbqvio_fops = {
.read = nbbqvio_read,
.poll = nbbqvio_poll,
.ioctl = nbbqvio_ioctl,
.open = nbbqvio_open,
.release = nbbqvio_release,
};
#else
#if LINUX_VERSION_CODE >= 0x020400
static struct file_operations nbbqvio_fops = {
read: nbbqvio_read,
poll: nbbqvio_poll,
ioctl: nbbqvio_ioctl,
open: nbbqvio_open,
release: nbbqvio_release,
};
#else
static struct file_operations nbbqvio_fops = {
NULL, // loff_t llseek
nbbqvio_read, // ssize_t read
NULL, // ssize_t write
NULL, // int readdir
nbbqvio_poll, // uint poll
nbbqvio_ioctl, // int ioctl
NULL, // int mmap
nbbqvio_open, // int open
NULL, // int flush
nbbqvio_release, // int release
};
->ioctlはnbbqvio_ioctl.
そしてその定義は
static int nbbqvio_ioctl(struct inode* inode, struct file *filep,
unsigned int cmd, unsigned long arg){
unsigned short sval=0;
unsigned long addr, lval=0, x;
#ifdef ISERIES
unsigned int dn = 0;
#endif
/* printk("filep->f_version : %lu \n",filep->f_version); */
/* printk("MINOR(inode->i_rdev) : %d \n",MINOR(inode->i_rdev)); */
switch(cmd){
case NBBQVIO_AMSR:
/* int am */
x = copy_from_user(&lval,(void *)arg,4);
set_amsr((char)lval);
break;
case NBBQVIO_READ16:
/* ulong addr, ushort data */
x =copy_from_user(&addr,(void *)arg,4);
vread16(addr,&sval);
x = copy_to_user((void *)arg+4,&sval,2);
break;
case NBBQVIO_READ32:
/* ulong addr, ulong data */
x = copy_from_user(&addr,(void *)arg,4);
vread32(addr,&lval);
x = copy_to_user((void *)arg+4,&lval,4);
break;
case NBBQVIO_WRITE16:
/* ulong addr, ushort data */
x = copy_from_user(&addr,(void *)arg,4);
x = copy_from_user(&sval,(void *)arg+4,2);
vwrite16(addr,&sval);
break;
case NBBQVIO_WRITE32:
/* ulong addr, ulong data */
x = copy_from_user(&addr,(void *)arg,4);
x = copy_from_user(&lval,(void *)arg+4,4);
vwrite32(addr,&lval);
break;
case NBBQVIO_DMAR16:
break;
case NBBQVIO_DMAR32:
break;
case NBBQVIO_DMAW16:
break;
case NBBQVIO_DMAW32:
break;
#ifdef ISERIES
/* i-seriese */
case NBBQVIO_AMSR_I:
/* int am */
x = copy_from_user(&lval,(void *)arg,4);
x = copy_from_user(&dn,(void*)arg+4,4);
set_amsr_i((char)lval,dn);
break;
case NBBQVIO_READ16_I:
/* ulong addr, ushort data */
x = copy_from_user(&addr,(void *)arg,4);
x = copy_from_user(&dn,(void *)arg+4,4);
vread16_i(addr,&sval,dn);
x = copy_to_user((void *)arg+8,&sval,2);
break;
case NBBQVIO_READ32_I:
/* ulong addr, ulong data */
x = copy_from_user(&addr,(void *)arg,4);
x = copy_from_user(&dn,(void *)arg+4,4);
vread32_i(addr,&lval,dn);
x = copy_to_user((void *)arg+8,&lval,4);
break;
case NBBQVIO_WRITE16_I:
/* ulong addr, ushort data */
x = copy_from_user(&addr,(void *)arg,4);
x = copy_from_user(&sval,(void *)arg+4,2);
x = copy_from_user(&dn,(void *)arg+8,4);
vwrite16_i(addr,&sval,dn);
break;
case NBBQVIO_WRITE32_I:
/* ulong addr, ulong data */
x = copy_from_user(&addr,(void *)arg,4);
x = copy_from_user(&lval,(void *)arg+4,4);
x = copy_from_user(&dn,(void *)arg+8,4);
vwrite32_i(addr,&lval,dn);
break;
case NBBQVIO_DMAR16_I:
break;
case NBBQVIO_DMAR32_I:
break;
case NBBQVIO_DMAW16_I:
break;
case NBBQVIO_DMAW32_I:
break;
#endif
}
return 1;
}
結局vread, vwriteを使用している。
なので、おそらくcmdvmeでアクセサに_iを付け足してやればよい?
i-seriesのioctlを使うときはリクエスト定数末尾に_Iを付加してやる。
/* i-seriese */
case NBBQVIO_AMSR_I:
case NBBQVIO_READ16_I:
case NBBQVIO_READ32_I:
case NBBQVIO_WRITE16_I:
case NBBQVIO_WRITE32_I:
case NBBQVIO_DMAR16_I:
case NBBQVIO_DMAR32_I:
case NBBQVIO_DMAW16_I:
case NBBQVIO_DMAW32_I:
vmeutil/nbbqvio.hに、nbbqvio/nbbqvio.hから上記の定数定義をもってきた(4:08:07)
また extern v***_iも追加。
libnbbqvio.cにv***_iの実体を定義する。
普通のアクセサ------------
unsigned long vme_read32(unsigned long addr){
nbbqvio_val[0] = addr;
ioctl(nbbqvio_fd,NBBQVIO_READ32,nbbqvio_val);
return nbbqvio_val[1];
}
↓
ioctl---------------------
case NBBQVIO_READ32:
/* ulong addr, ulong data */
x = copy_from_user(&addr,(void *)arg,4);
vread32(addr,&lval);
x = copy_to_user((void *)arg+4,&lval,4);
break;
argはunsigned long.これを(void *)でポインタとしてキャストしている。
argはnbbqvio_valで、これはunsigned longの配列。
配列=ポインタであることを考えると(void *)arg+4 = nbbqvio_val[1].
ioctl(i-series)--------------
case NBBQVIO_READ32_I:
/* ulong addr, ulong data */
x = copy_from_user(&addr,(void *)arg,4);
x = copy_from_user(&dn,(void *)arg+4,4);
vread32_i(addr,&lval,dn);
x = copy_to_user((void *)arg+8,&lval,4);
break;
******
case NBBQVIO_WRITE32_I:
/* ulong addr, ulong data */
x = copy_from_user(&addr,(void *)arg,4);
x = copy_from_user(&lval,(void *)arg+4,4);
x = copy_from_user(&dn,(void *)arg+8,4);
vwrite32_i(addr,&lval,dn);
break;
つまり、アクセサ側ではdnはnbbqvio_val[1](または[2],write時)としてセットすればよい。
紆余曲折を経て、警告は出るものの(nbbqvio.cでの_iシリーズの暗黙の宣言エラー)コンパイルは通るようになった。
anapawでデータも来る。しかし来すぎる。案の定ヒストグラムは空。(5:29:45)
->警告は解決。bb-vme.hのコメントアウトを外した。
grepでは/*~*/でのコメントアウトが分からない・・・
*#5 Wed Dec 1 14:52:11 2010 / Wed Dec 1 14:58:51 2010
・defineの順番がまずい
・nbbqvio_valの長さが1足りない
・init_nbbqvio, release_nbbqvioもi-series対応
あとはあってた?
defineの順番を間違えたのはいただけないが。。。
配列の長さ違いを見落としたのもよくない。
*Link to: