pinewell's farmer blog 農業と電子工作、ソフトウェア、バイク、車

2014年2月17日

NEC Express5800/S70 タイプPJ のCPU換装失敗。

Filed under: 副業 — pinewell @ 11:22 AM

いわゆる鼻毛鯖。
ウチではCentOSをいれてPT3での録画鯖として使っている。
この鯖にはG6950が搭載されているのだが、Core i5 650 が安く入手できたのでCPUを換装してみた。
…動くことは動くのですよ。が、3つ搭載されているファンが全て?全開状態。うるさくて使用できない。
なんとかならないものかと調べてみる。

1.S70の古いタイプではBIOSのバイナリデータを改造することで改善できるモノもある。
2.WindowsではspeedFANを使用して下げることができる。
3.debianでバックポートを入れたkernelでは各種センサーが動くようだ。

これら情報を元に試行錯誤。
1.のBIOS改造はバイナリデータの解析がめんどうすぎで無理と結論。
2.の情報を元に、使用されているセンサー類のドライバーを推測。
i2c-i801 と ADT7490と思われる。
3.の情報をたよりに対応するkernelのバージョンを推測。
CentOS標準の2.6.32ではダメ。2.6.33からADT7490に対応しているようだ。
これは2.6.33のソースから。
linux-2.6.33/drivers/hwmon/adt7475.c に ADT7490の記載がある。
できれば2.6.32+各種パッチ入りの標準カーネルから2.6.33のパッチ無しkernelにはしたくない。
adt7475.cを2.6.32のそれと差し替えてコンパイルできないものか試してみたがダメだった。
これ以上の解析は労力のムダと判断。
新し目のディストリならlm_sensorsでdetectしてpwmconfigでファン調整もできるのかも。

選択肢は
A.CPUを戻す。
B.ディストリを変える。(再インストール/再構築)
これを機にdebian”wheezy”にするか、ubuntuにするかFedoraにするかそれとも・・・・。
C.CentOSのカーネルを非公式カーネルにする。
D.arduinoを使用してファンコントローラを自作。

D.のarduinoのファンコンも調べてみると実例が多々ある。これはこれで面白そうだ。
coretempでCPU温度はとれるのでUSBに繋いだarudinoに伝えて温度にあったファンスピードをPWMで調整とか。

C.はelrepoで3.某の非公式カーネルが存在する。仮想環境で試してみたがカーネルの動作は良好だった。
ただ、ヘッダーファイルとかそれらの依存性をブッタ切ることになるので今後のメンテが面倒そう。

B.も大いに興味をそそられた。が、録画鯖という性質上長く停めたくない。ってか非常に面倒そう。

で、結局。
オークションで相場を調べたら買った価格よりも高く売れそうなのでA.を選択してしまった。

2014年2月6日

HD7790x2

Filed under: 副業,未分類 — pinewell @ 2:24 PM

前回までで、HD7790+HD7750ではワシが満足する構成にはできないことが判明。
そして本日、発注していたHD7790が届く。 SAPPHIRE HD7790。とても新品では買えないが中古で安かった。
さっさと交換したかったが、冷え冷えのビデオカードではマズイ。
1時間ほど室温に慣らしていざHD7750と交換。またまたディスプレイ構成が変わったので
eyefinityのディスプレイグループが崩れたりで面倒だが、これで最後だろうと。
が、最初の起動ではBIOS画面こそ元々のT221画面に出力されたが、Windowsが立ち上がると後に挿した7790の
画面(CDU,E2210,L465)しかディスプレイが認識されていない。
電源不足か?とかケーブル抜いたっけ?とか考えたがとりあえず電源断。再度起動。
今度はT221側のみ認識。で、よく見るとcatalyst control centerからメッセージが。AMD CrossFireXを有効にするか?、と。
どうやらHD7790x2では敢えて無効にしないと有効にしたがるようだ。無効にすることで全ディスプレイが認識された。

HD7790 DVI-dual -T221
DVI-dual -T221
HD7790 DVI-Single -CDU2150A
DP-DVI -CDU2150A
HDMI-DVI -E2210HDS
DVI-Single -L465
の接続でCDU2150A をディスプレイグループで 3840x2400x33Hz
T221 をディスプレイグループで 3840x2400x48Hz
E2210HDS を 1920x1080x60Hz
L465 を 1280x1024x60Hz
の当初の目的が達成できた。大事なのはコネクタの数、出力できる帯域?だねぇ。
デュアルリンクDVIを2本使用して使用していない余っているHDMIとDisplayPortに画面が出力できると思っていたことが誤算。
これでようやく落ち着いた。後5年はこのままかぁ?
gamen

2014年2月3日

radeon マウスカーソル 崩れる とか。自作アダプタの不具合か?

Filed under: その他,副業 — pinewell @ 6:04 PM

3840x2400x48Hz化で使っているT221。
さぁ開発を・・・と作業していると、T221左側だけでマウスカーソルが崩れる現象が発動。
再起動すると治るが、なにかの拍子にまた崩れる。
調べてみるとradeonではずいぶん前からある不具合のようで・・・。
とりあえず、軌跡を有効にすると確かに治る。これで使うしかないのか。

一難去って、仕事に戻ろうとすると今度はT221画面右側でデュアルリンクが切れる?のか、
縦長の複製のようになってしまう。再起動すると治る。
ドライバがクソなのかと思ってしまったが、T221の電源を切って入れなおすと治る。
が、しばし使っているとまた崩れる。
考えられるのは自作アダプタの不具合か?T221の不具合か?
面倒だが、ケーブルをA/B振り分けて様子をみる。
さしあたり、問題は発生しなくなった。はて?

2014年2月1日

T221 デュアルリンクケーブル。HD7790の限界。

Filed under: その他,副業 — pinewell @ 10:00 PM

これまでの数々の試行でT221による3840x2400x48Hz、ビッグデスクトップ化にはデュアルリンクで
1920x2400x48Hzを2つ、これをEyefinityでディスプレイグループにする必要があることがわかった。
ケーブルの一つは既にある。もう一本買うとなるとちと高い。
そこで、T221純正のLFH60-DVIシングルリンクx2ケーブルをデュアルリンクDVI-Dに変換する。
以前にも調べていて実際に作ってみたのだが、失敗に終わっている経緯がある。
失敗の原因はデュアルリンクのコネクタを基板に付けたこと、小さくつくろうとしたことで、
特にコネクタ部の絶縁がうまくいかなかったのだろう。もう覚えていないが。
ちょうど、接触不良?になったデュアルリンクのDVI-D延長ケーブルもある。
DVI-D シングル/メス 2つ、DVI-D デュアル/オス 1つと18Ωの抵抗x6、も手持ちである。
ついでにEDIDをオーバーライドできるようにしよう。

で、作業開始。まずはDVIシングルメスの結線を調べる。
アナログ部分の信号線は無視するが、TMDS Data線3組がRGB分で9本。TMDS Clock線が3本。
DDC ClockとData で2本。+5V、GND、HotPlug。テスターを当ててひとつひとつ。
DVIデュアルオスの信号線。
TMDS Data+は表(と言っていいかな?)は色付きで裏は白だった。
一言で書くとわからないな。
たとえばシングルリンクでも使われる組は赤/白/シールド線でTMDS Data+は赤なのだが、
シングルリンクで使われない組は灰/白/シールド線でTMDS Data+が白となっている。
とにかく沢山の線で、剥くだけでひと苦労した。

結線は先人のサイトにあるのでここでは敢えて出さない。
作業しやすく、とにかくでっかいアダプターとなった。

完成してテスト。
HD7790のDVI-DとDVI-Iに接続。1920x2400x48Hzを2つ作り、グループ化。
確かに3840x2400x48Hzで一つのデスクトップができた。

が、ここで大問題が。7790にT221だけならよいのだが、これにHDMI/DPでもう一つモニターをつなげると
ブラックアウト後、OS再起動・・・。なんども繰り返しているうちにWindow8.1は再び起動できない状態に陥る。
再びのOS再インストールとなり、原因を考えてみる。
・これまで沢山のモニターを繋げてる、モニターの接続情報がありすぎ?
・電源不足?
・ドライバが糞?
で、ふと思い立った。HD7790では5画面分の出力は無理なんだ、と。
HDMI DP DVx2で4画面はOK。4画面分の帯域(と言っていいかな?)はOK。ってことはデュアルリンクx2で終了。
コネクタが余っていても無理。

T221で4画面。
CDU2150Aで2画面
E2210HDSで1画面/L465で1画面。
合わせると8画面分の帯域が必要。いま挿しているのは7790+7750。7画面分しかない。むぅ。

2014年1月29日

T221の3840x2400x48Hzビッグデスクトップ化。Eyefinityの制限?により失敗。

Filed under: その他,副業 — pinewell @ 2:25 PM

CDU2150Aの3840x2400x33Hzビッグデスクトップ化が成功したので、T221でのそれを試したく。

3840x2400x48Hz化は

LFH-60 -> DualLinkDVI で 2624x2400x48Hzを一つ。

LFH-60 -> T221純正ケーブル -> SingleLink DVI で 1216x2400x48Hzを一つ。

T221のEDID006の設定で容易にできる。

 

問題はこれを一つのディスプレイとしての設定。

このままの設定でEyefinityを用いてディスプレイグループを作成しても、3840×2400の一つの画面とはできないようだ。

EDIDの余計なデータが邪魔をしているからなのかと思い、色々EDIDを試してみたが出来なかった。

2624x2400x48Hzの一画面となってしまう。

1920×2400 + 1920×2400 もしくは 1920×1200 を4つなど同じ大きさでなければダメなようだ。

今手持ちのケーブルでできるのは DualLinkで1920×2400 ひとつ、純正ケーブルで 1920×1200(もしくは960×2400)を2つ。

だが、7790で出力を3つ使うと1920×1080のE2210HDSが繋げない。

DisplayPort-HDMIアクティブ変換もeBayで購入したのだが不良品のため使えず。

できればLFH-60 -> DualLinkDVI のケーブルをもう一つ買えばよいのだが・・・。これまた7,800もする・・・。

CDU2150Aを33Hz化。

Filed under: その他,副業 — pinewell @ 2:04 PM

EEPROM購入の本筋であるCDU2150Aの33Hz化。

まずは1920x2400x33HzのEDIDデータの作成をしなければ。

いろいろ調べてpixelclockをDVI-SingleLinkの上限である165MHzに設定すれば可能そうだ。

EDID Managerで取得したバイナリデータを元に、DetailViewタブで該当のデータを探す。

デフォルトでは BC 34 となっている部分。リトルエンディアンなので? 34BCを16進->10進すると13500。

デフォルトのピクセルクロックは135.00MHzとなっているのでこれを書き換え。16500を16進で4074。

ツールを切り替え、MonitorAssetManagerでバイナリデータの書き換えを行う。

チェックサムデータも自動で計算してくれるので楽チン。BC34の部分を7440として保存。

例によってraspiでEEPROMの書き込んで33Hz化したEDIDROMの完成。

 

これをDVI-SingleLinkケーブルを改造して取り付ける。

IMG_3752こんな感じになった。

これを2本作成。

テスト後、ホットボンドで固めた。

 

 

 

 

IMG_3753

無事に 3840x2400x33Hz化に成功。

 

 

 

 

 

手間はかかったが、某オークションで7,800円の品を格安で作成できた。部材費だけなら1,000円以下。

2014年1月28日

DVIディスプレイ切替器の改造

Filed under: その他,副業 — pinewell @ 7:00 PM

L465はミニD-Sub15ピンとDVIの入力があるのでこれまではFedora20機ではミニD-Sub15ピンで繋いでいた。
CDU2150Aの購入で使用しなくなったGeForce650TiをFedora機へ移行。せっかくだからDVIで繋ごうと考えた。
eBayで買ったDVIの切替器。機械式のスイッチで余り長いこと使用できるとも思えないのだが、DVIの切替器
としては格安で購入できた。
だが、案の定EDIDの保持を行えない。切り替えるたびにモニタの切り離しが行われるため非常に使い勝手が悪い。

EEPROMを多めに買っているので検索して出てきた情報をもとに改造を行う。
IMG_3742

 

 

 

 

 

 

左に見えているのが処置後。EEPROMは差し替えができるようにソケットで接続した。

EDIDデータはEDID Managerでレジストリより収集したL465そのもののデータ。

IMG_3744IMG_3743

 

 

 

 

 

 

 

ホットボンドで適当に固めている。

IMG_3745CPUへ繋ぐ側の両方に処置して出来上がり。

 

 

 

 

 

 

これでCPU側はモニターが繋がっていなくてもつながっていると認識して、画を送り続けることになる。

スイッチによる切替で実際に移したいものを選択すればよい。

2014年1月27日

EDIDのoverride。

Filed under: その他,副業 — pinewell @ 6:55 PM

T221やCDU2150Aをより快適に使うにあたりに問題となるEDID。
某オークションにEDIDのoverrideする延長ケーブル、ROMが出品されているのだがいかんせん安くない。
T221購入時にoverrideケーブル、ROMx3個は購入したのだが。
実際のところ、どれが自分の環境に一番適しているか取っ替え引っ替えしたいのでコスパが悪い。

少し調べてみるとEDIDに使用されているEEPROMはI2Cで通信、データの保存をしているそうだ。
パソコンでの書き込みはパラレルポートを使用してトランジスタ2個と抵抗いくつかで自作できるようだ。
パラレルポートがあるPCが既に無いのでガレージに積んであった古いノートPCを復活させようと思ったが、
コンデンサがイカレているのか、OSインストール中に突然電源が落る。これは使えないと判断。

さらに調べる。
I2CといえばウチにはarduinoもRaspberryPiもあるぞ、もしかして書き換えできるのでは?
と、思ってしまった。
arduino I2C EEPROM で検索すると日本語ページで確かにある。こうなると試してみないと気が済まない。
arduinoで読み出し成功。書き込みはなぜかうまくいかない。
raspberrypi I2C EEPROM で英語のページを発見。
こちらでも読み出しは成功。
なぜ書き込みができないのか?使用しているEEPROMにプロテクトでもかかっているのだろう、と勝手に判断。

まぁ、読めるのなら書き込みもなんとかすればうまくゆくのだろうと、部材を発注。
某サイトにて Microchipの24LC01B/P。1個28円!。20個購入。8pinのICソケットも10個。

これ、さらっと書いているけどEEPROMの選定についてもいろいろ調べた。恐らくこれで大丈夫だろう…の見切り発車。
で、本日到着。うまく行ったので手順をまとめる。

取り敢えずテストなのでEEPROMに書き込むためのデータはExtron Electronicsが無償で配布している(登録が必要)
EDID ManagerをWindows8.1機にインストールしてこれを使用してファイルに保存。いろいろなソフトを試したが、
(編集こそできないが)これが一番使いやすい。
ちなみに現在T221には3840x2400x34HzのEDID乗っ取りoverrideケーブルで繋いでいるので、このROMデータを直接
読んでも同じデータとなる。うまくいったのかどうかはとりあえずこれのコピーを作れば確認ができる。

raspiとEEPROMの接続はこう。
raspi-eeprom
SCLとSDAを繋ぎ1kΩでプルアップ。電源は3.3V。
raspiでのEEPROM読み書きソフトは以下より。
https://github.com/dgallot/i2c-tools/tree/master/eepromer/
eeprom.cをダウンロードして、EEPROMのサイズにあわせて適宜編集。
24LC01なら DEFAULT_NUM_PAGES を 8,BYTES_PER_PAGE を128,MAX_BYTES を8 に変更。
raspiでのi2cデバイスの有効化は検索すればでてくる。
http://www.gallot.be/?p=180 このページを参考にしたが、ワシの環境では /dev/i2c-1 である必要があった。

#i2cdetect -y -a 1
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f  
00: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --  
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --  
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --  
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --  
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --  
50: 50 51 52 53 54 55 56 57 -- -- -- -- -- -- -- --  
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --  
70: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --  

で50~にEEPROMが認識されていると言うことだと思う。

読み出し。-p 2は1ページ128bytex2で256byte分。 -f で 読み出し先ファイル名。

# ./eeprom -p 2 -f EDID.bin
base-address of eeproms       : 0x50
number of pages to read       : 2 (0x50 .. 0x51)
file opened for writing       : EDID.bin
            on filedescriptor : 3
i2c-devicenode is             : /dev/i2c-1
            on filedescriptor : 4
Read 8 bytes from eeprom at 0x50, offset 00000000
---割愛---

書き込み。

#./eeprom -w -p 2 -f EDID.bin 
base-address of eeproms       : 0x50
number of pages to read       : 2 (0x50 .. 0x51)
file opened for reading       : EDID_CDU2150A_256byte.bin
            on filedescriptor : 3
i2c-devicenode is             : /dev/i2c-1
            on filedescriptor : 4

**WARNING**
 -      You have chosen to WRITE to this eeprom.
        Make sure that this tiny chip is *NOT* vital to the
        operation of your computer as you can easily corrupt
        the configuration memory of your SDRAM-memory-module,
        your IBM ThinkPad or whatnot...! Fixing these errors can be
        a time-consuming and very costly process!

Things to consider:
 -      You can have more than one i2c-bus, check in /proc/bus/i2c
        and specify the correct one with -d
        right now you have chosen to use '/dev/i2c-1'
 -      A eeprom can occupy several i2c-addresses (one per page)
        so please make sure that there is no vital eeprom in your computer
        sitting at addresses between 0x50 and 0x51
Enter 'yes' to continue:yes
Wrote 8 bytes to eeprom at 0x50, offset 00000000
...... acked 
Wrote 8 bytes to eeprom at 0x50, offset 00000008
...... acked 
割愛

書き込まれたデータはきちんと読み出しできるか確認して実際にoverrideケーブルに付けてみる。
ドキドキしながらT221接続PCの電源をいれるとあっさり映る。成功。
EEPROMも手に入ったしデータの書き込みも確認できたのであとはDVIケーブルを
ハードオフで買って来てROMを乗っければEDID乗っ取りケーブルの出来上がり、と。

EDIDデータの作成もめんどうそうだが…..

githubで公開されているし、多分大丈夫だと思うので以下 eeprom.c の全ソース。

/*
This program is hereby placed into the public domain.
Of course the program is provided without warranty of any kind.

Downloaded from http://www.lm-sensors.org/browser/i2c-tools/trunk/eepromer/eeprom.c

*/
#include <sys/ioctl.h>
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>
#include <time.h>
#include <linux/i2c-dev.h>

/*
  this program can read 24C16 (and probably smaller ones, too)
  I wrote it as a quick and dirty hack because my satellite receiver
  hung again... so I had to reprogram the eeprom where is stores it's
  settings.
 */

#define DEFAULT_I2C_BUS      "/dev/i2c-0"
#define DEFAULT_EEPROM_ADDR  0x50         /* the 24C16 sits on i2c address 0x50 */
#define DEFAULT_NUM_PAGES    8            /* we default to a 24C16 eeprom which has 8 pages */
#define BYTES_PER_PAGE       256          /* one eeprom page is 256 byte */
#define MAX_BYTES            16            /* max number of bytes to write in one chunk */
       /* ... note: 24C02 and 24C01 only allow 8 bytes to be written in one chunk.   *
        *  if you are going to write 24C04,8,16 you can change this to 16            */

/* write len bytes (stored in buf) to eeprom at address addr, page-offset offset */
/* if len=0 (buf may be NULL in this case) you can reposition the eeprom's read-pointer */
/* return 0 on success, -1 on failure */
int eeprom_write(int fd,
		 unsigned int addr,
		 unsigned int offset,
		 unsigned char *buf,
		 unsigned char len
){
	struct i2c_rdwr_ioctl_data msg_rdwr;
	struct i2c_msg             i2cmsg;
	int i;
	char _buf[MAX_BYTES + 1];

	if(len>MAX_BYTES){
	    fprintf(stderr,"I can only write MAX_BYTES bytes at a time!\n");
	    return -1;
	}

	if(len+offset >256){
	    fprintf(stderr,"Sorry, len(%d)+offset(%d) > 256 (page boundary)\n",
			len,offset);
	    return -1;
	}

	_buf[0]=offset;    /* _buf[0] is the offset into the eeprom page! */
	for(i=0;i<len;i++) /* copy buf[0..n] -> _buf[1..n+1] */
	    _buf[1+i]=buf[i];

	msg_rdwr.msgs = &i2cmsg;
	msg_rdwr.nmsgs = 1;

	i2cmsg.addr  = addr;
	i2cmsg.flags = 0;
	i2cmsg.len   = 1+len;
	i2cmsg.buf   = _buf;

	if((i=ioctl(fd,I2C_RDWR,&msg_rdwr))<0){
	    if ( len > 0 ) {
	      perror("ioctl()");
	      fprintf(stderr,"ioctl returned %d\n",i);
            }
	    return -1;
	}

	if(len>0)
	    fprintf(stderr,"Wrote %d bytes to eeprom at 0x%02x, offset %08x\n",
		    len,addr,offset);
	return 0;
}

/* read len bytes stored in eeprom at address addr, offset offset in array buf */
/* return -1 on error, 0 on success */
int eeprom_read(int fd,
		 unsigned int addr,
		 unsigned int offset,
		 unsigned char *buf,
		 unsigned char len
){
	struct i2c_rdwr_ioctl_data msg_rdwr;
	struct i2c_msg             i2cmsg;
	int i;

	if(len>MAX_BYTES){
	    fprintf(stderr,"I can only write MAX_BYTES bytes at a time!\n");
	    return -1;
	}

	if(eeprom_write(fd,addr,offset,NULL,0)<0)
	    return -1;

	msg_rdwr.msgs = &i2cmsg;
	msg_rdwr.nmsgs = 1;

	i2cmsg.addr  = addr;
	i2cmsg.flags = I2C_M_RD;
	i2cmsg.len   = len;
	i2cmsg.buf   = buf;

	if((i=ioctl(fd,I2C_RDWR,&msg_rdwr))<0){
	    perror("ioctl()");
	    fprintf(stderr,"ioctl returned %d\n",i);
	    return -1;
	}

	fprintf(stderr,"Read %d bytes from eeprom at 0x%02x, offset %08x\n",
		len,addr,offset);

	return 0;
}



int main(int argc, char **argv){
    int i,j;

    /* filedescriptor and name of device */
    int d; 
    char *dn=DEFAULT_I2C_BUS;

    /* filedescriptor and name of data file */
    int f=-1;
    char *fn=NULL;

    unsigned int addr=DEFAULT_EEPROM_ADDR;
    int rwmode=0;
    int pages=DEFAULT_NUM_PAGES;

    int force=0; /* suppress warning on write! */
    int wait = 0;
    int acked = 0;
    
    while((i=getopt(argc,argv,"d:a:p:wyf:h"))>=0){
	switch(i){
	case 'h':
	    fprintf(stderr,"%s [-d dev] [-a adr] [-p pgs] [-w] [-y] [-f file]\n",argv[0]);
	    fprintf(stderr,"\tdev: device, e.g. /dev/i2c-0    (def)\n");
	    fprintf(stderr,"\tadr: base address of eeprom, eg 0xA0 (def)\n");
	    fprintf(stderr,"\tpgs: number of pages to read, eg 8 (def)\n");
	    fprintf(stderr,"\t-w : write to eeprom (default is reading!)\n");
	    fprintf(stderr,"\t-y : suppress warning when writing (default is to warn!)\n");
	    fprintf(stderr,"\t-f file: copy eeprom contents to/from file\n");
	    fprintf(stderr,"\t         (default for read is test only; for write is all zeros)\n");
	    fprintf(stderr,"Note on pages/addresses:\n");
	    fprintf(stderr,"\teeproms with more than 256 byte appear as if they\n");
	    fprintf(stderr,"\twere several eeproms with consecutive addresses on the bus\n");
	    fprintf(stderr,"\tso we might as well address several separate eeproms with\n");
	    fprintf(stderr,"\tincreasing addresses....\n\n");
	    exit(1);
	    break;
	case 'd':
	    dn=optarg;
	    break;
	case 'a':
	    if(sscanf(optarg,"0x%x",&addr)!=1){
		fprintf(stderr,"Cannot parse '%s' as addrs., example: 0xa0\n",
			optarg);
		exit(1);
	    }
	    break;
	case 'p':
	    if(sscanf(optarg,"%d",&pages)!=1){
		fprintf(stderr,"Cannot parse '%s' as number of pages, example: 8\n",
			optarg);
		exit(1);
	    }
	    break;
	case 'w':
	    rwmode++;
	    break;
	case 'f':
	    fn=optarg;
	    break;
	case 'y':
	    force++;
	    break;
	}

    }
   
    fprintf(stderr,"base-address of eeproms       : 0x%02x\n",addr);
    fprintf(stderr,"number of pages to read       : %d (0x%02x .. 0x%02x)\n",
		    pages,addr,addr+pages-1);

    if(fn){
	if(!rwmode) /* if we are reading, *WRITE* to file */
	    f=open(fn,O_WRONLY|O_CREAT,0666);
	else /* if we are writing to eeprom, *READ* from file */
	    f=open(fn,O_RDONLY);
	if(f<0){
	    fprintf(stderr,"Could not open data-file %s for reading or writing\n",fn);
	    perror(fn);
	    exit(1);
	}
	fprintf(stderr,"file opened for %7s       : %s\n",rwmode?"reading":"writing",fn);
	fprintf(stderr,"            on filedescriptor : %d\n",f);
    }

    if((d=open(dn,O_RDWR))<0){
	fprintf(stderr,"Could not open i2c at %s\n",dn);
	perror(dn);
	exit(1);
    }

    fprintf(stderr,"i2c-devicenode is             : %s\n",dn);
    fprintf(stderr,"            on filedescriptor : %d\n\n",d);

    /***
     *** I'm not the one to blame of you screw your computer!
     ***/
    if(rwmode && ! force){
	unsigned char warnbuf[4];
	fprintf(stderr,"**WARNING**\n");
	fprintf(stderr," - \tYou have chosen to WRITE to this eeprom.\n");
	fprintf(stderr,"\tMake sure that this tiny chip is *NOT* vital to the\n");
	fprintf(stderr,"\toperation of your computer as you can easily corrupt\n");
	fprintf(stderr,"\tthe configuration memory of your SDRAM-memory-module,\n");
	fprintf(stderr,"\tyour IBM ThinkPad or whatnot...! Fixing these errors can be\n");
	fprintf(stderr,"\ta time-consuming and very costly process!\n\n");
	fprintf(stderr,"Things to consider:\n");
	fprintf(stderr," - \tYou can have more than one i2c-bus, check in /proc/bus/i2c\n");
	fprintf(stderr,"\tand specify the correct one with -d\n");
	fprintf(stderr,"\tright now you have chosen to use '%s'\n",dn);
	fprintf(stderr," - \tA eeprom can occupy several i2c-addresses (one per page)\n");
	fprintf(stderr,"\tso please make sure that there is no vital eeprom in your computer\n");
	fprintf(stderr,"\tsitting at addresses between 0x%02x and 0x%02x\n",addr,addr+pages-1);

	fprintf(stderr,"Enter 'yes' to continue:");
	fflush(stderr);
	if(!fgets(warnbuf,sizeof(warnbuf),stdin)){
	    fprintf(stderr,"\nCould not read confirmation from stdin!\n");
	    exit(1);
	}
	if(strncmp(warnbuf,"yes",3)){
	    fprintf(stderr,"\n** ABORTING WRITE! **, you did not answer 'yes'\n");
	    exit(1);
	}
    }

    for(i=0;i<pages;i++){
	unsigned char buf[BYTES_PER_PAGE];

	if(rwmode){

	    if(f>=0){
		j=read(f,buf,sizeof(buf));
		if(j<0){
		    fprintf(stderr,"Cannot read from file '%s'\n",fn);
		    perror(fn);
		    exit(1);
		}
		if(j!=sizeof(buf)){
		    fprintf(stderr,"File '%s' is too small, padding eeprom with zeroes\n",fn);
		    while(j<sizeof(buf))
			buf[j++]=0;
		}
	    } else {
		for(j=0;j<sizeof(buf);j++)
		    buf[j]=0;
	    }
            for(j=0;j<(BYTES_PER_PAGE/MAX_BYTES);j++) {
		if(eeprom_write(d,addr+i,j*MAX_BYTES,buf+(j*MAX_BYTES),MAX_BYTES)<0)
		    exit(1);
                fprintf(stderr,".");
                for ( wait = 0; wait < 10; wait ++ ) {
                  acked = eeprom_write(d,addr+i,j*MAX_BYTES,NULL,0);
                  if ( acked == 0 )
                    break;
                  fprintf(stderr,".");
                  usleep( 100 );
                }
                if ( acked != 0 ) {
                  fprintf(stderr,"Ack of write operation timedout");
                  exit ( 1 );
                }
                fprintf(stderr," acked \n");
            }
	} else {
            for(j=0;j<(BYTES_PER_PAGE/MAX_BYTES);j++)
		if(eeprom_read(d,addr+i,j*MAX_BYTES,buf+(j*MAX_BYTES),MAX_BYTES)<0)
		    exit(1);
	}


	if(!rwmode && f>=0){
	    j=write(f,buf,sizeof(buf));
	    if(j!=sizeof(buf)){
		fprintf(stderr,"Cannot write to file '%s'\n",fn);
		perror(fn);
		exit(1);
	    }
	}

    }

    if(f>=0)
	close(f);

    close(d);

    exit(0);

}

2014年1月20日

T221/CDU2150A/E2210HDS/L465 でのマルチディスプレイ。

Filed under: 副業 — pinewell @ 9:38 AM

IBM T221/TOSHIBA CDU2150A/IIyama ProLite E2210HDS/EIZO FlexScan L465

札幌で買ったのだから、もう5年になるか?IBM T221にハマったのは。
3840×2400の広大なディスプレイでの開発作業は一度味わうともう元には戻れない。
T221をメインに、E2210HDSでブラウザ、L465でドキュメント確認とか。3画面を有意義に使用していた。
これはNvidiaのGeforce GTX650Tiで。
EDIDオーバーライドケーブルを使用しての3840×2400 34Hz DualLink-DVI。E2210HDSは1920×1080 HDMI。L465は1280×1024 D-subでのアナログ出力。

去年の暮れのことだったが、遅ればせながらTOSHIBA CDU2150Aの存在を知り値段も手ごろだったので購入。
T221が壊れた時の予備と思っていたのだが、自作の棚が測ったように収納にピッタリで設置が可能。
せっかくだから繋いでみようと思い立つ。
ハッキリ言って難儀した。しかも金もかかった。やれやれ。

目指すのは、下記。
先人の苦労によるとCDU2150Aはどう頑張っても3840×2400 34Hzが限界のようだ。
T221は3840×2400 48Hz。
E2210HDSは1920×1080 60Hz。
L465は1280×1024 60Hz。
いずれも32bitのフルカラー。

結果から書くとE2210HDSとL465は問題なし。
T221 は 3840×2400 34Hz。CDU2150Aは3840×2400 24Hzで妥協した。
構成と接続
Core i7 970
Radeon HD7790
DL-DVI— オーバーライドケーブル — T221 (3840x2400x34Hz)
HDMI — E2210HDS (1920x1080x60Hz)
DVI-I — L465 (1280x1024x60Hz)
Radeon HD7750
HDMI — 変換ケーブル SL-DVI —- CDU2150A (1920x2400x24Hz)
DP — 変換ケーブル HDMI-SLDVI- CDU2150A (1920x2400x24Hz)
OSはWindows8.1×64。10回くらい?インストールやバックアップからの復元をするハメになった。
DPからHDMIへの変換はHD7790で4画面はいけなかったのでアクティブではないのだろう。いつぞやに購入した安物。
HD7750のDVIに接続しなかったのは単にDVIの長目のケーブルが無かったから。
gamen

 

 

 

 

 

 

グラボはCDU~のためにはeyefinityを使わざるを得ず、NVIDIAからAMDに換装。久々のAMD(ATI)。
650Tiより上を目指すとHD7790。石は5画面までに対応しているので、これ1枚で足りるか?と思ったのだが。
実際届いてみるとD-DVI、S?-DVI-I、HDMI、DPの4つポート。最大4画面か。深く考えなかったな。
AMD2枚目をポチる。予算の都合でHD7750。こちらはD-DVI HDMI DPの3ポート。
元々動いていたWin8.1に上書きインストールをするが、結果Win8.1起動時にブラックアウト。
DHCPサーバーのログを見るとIPの取得もしていないのでグラフィックドライバーの読み込みでフリーズしているようだ。
この時点で使い慣れたWin8.1の環境を放棄することを決意せざるを得なかった。
デュアルBootでWin7x64もあったのだが、こちらも無限ようこそ病にかかり起動せず。
(あまり使ってはいなかったが)Win7環境も放棄することに。

サラの状態のSSDでRAID0を組み、Win8.1をインストール。
初期起動時は800×600なのだが、そのうちにWindowsがドライバーをどこかから探してくるのか?モニターを見つけた時点で?ブラックアウト。
原因は確かではないのだが、すかさずAMD Catalystを入れれば大丈夫のようだ。
モニターも最初は最低限のモニターをつなぐだけにしておく。ドライバーを入れた後に追加・検出したほうが良かった。
(電源の不足なのか一度勝手に再起動も、起動できず。再インストールなんてこともあったが。)

なにせWindows8.1にはセーフモード起動がない。
セーフモードで起動できるようにプロファイルを書き換えてもそこまで到達せずにフリーズしてしまう。
一度しくじるとバックアップから戻すか、再インストールをすることになる。

T221でのEDID6、2624×2400/1216×2400での48Hz化も試すがブラックアウトして起動できなくなった。
CDU2150Aでの1920x2400x34Hzx2はINFファイルのEDIDオーバーライドが面倒くさいので試すことすら辞めた。
オーバーライドケーブルを購入すれば簡単にはできそう。7,800円の出費は痛いが。

2013年12月27日

甜菜種子・ポットのとりまとめ。

Filed under: てんさい,とりまとめ — pinewell @ 12:20 PM

いつも過去資料を引っ張り出して時間がかかるのでまとめる。
あくまでウチの過去実績に基づく目安。発芽不良や生育不良は考慮しない。
6.5haで392冊 = 60/ha
6.1haで362冊 = 59/ha
5.9haで360冊 = 61/ha
4.8haで312冊 = 65/ha
用意した土の量で上下するのだが大体このくらい。
1haに60冊はいらないとする。
4.8haで312冊はだいぶ苗を余らした。
来年は5.1なので306冊。まぁ300冊で良いことにする。

種子はポット冊数 x 1400 = 420,000粒。

覆土用のリゾレックス。
300冊でリゾレックス8袋。
ペール缶10杯にリゾレックス2.5袋。
ペール缶10杯で100冊分?
2.5×3 = 7.5 切り上げ8袋のリゾレックスを用意した、と。
100冊で2.5袋と考えることにしよう。

タチガレンは100冊100cc、バリダシンは200冊500cc。

« Newer PostsOlder Posts »

Powered by WordPress