2016-04-08 8 views
1

Ich bin neu ZedBoard. Mein ZedBoard läuft auf Xilinx Linux 2015.4 (devicetree.dtb, boot.bin und uImage werden manuell kompiliert; andere Dateien stammen aus dem Originalarchiv mit vorkompiliertem System). Ich erstelle sehr einfache FPGA-Konfiguration nur mit PS, AXI GPIO und LEDs. In Vivado Adresse kann ich diese Zeile sehen:Kernel-Treiber - ZedBoard - Linux hängt nach dem Zugriff auf die Adresse

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

Ich möchte eigene Kernel-Treiber für diese FPGA-Konfiguration erstellen, aber wenn ich Insert-Treiber in das System versuchen, hängt Linux wenn IORead/IOWrite Betrieb beginnt. Es gibt Code über init-Funktion:

#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; 
} 

Ich habe gesehen, Xilinx und ZedBoard Dokumentation aber ohne Ergebnis. Ich habe nach dem Einfügen des Moduls auf Xilinx einige Themen zum Hängen gefunden, aber das Problem lag in der Gerätebaumstruktur, in der fclk-enable deaktiviert war. Eigentlich benutze ich Standard DT ohne Änderungen und fclk-enable hat den Wert < 0xf>.

Ich schätze Ihre Hilfe. Danke im Voraus.

Antwort

0

Die CPU hängt, wenn sie Speichertransaktionen gegen die programmierbare Logik ausgibt und es keine Antwort gibt. Es gibt keinen integrierten Busfehler- oder Timeout-Mechanismus.

Hier sind einige der Gründe, warum ich dieses Problem gehabt haben:

  1. Programmierbare Logik ist nicht programmiert
  2. AXI Slave reagiert nicht an der richtigen Adresse
  3. Bug in AXI Slave

Eine Möglichkeit, dies zu debuggen, wäre die Verwendung des integrierten Logikanalysators zur Verfolgung der AXI-Schnittstelle.

+0

Danke für die Antwort. Eigentlich weiß ich, dass dieses Problem in ps7_post_config ist. Ich arbeite über die JTAG und mein Modul nicht verwenden Xilinx SDK wo kann diese Option aktiviert sein, so suche ich, wie diese Option in Vivado in Bitstream (Bitstream-Option?) Oder was andere Möglichkeiten möglich sind. – JARDA001

+0

Möglicherweise haben wir dieses Problem auch gesehen. Wir verwenden das Xilinx SDK auch nicht. Wir programmieren das Zynq im Allgemeinen über/dev/xdevcfg und nicht über JTAG. –

+0

Auf der Suche nach ps7_post_config habe ich eine XML-Datei mit einigen Prozessorregistern zum Aktualisieren gefunden. Ich denke, dass der xdevcfg-Treiber eine aufschlussreichere Methode sein kann, um festzustellen, welche Register aktualisiert werden müssen, nachdem die Logik programmiert wurde: https://github.com/Xilinx/linux-xlnx/blob/master/drivers/char/xilinx_devcfg.c –