2016-04-08 3 views
1

新しいZedBoardです。私のZedBoardはXilinx Linux 2015.4(devicetree.dtb、boot.binとuImageは手動でコンパイルされ、その他のファイルはプリコンパイルされたシステムの元のアーカイブから作成されています)で動作します。 私は、PS、AXI GPIO、およびLEDのみで非常に単純なFPGAコンフィギュレーションを作成します。 Vivadoアドレスでは、私はこの行を見ることができます:カーネルドライバ - ZedBoard - アドレスへのアクセス後にLinuxがハングアップする

Cell  Slave Interface Base name Offset addr. Range High addr. 
axi_gpio_0 S_AXI   Reg  0x4120_0000 64K 0x4120_FFFF 

私はこのFPGAのコンフィギュレーションのための独自のカーネルドライバを作成したいが、私はシステムへの挿入ドライバをしようとすると、ioread/iowrite操作が開始したときに、Linuxがハングアップします。 init関数についてのコードがあります:

#define DEV_NAME "my_led_dev" 

dev_t dev_numbers; 
struct cdev *my_led_cdev; 
static unsigned long gpio_base = 0x41200000; 
struct resource *res; 


static int led_init(void) { 
    void* kernel_gpio_base; 

    /* Device registration */ 
    int state; 
    if ((state = alloc_chrdev_region(&dev_numbers, 0, 1, DEV_NAME)) != 0) 
    printk(KERN_ALERT "failed to register a region dynamically\n"); 
    else 
    printk(KERN_ALERT "major number = %d\n", MAJOR(dev_numbers)); 

    my_led_cdev = cdev_alloc(); 
    my_led_cdev->owner = THIS_MODULE; 

    state = cdev_add(my_led_cdev, dev_numbers, 1); 
    if(state < 0) { 
    printk(KERN_ALERT "device failed to be added\n"); 
    unregister_chrdev_region(dev_numbers, 1); 
    return -ENODEV; 
    } 
    printk (KERN_INFO "Device prepared\n"); 

    /* Get required resources. */ 
    res = request_mem_region(gpio_base, 0xFFFF, "my_gpio_led"); 
    if (res == NULL) { 
    printk(KERN_ALERT "my_gpio: can't get I/O port address 0x%lx\n", gpio_base); 
    return -ENODEV; 
    } 

    /* Port mapping */ 
    kernel_gpio_base = (void*) ioremap(gpio_base, 0xFFFF); 
    if (kernel_gpio_base == NULL) { 
    printk(KERN_ALERT "kernel remap my_gpio failed 0x%lx\n", gpio_base); 
    release_mem_region (res->start, 65536); 
    cdev_del(my_led_cdev); 
    unregister_chrdev_region(dev_numbers, 1); 
    return -ENODEV; 
    } 
    printk (KERN_INFO "Ports mapped\n"); 

    printk (KERN_INFO "Mapped port: %p", kernel_gpio_base); 
    printk (KERN_INFO "Actual value: %d\n", ioread32 (kernel_gpio_base)); // There is problem. This message isn't printed and system hangs. 
    iowrite8 (0xff, kernel_gpio_base); 

    return 0; 
} 

私はザイリンクスとZedBoardドキュメントを見たが、結果なしています。ザイリンクスにモジュールを挿入した後にハンギングに関する話題がいくつか見つかりましたが、fclk-enableが無効になっていたデバイスツリーに問題がありました。実際に私は変更なしでデフォルトのDTを使用し、fclk-enableは値< 0xf>を持っています。

ご協力いただきありがとうございます。前もって感謝します。

答えて

0

プログラマブルロジックに対してメモリトランザクションを発行し、応答がない場合、CPUはハングします。ビルトインバスエラーまたはタイムアウトメカニズムはありません。

  1. プログラマブルロジック
  2. AXIスレーブはAXIスレーブに右のアドレス
  3. バグに
が応答しないプログラムされていません。ここで

は、私はこの問題を抱えている理由のいくつかはあります

これをデバッグする1つの方法は、統合ロジックアナライザを使用してAXIインターフェイスをトレースすることです。

+0

返信いただきありがとうございます。実際には、問題はps7_post_configにあることを知っています。私はJTAGを使って作業していて、私のモジュールはXilinx SDKを使用していないので、このオプションを有効にすることができるので、Vivadoでこのオプションをビットストリーム(ビットストリームオプション?)で提供する方法や他の方法があります。 – JARDA001

+0

この問題も発生している可能性があります。ザイリンクスSDKも使用していません。私たちは一般的にJTAGではなく、/ dev/xdevcfg経由でZynqをプログラミングします。 –

+0

ps7_post_configを検索して、更新するプロセッサレジスタがいくつかあるXMLファイルが見つかりました。私は、xdevcfgドライバが、ロジックがプログラムされた後にどのレジスタを更新する必要があるかを判断するためにもっと有益な方法かもしれないと思う:https://github.com/Xilinx/linux-xlnx/blob/master/drivers/char/xilinx_devcfg.c –

関連する問題