The purpose of USB 3.0 is to capture the current and voltage waveform sampled at 1 or 2MSPS at 32bits. That needs a fat pipe. USB 2.0 may be just about sufficient, but using the 3.0 interface allows for better headroom and lower CPU usage.
Running the compression on the hardware could enable use of ethernet or wiFi for the data transmission. As I posted earlier, the compression of the IOT current data is quite performance intensive and it would mean adding a high performance processor on the board with increase space, cost, complexity, noise and power consumption. I think, using a fat pipe to stream the data to the PC and using the PC's massive processing power is the optimal cost effective solution.
You say you want 0.8v .. 6v and 100nA .. 2A ... 2A is 2,000,000,000 nA ... 24 bits unsigned is 16,777,216 so you could have two ranges :
100nA .. 400mA : 400,000,000 nA ... 25nA steps will give you 0 .. 16.000.000 so it can fit in 24 bits unsigned
400mA .. 2A :1,600,000,000 nA ... 100nA steps will give you 0 .. 16.000.000 again, fits in 24 bits unsigned
Do you think you're really need more than 25nA or 100nA steps on a IoT psu?
For voltage, 6v is 6000mV or 6.000.000 uV ... you can get 1uV precision up to 16v with 24 bits
Unless you get some super fancy current shunts and expensive ADCs you're not gonna get 32 bit conversion where the last 8 bits will actually make a difference. Are you gonna pack 20$+ ADC chips and 10$+ voltage references into a IoT power supply?
Also, 1-2 million samples per second ... that's 1-2000 samples per ms ... the current and voltage won't change so much within a ms ... probably most of the time only the last 8-10 bits will change.
So you can do some basic RLE encoding ... get up to 255 samples, then group together the first byte or first 12 bits of the 24 bits for the voltage, then the next byte and so on.. for example 4 bits for repeat count + 12 bits of data will allow you up to 16 consecutive 12 bit parts to be saved as a single 16 bit value, saving 24 bytes in 2 bytes .
example packet:
[one byte : number of samples that follow : 0..255 ]
[one byte : number of rle groupings for 1st 12bits of voltage ]
[one byte : number of rle groupings for 2nd 12bits of voltage ]
[one byte : number of rle groupings for 1st 12bits of current ]
[one byte : number of rle groupings for 2nd 12bits of current ]
[0..3 bytes : optional padding to keep it multiple of 4 or 6 bytes? maybe add a CRC16 in two bytes? maybe one byte for V and A range ( range won't change within a data packet)]
[ 2 bytes : 4 bits count of samples, 12 bits of data - first 12 bits of voltage/current, last 12 bits of voltage/current ]
... repeat for each 12 bits of voltage/current
ex for 3 voltages and currents: 0xF11940 , 0xF11900 , 0xF10540 , 0x312D00 , 0x312550 , 0x310000
1 bytes : 3 samples
1 bytes + 2 bytes : 2 groupings for voltage first 12 bits : 0x02 0xF11 0x01 0xF10
1 bytes + 3 bytes : 3 groupings for voltage last 12 bits : 0x01 0x940 0x01 0x900 0x01 0x540
1 bytes + 2 bytes : 2 groupings for current first 12 bits : 0x02 0x312 0x01 0x310
1 bytes + 3 bytes : 3 groupings for current last 12 bits : 0x01 0x540 0x01 0x550 0x01 0x000
0x03 0x02 0x03 0x02 0x03 0x00 [ data 2 bytes x groupings]
total packet size : 15-18 bytes depending on padding bytes (18 bytes without RLE) .... with more than 3 samples, you'll likely to get more compression.
Worst case scenario if every byte is unique, you'd get 255 x 4 bits x 4 ... 512 bytes extra to a 3 x 255 byte packet ... so still fits into a 2 KB "packet" of data.