3

Odroid-C1 ボードで UBlox NEO-7M GPS 受信機を使用しようとしています。

デフォルトでは、GPS モジュールは SPI の最初のモードで動作します。そのため、このユーザー空間コード スニペットを使用して適切な SPI モードを選択します。

    int mode = SPI_MODE_0;

    ret = ioctl(spi_fd, SPI_IOC_WR_MODE, &mode);

    if (ret < 0) {
        perror("can't set spi mode");        
        exit(1);
    }   

その後、一度に 1 バイトずつ読み取って stdout に送信しようとしています。しかし、うまくいきません。

少し考えた後、Salaea のロジック アナライザーを接続して、この写真を取得しました。

spiモード

これはまったく正しくないようです。私が間違っていなければ、トランザクション間で SCL を Low に駆動する必要があります。

spicc.ko カーネル モジュールで SCL 行を下に引っ張って、この問題を修正しようとしました (モジュールをコンパイルするために、このカーネルを RT パッチと共に使用します。RT パッチは実際には何の違いもありません。この問題はバニラで経験されています。カーネルも同様です)。

したがって、主な問題は次のとおりです。このピンを引き下げるのは正しいことですか?

さらにコードを調べると、spicc_set_mode() がAmlogic S805 データシート(セクション 15.5.3 で CONREG レジスタ レイアウトについて説明) で説明されているようにモードを設定することに気付きました。多分それは十分ではありませんか?

いずれにせよ、Linux の pinctrl インターフェイスを使用してピンをプルダウンする意図された方法は何ですか?

また、spicc のコードを理解しようとしています。それは使用しています

ret = of_property_read_string(pdev->dev.of_node, "pinctrl-names", &prop_name);
if(ret || IS_ERR(prop_name)) {
    dev_err(&pdev->dev, "match pinctrl-names failed!\n");
    return -ENODEV;
}
pdata->pinctrl = devm_pinctrl_get_select(&pdev->dev, prop_name);
if(IS_ERR(pdata->pinctrl)) {
    dev_err(&pdev->dev, "pinmux error\n");
    return -ENODEV;
}
dev_info(&pdev->dev, "pinctrl_name = %s\n", prop_name);

デバイス ツリー Blob から pinctrl ハンドルを取得するには、そうではありませんか? .dts ファイルを編集してピンをプルダウンする必要がありますか?それとも実行時に実行できますか?

最初は、ばかげた残忍なコードで使用しようとしましたが、機能しませんでした (pinctrl は、spicc セクションの .dts ファイルで宣言されているように、このピンを既に使用しています)。

static void spicc_sclk_init(void)
{
    int ret;
    int gpio;
    char *owner = "spicc_sclk";
    char *pin_name = "GPIOX_8";

    gpio = amlogic_gpio_name_map_num(pin_name);

    if (gpio < 0) {
        printk(KERN_ERR "amlogic_gpio_name_map_num() failed. gpio: %d\n", gpio);
        goto out_map;
    }

    ret = amlogic_gpio_request(gpio, owner);

    if (ret < 0) {
        printk(KERN_ERR "amlogic_gpio_request_one() failed. ret: %d\n", ret);
        goto out_request;
    }

    ret = amlogic_set_pull_up_down(gpio, 0, owner);

    if (ret < 0) {
        printk(KERN_ERR "amlogic_set_pull_up_down() failed. ret: %d\n", ret);
        goto out_pull_up_down;
    }

out_pull_up_down:
out_request:
out_map:
    ;
}

この問題を修正する方法について何か提案はありますか?

PS: 同じ UBlox を持つ RPi で同じユーザー空間コードを使用すると、コードは機能し、モードは期待どおりに切り替わります。

別の SPI 駆動デバイスを Odroid-C1 に接続しようとしました (問題があれば、Invensense の MPU9260 でした)。私の推測では、SPI モードに対する耐性が高いだけです。

4

1 に答える 1

0

おそらく、この PIN の PIN 構成で内部プルアップが有効になっている可能性があります。SPI モードのいずれかが機能しているかどうかを確認できます。システムにプルアップがあるかどうかを確認するもう 1 つのポイント。また、アイドル状態で電圧を測定する価値があるかもしれません。

于 2015-06-25T11:48:53.857 に答える