Doc to write firmware?

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi,

Having written the ingenic-remoteproc driver I am trying now to write something a bit more advanced than a hello-world. Something like a case-invert program for starters. However I'm having a hard time trying to figure out how things work.

My resource table is as follows:

----------------------------
struct resource_table_hdr {
struct resource_table header;

uint32_t offset[3];

struct {
 struct fw_rsc_hdr header;
 struct fw_rsc_carveout carveout;
} carveout;

struct {
 struct fw_rsc_hdr header;
 struct fw_rsc_trace trace;
} trace;

struct {
 struct fw_rsc_hdr header;
 struct fw_rsc_vdev vdev;
 struct fw_rsc_vdev_vring vrings[2];
 uint8_t config[0xc];
} vdev;
};

const struct resource_table_hdr resource_table
__attribute__((used, section (".resource_table"))) = {
.header = {
 .ver = 1,
 .num = ARRAY_SIZE(resource_table.offset), /* Number of resources */
},

.offset[0] = offsetof(struct resource_table_hdr, carveout),
.offset[1] = offsetof(struct resource_table_hdr, trace),
.offset[2] = offsetof(struct resource_table_hdr, vdev),

.carveout = {
 .header = {
  .type = RSC_CARVEOUT,
 },
 .carveout = {
  .da = 0xf4000000,
  .len = 0x2000,
  .name = "firmware",
 },
},

/* Trace resource to printf() into */
.trace = {
 .header = {
  .type = RSC_TRACE,
 },
 .trace = {
  .da = (uint32_t)trace_buf,
  .len = TRACE_BUFFER_SIZE,
  .name = "trace",
 },
},

/* VirtIO device */
.vdev = {
 .header = {
  .type = RSC_VDEV,
 },
 .vdev = {
  .id = VIRTIO_ID_RPROC_SERIAL,
  .notifyid = 0,
  .dfeatures = 0,
  .config_len = 0xc,
  .num_of_vrings = 2,
 },
 .vrings = {
  [0] = {
   .align = 0x10,
   .num = 0x4,
   .notifyid = 0,
  },
  [1] = {
   .align = 0x10,
   .num = 0x4,
   .notifyid = 0,
  },
 },
},
};
----------------------------

The firmware is properly loaded and I get debug prints in my trace buffer. However, my vrings' .da fields don't seem to be initialized to anything meaningful at all. Then I use the virtio/vring code from (https://github.com/MIPS/mips-rproc-example/blob/master/firmware/common/include/vring.h), and calling vring_print() shows that my vring_desc's addresses are garbage as well.

Is there an example on how to write a basic I/O remoteproc program?

Cheers,
-Paul





[Index of Archives]     [Linux Sound]     [ALSA Users]     [ALSA Devel]     [Linux Audio Users]     [Linux Media]     [Kernel]     [Photo Sharing]     [Gimp]     [Yosemite News]     [Linux Media]

  Powered by Linux