- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hi I have a hardware setup where I have CPU running Linux connected with Intel MAX 10 FPGA on I2C bus.
I want to perform the following things:
- write some configuration data to FPGA's registers
- perform Remote System Update
Let's focus on RSU first. I was googling trying to find something about RSU and I stumbled upon this article: https://www.intel.com/content/www/us/en/docs/programmable/683661/current/remote-system-upgrade-for-max-10-fpga.html However in this article (as far as I understand) there are two FPGA communicating with each other over I2C. The article mentioned also NIOS II which as I understand is a processor that runs on one FPGA and triggers the RSU procedure.
As I mentioned in my example I have CPU (running Linux) and Max 10 on I2C bus, so I wanted to trigger an update from Linux OS, but I am having difficulty finding any information about the "protocol" used to perform RSU, as I guess I can't just put some data over I2C hoping that on the other side of communication, the FPGA will consume this data and update the system. Is there any source where I could find how I should send the data (in the context of protocol, ofc not the i2c protocol, but protocol to perform RSU)?
Please bear in mind that I have very little knowledge about FPGA and I will not even touch it, because I'm responsible of the Linux side of communication.
Link Copied
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hi,
Thanks for contacting Intel. I'm assigned to support request.
Let me check on this internally and will update you ASAP.
Regards
Tiwari
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
@rdrr wrote:Please bear in mind that I have very little knowledge about FPGA and I will not even touch it, because I'm responsible of the Linux side of communication.
Hi,
I guess there's someone responsible for FPGA development in the project, so you should discuss with them possible options for RSU and application register interface.
On the FPGA side, you'll surely use MAX 10 dual configuration IP and on-chip flash IP. Everything else depends on FPGA design requirements and preferred processor. Why are you biased towards I2C interface? Because it's used in the RSU reference design or has it already been chosen for processor to FPGA interface of your application? I would rather expect basic UART interface which is natively supported by Linux OS.
I assume that you don't yet use NIOS softprocessor in your application? If so, it's rather odd to implement itfor the sole purpose of performing RSU. Better implement a small low level interface to flash and dual configuration IP in HDL.
There's no specific protocol for RSU, just need to perform a few functions provided by the IP through processor interface. You can e.g. implement a few control registers and access them through processor interface.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hi, thanks for the response.
Yes, there is an FPGA team responsible for FPGA development and certainly, they will work on this, however, I'm just curious how this could look like, as we are in the very early stage of the project and somebody just brought this idea up at the meeting and it took my attention as I will probably be responsible for handling this CPU-FPGA communication from the processor side.
I'm not sure why I2C was chosen to handle the communication - in my honest opinion, I2C is not the best choice to handle bulk transfers like bitstream upload, however, I believe there is a solid rationale behind this decision.
Anyway, I'm still not sure how this should work. Let's say that in my contrived scenario where I want to control FPGA as well as update its configuration, I would just create a driver that uses an FPGA reg map like eg. this:
FPGA Register Map: ------------------------------------- | Register Name | Address | ------------------------------------- | CONTROL_REG | 0x00 | | STATUS_REG | 0x01 | | FIRMWARE_VERSION_REG | 0x02 | | ... | ... | -------------------------------------
and then:
- if I want to change the control value then I trigger the write operation over I2C and send: register offset followed by a designed value
- if I want to read the status register then I trigger the read operation over I2C and send: the register that I want to read
How should the update procedure be designed then?
Should I e.g. send a value to a control register that would indicate that I want to perform an update procedure? And then just send a bitstream blob over the interface?
How should I indicate that I finished sending a blob and I'm getting back to a "normal", operational state?
Perhaps there should be a register in FPGA where I could write bitstream size, and then FPGA would know when to stop interpreting data on the bus as bitstream blob?
How should the partial (faulty) update be designed? Like in the scenario that something went wrong and the processor was not able to send the whole blob? How should I inform the FPGA that we're starting to send an update bitstream once again?
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hi,
minimal required functions for RSU are
- boot to factor/application image
- erase/write/read internal flash
They can be surely implemented through I2C interface if you want to. Available MAX10 dual config and flash exposes AVMM interface with several control and status registers. It's your decision if you map the interface 1:1 to I2C or only export necessary functionality.
Similarly decide how to map AVMM internal flash interface to I2C. I'd prefer a slim interface that transfers a flash page with address autoincrement after sending a start address.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Thanks for the explanation. Btw is there an option to see how the I2C - FGPA communication is handled by the NIOS II in this example? https://www.intel.com/content/www/us/en/design-example/714982/max-10-remote-system-upgrade-rsu-lab.html I assume that this file is available for download and can be launched by some software/ IDE or something?
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hi,
You can refer below link for remote upgrade using the UART on MAX 10.
You can download the reference link from below link and this design is based on the Quartus Standard tool version 16.
Regards
Tiwari
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hi,
I believe your inquiry has been answered. With that, I now transition this thread to community support.
Thank you.
Best regards,
Tiwari
p/s: If any answer from the community or Intel Support are helpful, please feel free to give best answer or rate 4/5 survey.
- Subscribe to RSS Feed
- Mark Topic as New
- Mark Topic as Read
- Float this Topic for Current User
- Bookmark
- Subscribe
- Printer Friendly Page