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

2015年3月23日月曜日

FON2405EのGPIOでなんちゃってシリアル通信

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年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
 
一時的に使うのであれば、

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

ふーん。使えるかも!