• 車種別
  • パーツ
  • 整備手帳
  • ブログ
  • みんカラ+

ytak01のブログ一覧

2017年01月09日 イイね!

neGT-USBを使わずにRPiにダイレクトにネジコンをつなぐ(Part4)

前回
> でこれからは、GIMXのconfigがうまく設定出来ていないのでアクセルとブレーキがうまくマッピングされていない問題の検討です。

と書いたのですが、うまくマッピングされていないのではなく、gamecon_gpio_rpiのv1.2への変更点が効いていました。
v1.0ではないとうまく動かなかったので、v1.0にしたのですがv1.0だとブレーキにボタンとアナログ(axis)の両方がマッピングされてしまいどうやってもブレーキの設定が出来ない状態に陥っていました。

なので早い話、v1.2で変更された「clock周りのwaitをv1.0へ戻す」ほうが良かったようです。

最終的にv1.2からの変更点を載せておきます。

--- gamecon_gpio_rpi_1.2_org.c       2015-12-28 07:27:26.000000000 +0900
+++ gamecon_gpio_rpi_1.2_new.c       2017-01-09 23:10:40.016055100 +0900
@@ -46,11 +46,11 @@

 #define GPIO_BASE                (BCM2708_PERI_BASE + 0x200000) /* GPIO controller */

+static volatile unsigned *gpio;
+
 #define GPIO_SET *(gpio+7)
 #define GPIO_CLR *(gpio+10)

-static volatile unsigned *gpio;
-
 struct gc_config {
        int args[GC_MAX_DEVICES];
        unsigned int nargs;
@@ -619,8 +619,7 @@
  *
  */

-#define GC_PSX_DELAY   3               /* clock phase length in us. Valid clkfreq is 100kHz...500kHz. 2*udelay(3) results to ~250kHz on RPi1. */
-#define GC_PSX_DELAY2  25              /* delay between bytes. */
+#define GC_PSX_DELAY   10              /* 25 usec */
 #define GC_PSX_LENGTH  8               /* talk to the controller in bits */
 #define GC_PSX_BYTES   6               /* the maximum number of bytes to read off the controller */

@@ -631,12 +630,16 @@
 #define GC_PSX_RUMBLE  7               /* Rumble in Red mode */

 #define GC_PSX_CLOCK   (1<<18)         /* Pin 18 */
-#define GC_PSX_COMMAND (1<<14)         /* Pin 14 */
-#define GC_PSX_SELECT  (1<<15)         /* Pin 15 */
+#define GC_PSX_COMMAND (1<<16)         /* Pin 16 */
+#define GC_PSX_SELECT  (1<<17)         /* Pin 17 */

 #define GC_PSX_ID(x)   ((x) >> 4)      /* High nibble is device type */
 #define GC_PSX_LEN(x)  (((x) & 0xf) << 1)      /* Low nibble is length in bytes/2 */

+static int gc_psx_delay = GC_PSX_DELAY;
+module_param_named(psx_delay, gc_psx_delay, uint, 0);
+MODULE_PARM_DESC(psx_delay, "Delay when accessing Sony PSX controller (usecs)");
+
 static const short gc_psx_abs[] = {
        ABS_HAT0X, ABS_HAT0Y, ABS_RX, ABS_RY, ABS_X, ABS_Y
 };
@@ -659,15 +662,14 @@

        for (i = 0; i < GC_PSX_LENGTH; i++, b >>= 1) {

-               GPIO_CLR = GC_PSX_CLOCK;
-
                if (b & 1)
                        GPIO_SET = GC_PSX_COMMAND;
                else
                        GPIO_CLR = GC_PSX_COMMAND;
-
-               udelay(GC_PSX_DELAY);
-        GPIO_SET = GC_PSX_CLOCK;
+
+               GPIO_CLR = GC_PSX_CLOCK;
+
+               udelay(gc_psx_delay);

                read = *(gpio+13);

@@ -678,10 +680,10 @@
                                data[j] |= (read & gc_status_bit[j]) ? (1 << i) : 0;
                }

-               udelay(GC_PSX_DELAY);
+               GPIO_SET = GC_PSX_CLOCK;
+
+               udelay(gc_psx_delay);
        }
-
-    udelay(GC_PSX_DELAY2);
 }

 /*
@@ -697,14 +699,14 @@
        unsigned long flags;
        unsigned char data2[GC_MAX_DEVICES];

-    local_irq_save(flags);
-
        /* Select pad */
        GPIO_SET = GC_PSX_CLOCK | GC_PSX_SELECT;
-
+       udelay(gc_psx_delay);
        /* Deselect, begin command */
        GPIO_CLR = GC_PSX_SELECT;
-       udelay(GC_PSX_DELAY2);
+       udelay(gc_psx_delay);
+
+       local_irq_save(flags);

        gc_psx_command(gc, 0x01, data2);        /* Access pad */
        gc_psx_command(gc, 0x42, id);           /* Get device ids */
@@ -1146,9 +1148,20 @@
        if (gc->pad_count[GC_PSX] ||
                gc->pad_count[GC_DDR]) {

-               /* set clk, cmd & sel pins to OUTPUT */
+               /* set clk, cmd & sel pins to OUTPUT
+                       12 = GPIO14(CMD)
+                       15 = GPIO15(SEL)
+                       24 = GPIO18(CLK)
+                               to
+                       18 = GPIO16(CMD)
+                       21 = GPIO17(SEL)
+                       24 = GPIO18(CLK)
+
                *(gpio+1) &= ~((7<<12) | (7<<15) | (7<<24));
                *(gpio+1) |= ((1<<12) | (1<<15) | (1<<24));
+               */
+               *(gpio+1) &= ~((7<<18) | (7<<21) | (7<<24));
+               *(gpio+1) |= ((1<<18) | (1<<21) | (1<<24));
        }

        return gc;
@@ -1190,6 +1203,9 @@
        if (gc_cfg.nargs < 1) {
                pr_err("at least one device must be specified\n");
                return -EINVAL;
+       } else if ((gc_psx_delay < 1) || (gc_psx_delay > 50)) {
+               pr_err("Invalid psx_delay (1-50 allowed)\n");
+               return -EINVAL;
        } else {
                gc_base = gc_probe(gc_cfg.args, gc_cfg.nargs);
                if (IS_ERR(gc_base))
Posted at 2017/01/09 23:57:08 | コメント(0) | トラックバック(0) | gimx | 趣味
2017年01月09日 イイね!

neGT-USBを使わずにRPiにダイレクトにネジコンをつなぐ(Part3)

とりあえず

ゼロテック <-> neGT-USB <-> RaspberryPi3(+DS4) <-> Arduino <-> PS4



ゼロテック <-> RaspberryPi3(+DS4) <-> Arduino <-> PS4

にして動作するところまでは出来ました。

Fritzingで実体図的な物を書いてみました。



真ん中のユニバーサル基板をRPi3の上に載せる感じです。

RS-232Cはネジコン(ゼロテック)を結線します。

でこれからは、GIMXのconfigがうまく設定出来ていないのでアクセルとブレーキがうまくマッピングされていない問題の検討です。

前回もここで苦戦したんだよなぁ
Posted at 2017/01/09 10:01:12 | コメント(0) | トラックバック(0) | gimx | 趣味
2017年01月08日 イイね!

neGT-USBを使わずにRPiにダイレクトにネジコンをつなぐ(Part2)

gameconのCLK,SELがUARTのTXD0,RXD0と被っている問題やっと解決したー

もう遅いので詳細は明日書きますが、やったことはgameconで使用しているTXD0,RXD0をそれぞれGPIO16,GPIO17に変更しました。

これでUARTが普通に使えるはずなので、UARTとArduinoを繋げば極力無駄なIFを省くことが可能かと

とりあえずdiff載せときます。

--- gamecon_gpio_rpi_org.c      2015-02-28 05:22:03.999993500 +0900
+++ gamecon_gpio_rpi_new.c      2017-01-08 02:27:53.309923619 +0900
@@ -45,11 +45,11 @@

 #define GPIO_BASE                (BCM2708_PERI_BASE + 0x200000) /* GPIO controller */

+static volatile unsigned *gpio;
+
 #define GPIO_SET *(gpio+7)
 #define GPIO_CLR *(gpio+10)

-static volatile unsigned *gpio;
-
 struct gc_config {
        int args[GC_MAX_DEVICES];
        unsigned int nargs;
@@ -562,8 +562,8 @@
 #define GC_PSX_RUMBLE  7               /* Rumble in Red mode */

 #define GC_PSX_CLOCK   (1<<18)         /* Pin 18 */
-#define GC_PSX_COMMAND (1<<14)         /* Pin 14 */
-#define GC_PSX_SELECT  (1<<15)         /* Pin 15 */
+#define GC_PSX_COMMAND (1<<16)         /* Pin 16 */
+#define GC_PSX_SELECT  (1<<17)         /* Pin 17 */

 #define GC_PSX_ID(x)   ((x) >> 4)      /* High nibble is device type */
 #define GC_PSX_LEN(x)  (((x) & 0xf) << 1)      /* Low nibble is length in bytes/2 */
@@ -1026,9 +1026,20 @@
        if (gc->pad_count[GC_PSX] ||
                gc->pad_count[GC_DDR]) {

-               /* set clk, cmd & sel pins to OUTPUT */
+               /* set clk, cmd & sel pins to OUTPUT
+                       12 = GPIO14(CMD)
+                       15 = GPIO15(SEL)
+                       24 = GPIO18(CLK)
+                               to
+                       18 = GPIO16(CMD)
+                       21 = GPIO17(SEL)
+                       24 = GPIO18(CLK)
+
                *(gpio+1) &= ~((7<<12) | (7<<15) | (7<<24));
                *(gpio+1) |= ((1<<12) | (1<<15) | (1<<24));
+               */
+               *(gpio+1) &= ~((7<<18) | (7<<21) | (7<<24));
+               *(gpio+1) |= ((1<<18) | (1<<21) | (1<<24));
        }

        return gc;
Posted at 2017/01/08 02:50:04 | コメント(0) | トラックバック(0) | gimx | 趣味
2017年01月07日 イイね!

neGT-USBを使わずにRPiにダイレクトにネジコンをつなぐ(Part1)

とりあえずやったこと

・LinuxのkernelドライバーにPS1(spi)のドライバーがあるらしい
・RPi用にgamecon_gpio_rpiと言うのがある
https://github.com/RetroPie/RetroPie-Setup/wiki/GPIO-Modules#gamecon_gpio_rpi

ハードウェア的な結線を参考にしたページ
http://wordpress.ideacompo.com/?p=5850
http://blug00.blogspot.jp/2016/03/retropie-gamecon-driver-readme-friendlier.html

GIMXとして使わないときはRetroPieとして使おうと思うのでRetroPieのセットアップから行いました。
なので下地はRetroPieです。

RetroPieのメニューからgamecon driverをインストールするも何か動きがおかしい
今使っているのはRPi3でWebを検索しているとRPi2の話ばかりしか出てこない
いろいろ見ていくと現時点の最新版はv1.2だがv1.0まではpsx_delayと言うパラメータがあるっぽい
動作クロックが2と3で違うからpsx_delayを調整してみたかったんだけどv1.0までしか無いのでv1.0へダウングレードする

RetroPieのセットアップもここからdebファイルを取得している模様
https://www.niksula.hut.fi/~mhiienka/Rpi/

wget https://www.niksula.hut.fi/~mhiienka/Rpi/gamecon-gpio-rpi-dkms_1.0_all.deb
sudo dpkg -i gamecon-gpio-rpi-dkms_1.0_all.deb

でダウングレードした後に

sudo modprobe gamecon_gpio_rpi map=0,0,7,7,0,0 psx_delay=30

を行ったところあっさりPS1コントローラもネジコンも動きました。
psx_delayの値を小さくしすぎるとfreezeする
最低でも30くらいが良さそうな感じ
この辺りはオシロも無いので適当で

で、これでspiは出来たんだけど次はUART用のTXD0,RXD0とgameconが使っているGPIO14,GPIO15がモロかぶりなので、gameconのドライバ側で別のポートに出来ないかどうか検討です。
Posted at 2017/01/07 14:42:47 | コメント(0) | トラックバック(0) | gimx | 趣味
2016年12月28日 イイね!

PS4でネジコン(ゼロテック)を使おう

GT Sportの発売延期が決定して恐らく半年は期間があるだろうと思われるので、その間にネジコン(ゼロテック)をPS4で動かそうと思います。

と言うか、もう動いてます。

組み合わせ的にはnonnonさんが作成されたneGT-USBを使い

ゼロテック <-> neGT-USB <-> RaspberryPi3(+DS4) <-> Arduino <-> PS4

と言う感じになっています。

ちょっと苦労しましたがなんとか動いてDRIVE CLUBは普通に出来ています。

現在、やろうと思っているのはPSコントローラはSPI通信なのでなんとかneGT-USBを使わずにゼロテックをダイレクトにRPi3につなげれないだろうか?と言うところです。

RetroPiにそのドライバがあるので、恐らく出来そう
(RPi3とArduinoがUART結線になっているので、GPIO14,15がかぶる為ソース修正は必要)

時間があったら今までやったことをメモとして書いていこうと思います。
Posted at 2016/12/28 23:48:46 | コメント(1) | トラックバック(0) | gimx | 趣味

プロフィール

「GIMXがPS5で動いた~~~!!! http://cvw.jp/b/1799061/45524956/
何シテル?   10/08 22:18
ytak01と言う者です。 貧乏な車好きのおっさんです。 この度86購入しました。 よろしくお願いします。
みんカラ新規会員登録

ユーザー内検索

<< 2025/8 >>

     12
3456789
10111213141516
17181920212223
24252627282930
31      

ブログカテゴリー

リンク・クリップ

[トヨタ 86]スバル(純正) E型用 パワーステアリング コンピュータASSY 
カテゴリ:その他(カテゴリ未設定)
2022/06/13 15:24:19
実験君(ヘッドライト編 パート2) 
カテゴリ:その他(カテゴリ未設定)
2019/02/21 18:27:48
ブルーエリア / ネッツトヨタ東埼玉 リアスタビブラケット 
カテゴリ:その他(カテゴリ未設定)
2018/08/01 07:36:34

愛車一覧

トヨタ 86 トヨタ 86
5月M納車です
トヨタ シエンタハイブリッド トヨタ シエンタハイブリッド
4月納車です
トヨタ MR2 トヨタ MR2
MR2に乗っていました。
日産 シルビア 日産 シルビア
シルビアに乗っていました。

過去のブログ

2020年
01月02月03月04月05月06月
07月08月09月10月11月12月
2018年
01月02月03月04月05月06月
07月08月09月10月11月12月
2017年
01月02月03月04月05月06月
07月08月09月10月11月12月
2016年
01月02月03月04月05月06月
07月08月09月10月11月12月
2013年
01月02月03月04月05月06月
07月08月09月10月11月12月
ヘルプ利用規約サイトマップ
© LY Corporation