2016-04-08 31 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配置自己的內核驅動程序,但是當我嘗試插入驅動程序到系統中,Linux的ioread/iowrite操作開始時掛起。 有關於初始化函數代碼:

#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文檔,但沒有結果。在Xilinx上插入模塊後,我發現幾個關於掛起的主題,但問題出在fclk-enable被禁用的設備樹上。實際上我使用默認的DT而沒有改變,並且fclk-enable的值爲< 0xf>。

我感謝您的幫助。提前致謝。

回答

0

如果CPU針對可編程邏輯發出內存事務並且沒有響應,則CPU將掛起。沒有內置的總線錯誤或超時機制。

這裏有一些我有這個問題的原因:

  1. 可編程邏輯沒有被編程
  2. AXI從沒有響應正確的地址
  3. 的Bug AXI從

調試的一種方法是使用集成邏輯分析儀來跟蹤AXI接口。

+0

感謝您的回覆。其實,我知道這個問題在ps7_post_config中。我在JTAG上工作,並且我的模塊不使用Xilinx SDK,因此可以啓用此選項,因此我正在尋找如何在Vivado中通過比特流(bitstream option?)提供此選項的方法或其他可行的方法。 – JARDA001

+0

我們也可能看到過這個問題。我們也不使用Xilinx SDK。我們通常通過/ dev/xdevcfg而不是JTAG對Zynq進行編程。 –

+0

正在搜索ps7_post_config,我找到了一個包含一些處理器寄存器的XML文件來更新。我認爲在編程邏輯之後,xdevcfg驅動程序可能更具指導性,以確定哪些寄存器需要更新:https://github.com/Xilinx/linux-xlnx/blob/master/drivers/char/xilinx_devcfg.c –