diff --git a/artiq/firmware/libproto_artiq/drtioaux_proto.rs b/artiq/firmware/libproto_artiq/drtioaux_proto.rs index c0333b18c..803c5fd69 100644 --- a/artiq/firmware/libproto_artiq/drtioaux_proto.rs +++ b/artiq/firmware/libproto_artiq/drtioaux_proto.rs @@ -18,7 +18,7 @@ impl From> for Error { // used by satellite -> master analyzer, subkernel exceptions pub const SAT_PAYLOAD_MAX_SIZE: usize = /*max size*/512 - /*CRC*/4 - /*packet ID*/1 - /*last*/1 - /*length*/2; // used by DDMA, subkernel program data (need to provide extra ID and destination) -pub const MASTER_PAYLOAD_MAX_SIZE: usize = SAT_PAYLOAD_MAX_SIZE - /*destination*/1 - /*ID*/4; +pub const MASTER_PAYLOAD_MAX_SIZE: usize = SAT_PAYLOAD_MAX_SIZE - /*source*/1 - /*destination*/1 - /*ID*/4; #[derive(PartialEq, Clone, Copy, Debug)] #[repr(u8)] @@ -106,22 +106,26 @@ pub enum Packet { AnalyzerDataRequest { destination: u8 }, AnalyzerData { last: bool, length: u16, data: [u8; SAT_PAYLOAD_MAX_SIZE]}, - DmaAddTraceRequest { destination: u8, id: u32, status: PayloadStatus, length: u16, trace: [u8; MASTER_PAYLOAD_MAX_SIZE] }, - DmaAddTraceReply { succeeded: bool }, - DmaRemoveTraceRequest { destination: u8, id: u32 }, - DmaRemoveTraceReply { succeeded: bool }, - DmaPlaybackRequest { destination: u8, id: u32, timestamp: u64 }, - DmaPlaybackReply { succeeded: bool }, + DmaAddTraceRequest { + source: u8, destination: u8, + id: u32, status: PayloadStatus, + length: u16, trace: [u8; MASTER_PAYLOAD_MAX_SIZE] + }, + DmaAddTraceReply { destination: u8, succeeded: bool }, + DmaRemoveTraceRequest { source: u8, destination: u8, id: u32 }, + DmaRemoveTraceReply { destination: u8, succeeded: bool }, + DmaPlaybackRequest { source: u8, destination: u8, id: u32, timestamp: u64 }, + DmaPlaybackReply { destination: u8, succeeded: bool }, DmaPlaybackStatus { destination: u8, id: u32, error: u8, channel: u32, timestamp: u64 }, SubkernelAddDataRequest { destination: u8, id: u32, status: PayloadStatus, length: u16, data: [u8; MASTER_PAYLOAD_MAX_SIZE] }, SubkernelAddDataReply { succeeded: bool }, - SubkernelLoadRunRequest { destination: u8, id: u32, run: bool }, - SubkernelLoadRunReply { succeeded: bool }, - SubkernelFinished { id: u32, with_exception: bool }, + SubkernelLoadRunRequest { source: u8, destination: u8, id: u32, run: bool }, + SubkernelLoadRunReply { destination: u8, succeeded: bool }, + SubkernelFinished { destination: u8, id: u32, with_exception: bool, exception_src: u8 }, SubkernelExceptionRequest { destination: u8 }, SubkernelException { last: bool, length: u16, data: [u8; SAT_PAYLOAD_MAX_SIZE] }, - SubkernelMessage { destination: u8, id: u32, status: PayloadStatus, length: u16, data: [u8; MASTER_PAYLOAD_MAX_SIZE] }, + SubkernelMessage { source: u8, destination: u8, id: u32, status: PayloadStatus, length: u16, data: [u8; MASTER_PAYLOAD_MAX_SIZE] }, SubkernelMessageAck { destination: u8 }, } @@ -277,7 +281,8 @@ impl Packet { } }, - 0xb0 => { + 0xb0 => { + let source = reader.read_u8()?; let destination = reader.read_u8()?; let id = reader.read_u32()?; let status = reader.read_u8()?; @@ -285,6 +290,7 @@ impl Packet { let mut trace: [u8; MASTER_PAYLOAD_MAX_SIZE] = [0; MASTER_PAYLOAD_MAX_SIZE]; reader.read_exact(&mut trace[0..length as usize])?; Packet::DmaAddTraceRequest { + source: source, destination: destination, id: id, status: PayloadStatus::from(status), @@ -293,21 +299,26 @@ impl Packet { } }, 0xb1 => Packet::DmaAddTraceReply { + destination: reader.read_u8()?, succeeded: reader.read_bool()? }, 0xb2 => Packet::DmaRemoveTraceRequest { + source: reader.read_u8()?, destination: reader.read_u8()?, id: reader.read_u32()? }, 0xb3 => Packet::DmaRemoveTraceReply { + destination: reader.read_u8()?, succeeded: reader.read_bool()? }, 0xb4 => Packet::DmaPlaybackRequest { + source: reader.read_u8()?, destination: reader.read_u8()?, id: reader.read_u32()?, timestamp: reader.read_u64()? }, 0xb5 => Packet::DmaPlaybackReply { + destination: reader.read_u8()?, succeeded: reader.read_bool()? }, 0xb6 => Packet::DmaPlaybackStatus { @@ -337,16 +348,20 @@ impl Packet { succeeded: reader.read_bool()? }, 0xc4 => Packet::SubkernelLoadRunRequest { + source: reader.read_u8()?, destination: reader.read_u8()?, id: reader.read_u32()?, run: reader.read_bool()? }, 0xc5 => Packet::SubkernelLoadRunReply { + destination: reader.read_u8()?, succeeded: reader.read_bool()? }, 0xc8 => Packet::SubkernelFinished { + destination: reader.read_u8()?, id: reader.read_u32()?, with_exception: reader.read_bool()?, + exception_src: reader.read_u8()? }, 0xc9 => Packet::SubkernelExceptionRequest { destination: reader.read_u8()? @@ -363,6 +378,7 @@ impl Packet { } }, 0xcb => { + let source = reader.read_u8()?; let destination = reader.read_u8()?; let id = reader.read_u32()?; let status = reader.read_u8()?; @@ -370,6 +386,7 @@ impl Packet { let mut data: [u8; MASTER_PAYLOAD_MAX_SIZE] = [0; MASTER_PAYLOAD_MAX_SIZE]; reader.read_exact(&mut data[0..length as usize])?; Packet::SubkernelMessage { + source: source, destination: destination, id: id, status: PayloadStatus::from(status), @@ -561,8 +578,9 @@ impl Packet { writer.write_all(&data[0..length as usize])?; }, - Packet::DmaAddTraceRequest { destination, id, status, trace, length } => { + Packet::DmaAddTraceRequest { source, destination, id, status, trace, length } => { writer.write_u8(0xb0)?; + writer.write_u8(source)?; writer.write_u8(destination)?; writer.write_u32(id)?; writer.write_u8(status as u8)?; @@ -571,27 +589,32 @@ impl Packet { writer.write_u16(length)?; writer.write_all(&trace[0..length as usize])?; }, - Packet::DmaAddTraceReply { succeeded } => { + Packet::DmaAddTraceReply { destination, succeeded } => { writer.write_u8(0xb1)?; + writer.write_u8(destination)?; writer.write_bool(succeeded)?; }, - Packet::DmaRemoveTraceRequest { destination, id } => { + Packet::DmaRemoveTraceRequest { source, destination, id } => { writer.write_u8(0xb2)?; + writer.write_u8(source)?; writer.write_u8(destination)?; writer.write_u32(id)?; }, - Packet::DmaRemoveTraceReply { succeeded } => { + Packet::DmaRemoveTraceReply { destination, succeeded } => { writer.write_u8(0xb3)?; + writer.write_u8(destination)?; writer.write_bool(succeeded)?; }, - Packet::DmaPlaybackRequest { destination, id, timestamp } => { + Packet::DmaPlaybackRequest { source, destination, id, timestamp } => { writer.write_u8(0xb4)?; + writer.write_u8(source)?; writer.write_u8(destination)?; writer.write_u32(id)?; writer.write_u64(timestamp)?; }, - Packet::DmaPlaybackReply { succeeded } => { + Packet::DmaPlaybackReply { destination, succeeded } => { writer.write_u8(0xb5)?; + writer.write_u8(destination)?; writer.write_bool(succeeded)?; }, Packet::DmaPlaybackStatus { destination, id, error, channel, timestamp } => { @@ -615,20 +638,24 @@ impl Packet { writer.write_u8(0xc1)?; writer.write_bool(succeeded)?; }, - Packet::SubkernelLoadRunRequest { destination, id, run } => { + Packet::SubkernelLoadRunRequest { source, destination, id, run } => { writer.write_u8(0xc4)?; + writer.write_u8(source)?; writer.write_u8(destination)?; writer.write_u32(id)?; writer.write_bool(run)?; }, - Packet::SubkernelLoadRunReply { succeeded } => { + Packet::SubkernelLoadRunReply { destination, succeeded } => { writer.write_u8(0xc5)?; + writer.write_u8(destination)?; writer.write_bool(succeeded)?; }, - Packet::SubkernelFinished { id, with_exception } => { + Packet::SubkernelFinished { destination, id, with_exception, exception_src } => { writer.write_u8(0xc8)?; + writer.write_u8(destination)?; writer.write_u32(id)?; writer.write_bool(with_exception)?; + writer.write_u8(exception_src)?; }, Packet::SubkernelExceptionRequest { destination } => { writer.write_u8(0xc9)?; @@ -640,8 +667,9 @@ impl Packet { writer.write_u16(length)?; writer.write_all(&data[0..length as usize])?; }, - Packet::SubkernelMessage { destination, id, status, data, length } => { + Packet::SubkernelMessage { source, destination, id, status, data, length } => { writer.write_u8(0xcb)?; + writer.write_u8(source)?; writer.write_u8(destination)?; writer.write_u32(id)?; writer.write_u8(status as u8)?;