GPIOの制御が少しわかってきたので、
前回、同期シリアル通信の下準備を行った。
汎用性とか考えると、やっぱりUART(調歩シリアル通信)をやってみたくなり、
ドライバ部分を書き換えてみた。
実験なので、通信速度は9600bpsで、パリティなし、ストップビットは1ビットとした。
やっていることは、結構単純で、1クロック分=1^6μs ÷9600=104μs分ごとにデータを出力するというもの。
http://www5b.biglobe.ne.jp/~kouta_y/news/newsvb/vb14.html
まず、比較のためにFT232RLにて'a'の1文字を送信した場合
調べたとおり、104μsになっていた。
これを目指して、作ってみよう。
linux-2.6.21.x/drivers/char/ralink_gpio.cに追記
80行目付近にある[int ralink_gpio_ioctl]のcase文に
case RALINK_GPIO_UART_SEND:
base_delay = 104;
c = (unsigned char)(arg & 0xFFl);
if (0L <= idx && idx < RALINK_GPIO_DATA_LEN) {
tmp =le32_to_cpu(*(volatile u32 *)(RALINK_REG_PIODATA));
//H
tmp2 = tmp | (1L << idx);
*(volatile u32 *)(RALINK_REG_PIODATA)= cpu_to_le32(tmp2);
udelay(base_delay*3);
//start_bit(L)
tmp2 = tmp & ~(1L << idx);
*(volatile u32 *)(RALINK_REG_PIODATA)= cpu_to_le32(tmp2);
udelay(base_delay);
//data loop
for(i=0; i<8; i++){
if((c & mask) > 0){
//h
tmp2 = tmp | (1L << idx);
}else{
//l
tmp2 = tmp & ~(1L << idx);
}
*(volatile u32 *)(RALINK_REG_PIODATA)= cpu_to_le32(tmp2);
udelay(base_delay);
mask = mask <<1;
}
//stop bit
tmp2 = tmp | (1L << idx);
*(volatile u32 *)(RALINK_REG_PIODATA)= cpu_to_le32(tmp2);
udelay(base_delay*3);
}else
return -EINVAL;
break;
この結果が以下の通り
まぁなんとかそれっぽいものがでてきた。
いざ受信させて見ると、10回に1回くらい取りこぼしてしまう。
(成功の場合)
(失敗の場合)
データの中間くらいが間延びしているように見える・・・。
なーぜーー
2015年3月23日月曜日
2015年2月1日日曜日
GW-USMicroNとWLI-UC-GNをラズベリーパイで使う
この前、リサイクルショップで、GW-USMicroNが300円で売られていた。
小さくて可愛いのでついつい買ってしまった。
以前から持っているWLI-UC-GNと同じくらいの大きさ!
この大きさはラズベリー・パイに丁度いいと思い、早速接続ー
結論から書くと、2つとも同じドライバーで使えたのだ。
ベンダーIDとプロダクトIDは以下の通り。
GW-USMicroN は2019 ed14
WLI-UC-GNは0411 015d
一時的に使うのであれば、
恒久的に使うのであれば、
/etc/udev/rules.d/99-wireless.rules
/etc/modprobe.d/wireless.conf
やっぱり、ラズベリー・パイは情報が多くていいね!
小さくて可愛いのでついつい買ってしまった。
以前から持っているWLI-UC-GNと同じくらいの大きさ!
この大きさはラズベリー・パイに丁度いいと思い、早速接続ー
結論から書くと、2つとも同じドライバーで使えたのだ。
ベンダーIDとプロダクトIDは以下の通り。
GW-USMicroN は2019 ed14
WLI-UC-GNは0411 015d
一時的に使うのであれば、
modprobe
rt2800usb
echo
2019 ed14 > /sys/bus/usb/drivers/rt2800usb/new_id
恒久的に使うのであれば、
/etc/udev/rules.d/99-wireless.rules
#
PLANEX GW-USMicroN
ACTION=="add",
SUBSYSTEM=="usb", ATTR{idVendor}=="2019",
ATTR{idProduct}=="ed14", RUN+="/sbin/modprobe -qba
rt2800usb"
#
BUFFALO WLI-UC-GN
ACTION=="add",
SUBSYSTEM=="usb", ATTR{idVendor}=="0411",
ATTR{idProduct}=="015d", RUN+="/sbin/modprobe -qba
rt2800usb"
/etc/modprobe.d/wireless.conf
#
PLANEX GW-USMicroN
install
rt2800usb /sbin/modprobe --ignore-install rt2800usb $CMDLINE_OPTS;
/bin/echo "2019 ed14" >
/sys/bus/usb/drivers/rt2800usb/new_id
#
BUFFALO WLI-UC-GN
install
rt2800usb /sbin/modprobe --ignore-install rt2800usb $CMDLINE_OPTS;
/bin/echo "0411 015d" >
/sys/bus/usb/drivers/rt2800usb/new_id
やっぱり、ラズベリー・パイは情報が多くていいね!
----------------------------
ちなみに、前書いたGPIOの制御、ネットで調べたら使い方が書いてあった。
処理中(0.2s点灯、0.1s消灯を繰り返す)
gpio
l <gpio> 2 1 4000 0 4000
エラー(0.1s点灯、0.1s消灯を繰り返す)
gpio
l <gpio> 1 1 4000 0 4000
ふーん。使えるかも!
登録:
投稿 (Atom)