Help with RaspberryPI USB on Fiasco.OC+Genode

Reinier Millo Sánchez rmillo at ...210...
Tue Mar 24 05:20:18 CET 2015


Hi Norman

Thanks for your suggestions. I have reviewed the interrupt controller on 
Fiasco.OC and have tried to compare it with the interrupt controller on 
base-hw. After that and a little search on Google about the 
RaspberryPI's interrupts 
(http://xinu.mscs.mu.edu/BCM2835_Interrupt_Controller), I have 
understood the problem, and fixed it.

On 03/23/2015 08:08 AM, Norman Feske wrote:
> Hello Reinier,
>
>> After that, I have tried to log the USB driver IRQ, setting
>>
>>      #define DEBUG_IRQ        1
>>
>> in the file
>>
>>      repos/dde_linux/src/lib/usb/include/lx_emul.h
>>
>> Setting this value, the USB driver will log every IRQ handled by the
>> function *_handle()* and *_handle_one()***in the USB driver. In the
>> Genode bare metal hardware it works fine, but when tried it with
>> Fiasco.OC, the IRQ handler *_handle()* and *_handle_one()* are never logged.
> apparently, the USB driver initializes the USB controller (so the SoF
> interrupts start appearing at the kernel) but it never receives any
> interrupt. The issue could be the way of how IRQs are named by Fiasco.OC
> and base-hw. Because of the hierarchic way of how the BCM's IRQ
> controller works, the OS kernel developer has to come up with an
> enumeration scheme. The scheme I introduced for the base-hw kernel is
> defined at repos/base/include/platform/rpi/drivers/board_base.h:
>
>
> https://github.com/genodelabs/genode/blob/master/repos/base/include/platform/rpi/drivers/board_base.h
>
> /*
>   * IRQ numbers 0..7 refer to the basic IRQs.
>   * IRQ numbers 8..39 refer to GPU IRQs 0..31.
>   * IRQ numbers 40..71 refer to GPU IRQs 32..63.
>   */
Fiasco.OC use an scheme very similar to base-hw but change the 
numeration of the interrupts. In Fiasco.OC the USB interrupt correspond 
to number 9, not 17.
> The DWC-OTG controller uses IRQ 17. So it is not a basic IRQ. Hence, its
> number is subjected to the enumeration scheme above. I do not know how
> Fiasco.OC's naming scheme for IRQs on the Raspberry Pi looks like but it
> may be different. To investigate, I'd recommend you to instrument both
> kernels to log the accesses to the interrupt-controller registers. Look
> if each of them touch the same bits once the USB driver is started.
>
> Cheers
> Norman
>
There is a patch with small changes on Genode to allow compile the USB 
Driver for base-hw y foc-rpi:

    ------------- repos/base/include/platform/rpi/drivers/board_base.h
    -------------
    index 2cca3f6..139337f 100644
    @@ -23,7 +23,7 @@ namespace Genode
          {
              enum {
                  RAM_0_BASE = 0x00000000,
    -            RAM_0_SIZE = 0x10000000, /* XXX ? */
    +            RAM_0_SIZE = 0x20000000, /* XXX ? */

                  MMIO_0_BASE = 0x20000000,
                  MMIO_0_SIZE = 0x02000000,

    ---------------- repos/dde_linux/include/usb/foc_rpi/usb_irq.h
    ----------------
    new file mode 100644
    index 0000000..a99b10a
    @@ -0,0 +1,14 @@
    +/*
    + * \brief  USB: DWC-OTG RaspberryPI Interrupt (base-foc)
    + * \author Reinier Millo Sánchez
    +  * \date   2015-03-23
    + */
    +
    +#ifndef _INCLUDE_USB_IRQ_H_
    +#define _INCLUDE_USB_IRQ_H_
    +
    +enum{
    +    DWC_IRQ  = 9,
    +};
    +
    +#endif /* _INCLUDE_USB_IRQ_H_ */

    ----------------- repos/dde_linux/include/usb/hw_rpi/usb_irq.h
    -----------------
    new file mode 100644
    index 0000000..bcf7913
    @@ -0,0 +1,14 @@
    +/*
    + * \brief  USB: DWC-OTG RaspberryPI Interrupt (base-hw)
    + * \author Reinier Millo Sánchez
    +  * \date   2015-03-23
    + */
    +
    +#ifndef _INCLUDE_USB_IRQ_H_
    +#define _INCLUDE_USB_IRQ_H_
    +
    +enum{
    +    DWC_IRQ  = 17,
    +};
    +
    +#endif /* _INCLUDE_USB_IRQ_H_ */

    -------------------- repos/dde_linux/lib/mk/foc_rpi/usb.mk
    --------------------
    new file mode 100644
    index 0000000..df03613
    @@ -0,0 +1,3 @@
    +include $(REP_DIR)/lib/mk/usb_rpi.inc
    +
    +INC_DIR += $(REP_DIR)/include/usb/foc_rpi
    \ No newline at end of file

    ------------------ repos/dde_linux/lib/mk/platform_rpi/usb.mk
    ------------------
    index 4021104..5a7f1ea 100644
    @@ -1,48 +1,3 @@
    -SRC_C += \
    -    usb/host/dwc_otg/dwc_otg/dwc_otg_adp.c \
    -    usb/host/dwc_otg/dwc_otg/dwc_otg_attr.c \
    -    usb/host/dwc_otg/dwc_otg/dwc_otg_cfi.c \
    -    usb/host/dwc_otg/dwc_otg/dwc_otg_cil.c \
    -    usb/host/dwc_otg/dwc_otg/dwc_otg_cil_intr.c \
    -    usb/host/dwc_otg/dwc_otg/dwc_otg_driver.c \
    -    usb/host/dwc_otg/dwc_otg/dwc_otg_hcd.c \
    -    usb/host/dwc_otg/dwc_otg/dwc_otg_hcd_ddma.c \
    -    usb/host/dwc_otg/dwc_otg/dwc_otg_hcd_intr.c \
    -    usb/host/dwc_otg/dwc_otg/dwc_otg_hcd_linux.c \
    -    usb/host/dwc_otg/dwc_otg/dwc_otg_hcd_queue.c
    +include $(REP_DIR)/lib/mk/usb_rpi.inc

    -SRC_C += \
    -    usb/host/dwc_otg/dwc_common_port/dwc_cc.c \
    -    usb/host/dwc_otg/dwc_common_port/dwc_common_linux.c \
    -    usb/host/dwc_otg/dwc_common_port/dwc_crypto.c \
    -    usb/host/dwc_otg/dwc_common_port/dwc_dh.c \
    -    usb/host/dwc_otg/dwc_common_port/dwc_mem.c \
    -    usb/host/dwc_otg/dwc_common_port/dwc_modpow.c \
    -    usb/host/dwc_otg/dwc_common_port/dwc_notifier.c
    -
    -SRC_C += net/usb/usbnet.c net/usb/smsc95xx.c
    -
    -include $(REP_DIR)/lib/mk/usb.inc
    -include $(REP_DIR)/lib/mk/armv6/usb.inc
    -
    -CC_OPT  += -DDWC_LINUX -DPLATFORM_INTERFACE
    -
    -# needed for 'ehci-hcd.c', which we don't use on the rpi, but it is
    still
    -# part of the generic usb USB driver
    -CC_OPT += -DCONFIG_USB_EHCI_PCI=1
    -
    -# for 'dwc_otg_hcd_linux.c' for enabling the FIQ, which we don't
    use anyway
    -CC_OPT  += -DINTERRUPT_VC_USB=9
    -
    -# for 'dwc_otg_driver.c' for preventing calls to set_irq_type
    -CC_OPT  += -DIRQF_TRIGGER_LOW=1
    -
    -INC_DIR += $(LX_CONTRIB_DIR)/drivers/usb/host/dwc_otg/dwc_common_port \
    -           $(LX_CONTRIB_DIR)/drivers/usb/host/dwc_otg/dwc_otg
    -SRC_CC  += platform.cc
    -
    -vpath platform.cc $(LIB_DIR)/arm/platform_rpi
    -vpath %.c         $(LX_CONTRIB_DIR)/drivers/net/usb
    -
    -# enable C++11 support
    -CC_CXX_OPT += -std=gnu++11
    +INC_DIR += $(REP_DIR)/include/usb/hw_rpi
    \ No newline at end of file

    ---------------------- repos/dde_linux/lib/mk/usb_rpi.inc
    ----------------------
    similarity index 100%
    copy from repos/dde_linux/lib/mk/platform_rpi/usb.mk
    copy to repos/dde_linux/lib/mk/usb_rpi.inc

    ----------------------- repos/dde_linux/run/usb_hid.run
    -----------------------
    index 714d55d..a3ced48 100644
    @@ -13,6 +13,7 @@ lappend_if [have_spec acpi] build_components
    drivers/acpi
      lappend_if [have_spec pci]              build_components drivers/pci
      lappend_if [have_spec pci]              build_components
    drivers/pci/device_pd
      lappend_if [have_spec platform_arndale] build_components
    drivers/platform
    +lappend_if [have_spec platform_rpi] build_components drivers/platform
      lappend_if [have_spec gpio]             build_components drivers/gpio

      build $build_components
    @@ -48,6 +49,13 @@ append_if [have_spec platform_arndale] config {
                  <provides><service name="Regulator"/></provides>
              </start>}

    +append_if [have_spec platform_rpi] config {
    +    <start name="platform_drv">
    +        <resource name="RAM" quantum="1M"/>
    +        <provides><service name="Platform"/></provides>
    +        <config/>
    +    </start>}
    +
      append_if [have_spec gpio] config {
          <start name="gpio_drv">
              <resource name="RAM" quantum="4M"/>
    @@ -107,6 +115,7 @@ lappend_if [have_spec acpi] boot_modules acpi_drv
      lappend_if [have_spec pci]              boot_modules pci_drv
      lappend_if [have_spec nova]             boot_modules pci_device_pd
      lappend_if [have_spec platform_arndale] boot_modules platform_drv
    +lappend_if [have_spec platform_rpi] boot_modules platform_drv
      lappend_if [have_spec gpio]             boot_modules gpio_drv

      build_boot_image $boot_modules

    ----------- repos/dde_linux/src/lib/usb/arm/platform_rpi/platform.cc
    -----------
    index ae7654f..4c0a05d 100644
    @@ -29,6 +29,9 @@
      #include <dwc_otg_dbg.h>
      #undef new

    +#include <usb_irq.h>
    +
    +
      using namespace Genode;


    @@ -39,8 +42,6 @@ using namespace Genode;
      enum {
          DWC_BASE = 0x20980000,
          DWC_SIZE = 0x20000,
    -
    -    DWC_IRQ  = 17,
      };

Now I'll try more complex examples on Fiasco.OC+Genode.

Best regards

-- 
Lic. Reinier Millo Sánchez
Centro de Estudios de Informática
Universidad Central "Marta Abreu" de Las Villas

"antes de discutir ... respira;
   antes de hablar ... escucha;
  antes de escribir ... piensa;
   antes de herir ... siente;
  antes de rendirte ... intenta;
   antes de morir ... vive"

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.genode.org/pipermail/users/attachments/20150324/56cfd342/attachment.html>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: rmillo.vcf
Type: text/x-vcard
Size: 519 bytes
Desc: not available
URL: <http://lists.genode.org/pipermail/users/attachments/20150324/56cfd342/attachment.vcf>


More information about the users mailing list