[PATCH] Adding functionalities to Mailbox RPi

Gedare Bloom gedare at rtems.org
Thu Jun 23 16:21:42 UTC 2016


On Mon, Jun 20, 2016 at 5:17 PM, Mudit Jain <muditjain18011995 at gmail.com> wrote:
> From: muditj <spark1729 at yahoo.com>
>
> Added functions for retrieving firmware revision,
> board model and board revision.
> ---
>  c/src/lib/libbsp/arm/raspberrypi/include/vc.h      | 19 +++++++
>  c/src/lib/libbsp/arm/raspberrypi/misc/vc.c         | 60 ++++++++++++++++++++++
>  c/src/lib/libbsp/arm/raspberrypi/misc/vc_defines.h | 20 ++++++++
>  3 files changed, 99 insertions(+)
>
> diff --git a/c/src/lib/libbsp/arm/raspberrypi/include/vc.h b/c/src/lib/libbsp/arm/raspberrypi/include/vc.h
> index 4e91fde..dbf9812 100644
> --- a/c/src/lib/libbsp/arm/raspberrypi/include/vc.h
> +++ b/c/src/lib/libbsp/arm/raspberrypi/include/vc.h
> @@ -135,6 +135,25 @@ typedef struct
>
>  int
>  bcm2835_mailbox_get_vc_memory(bcm2835_get_vc_memory_entries* _entries);
> +
> +typedef struct
> +{
Put { on previous line. Be consistent and consider using a tool to
check style conformance:
https://devel.rtems.org/wiki/Developer/Coding/Conventions#Tools

> +  uint32_t fw_rev;
> +} bcm2835_mailbox_get_fw_rev_entries;
> +
> +int
> +bcm2835_mailbox_get_firmware_revision(bcm2835_mailbox_get_fw_rev_entries* _entries);
> +
> +typedef struct
> +{
> +  uint32_t spec;
> +} bcm2835_get_board_spec_entries;
> +
> +int
> +bcm2835_mailbox_get_board_model(bcm2835_get_board_spec_entries* _entries);
> +
> +int
> +bcm2835_mailbox_get_board_revision(bcm2835_get_board_spec_entries* _entries);
>  /** @} */
>
>  #endif /* LIBBSP_ARM_RASPBERRYPI_VC_H */
> diff --git a/c/src/lib/libbsp/arm/raspberrypi/misc/vc.c b/c/src/lib/libbsp/arm/raspberrypi/misc/vc.c
> index 91f9174..d27668d 100644
> --- a/c/src/lib/libbsp/arm/raspberrypi/misc/vc.c
> +++ b/c/src/lib/libbsp/arm/raspberrypi/misc/vc.c
> @@ -278,3 +278,63 @@ bcm2835_mailbox_get_vc_memory(bcm2835_get_vc_memory_entries* _entries)
>      return -2;
>    return 0;
>  }
> +
> +int
> +bcm2835_mailbox_get_firmware_revision(bcm2835_mailbox_get_fw_rev_entries* _entries)
> +{
> +  struct{
> +    bcm2835_mbox_buf_hdr hdr;
> +    bcm2835_mbox_tag_get_fw_rev get_fw_rev;
> +    uint32_t end_tag;
> +  }buffer BCM2835_MBOX_BUF_ALIGN_ATTRIBUTE;
Add some white space around brackets. Generally, this is a dense
function to read. Also, not sure why there is locally defined struct
here, should this struct be defined elsewhere? It looks like the exact
same struct is used below with slightly different field names only.

> +  BCM2835_MBOX_INIT_BUF(&buffer);
> +  BCM2835_MBOX_INIT_TAG_NO_REQ(&buffer.get_fw_rev,
> +    BCM2835_MAILBOX_TAG_FIRMWARE_REVISION);
> +  bcm2835_mailbox_buffer_flush_and_invalidate(&buffer, sizeof(&buffer));
does sizeof(&buffer) work as you expect? or do you want sizeof(buffer)?

> +  if (bcm2835_mailbox_send_read_buffer(&buffer))
> +    return -1;
> +  _entries->fw_rev = buffer.get_fw_rev.body.resp.rev;
> +  if( !bcm2835_mailbox_buffer_suceeded(&buffer.hdr) )
> +    return -2;
It would be nice to have defined error codes.

The same comments apply below.

> +  return 0;
> +}
> +
> +int
> +bcm2835_mailbox_get_board_model(bcm2835_get_board_spec_entries* _entries)
> +{
> +  struct{
> +    bcm2835_mbox_buf_hdr hdr;
> +    bcm2835_mbox_tag_get_board_spec get_board_model;
> +    uint32_t end_tag;
> +  }buffer BCM2835_MBOX_BUF_ALIGN_ATTRIBUTE;
> +  BCM2835_MBOX_INIT_BUF(&buffer);
> +  BCM2835_MBOX_INIT_TAG_NO_REQ(&buffer.get_board_model,
> +    BCM2835_MAILBOX_TAG_GET_BOARD_MODEL);
> +  bcm2835_mailbox_buffer_flush_and_invalidate(&buffer, sizeof(&buffer));
> +  if (bcm2835_mailbox_send_read_buffer(&buffer))
> +    return -1;
> +  _entries->spec = buffer.get_board_model.body.resp.spec;
> +  if( !bcm2835_mailbox_buffer_suceeded(&buffer.hdr) )
> +    return -2;
> +  return 0;
> +}
> +
> +int
> +bcm2835_mailbox_get_board_revision(bcm2835_get_board_spec_entries* _entries)
> +{
> +  struct{
> +    bcm2835_mbox_buf_hdr hdr;
> +    bcm2835_mbox_tag_get_board_spec get_board_revision;
> +    uint32_t end_tag;
> +  }buffer BCM2835_MBOX_BUF_ALIGN_ATTRIBUTE;
> +  BCM2835_MBOX_INIT_BUF(&buffer);
> +  BCM2835_MBOX_INIT_TAG_NO_REQ(&buffer.get_board_revision,
> +    BCM2835_MAILBOX_TAG_GET_BOARD_VERSION);
> +  bcm2835_mailbox_buffer_flush_and_invalidate(&buffer, sizeof(&buffer));
> +  if (bcm2835_mailbox_send_read_buffer(&buffer))
> +    return -1;
> +  _entries->spec = buffer.get_board_revision.body.resp.spec;
> +  if( !bcm2835_mailbox_buffer_suceeded(&buffer.hdr) )
> +    return -2;
> +  return 0;
> +}
> diff --git a/c/src/lib/libbsp/arm/raspberrypi/misc/vc_defines.h b/c/src/lib/libbsp/arm/raspberrypi/misc/vc_defines.h
> index f3d5a28..1b2bf92 100644
> --- a/c/src/lib/libbsp/arm/raspberrypi/misc/vc_defines.h
> +++ b/c/src/lib/libbsp/arm/raspberrypi/misc/vc_defines.h
> @@ -135,10 +135,30 @@ typedef struct {
>
>  /* Video Core */
>  #define BCM2835_MAILBOX_TAG_FIRMWARE_REVISION   0x00000001
> +typedef struct {
> +  bcm2835_mbox_tag_hdr tag_hdr;
> +  union {
> +    struct {
> +    } req;
an empty struct? what's the point for this?

> +    struct {
> +      uint32_t rev;
> +    } resp;
> +  } body;
> +} bcm2835_mbox_tag_get_fw_rev;
>
>  /* Hardware */
>  #define BCM2835_MAILBOX_TAG_GET_BOARD_MODEL     0x00010001
>  #define BCM2835_MAILBOX_TAG_GET_BOARD_VERSION   0x00010002
> +typedef struct {
> +  bcm2835_mbox_tag_hdr tag_hdr;
> +  union {
> +    struct {
> +    } req;
> +    struct {
> +      uint32_t spec;
> +    } resp;
> +  } body;
> +} bcm2835_mbox_tag_get_board_spec;
>
These two structs are basically identical. Do we care to distinguish them?

>  #if (BSP_IS_RPI2 == 1)
>  #define BCM2836_MAILBOX_BOARD_V_2_B             0x4
> --
> 1.9.1
>
> _______________________________________________
> devel mailing list
> devel at rtems.org
> http://lists.rtems.org/mailman/listinfo/devel


More information about the devel mailing list