
Repository for CDMS code
Dependencies: SimpleDMA mbed-rtos mbed eeprom
Fork of COM_MNG_TMTC_SIMPLE by
Revision 86:a26f5f22631d, committed 2016-01-20
- Comitter:
- ee12b079
- Date:
- Wed Jan 20 16:40:28 2016 +0000
- Parent:
- 85:0c5c860f249e
- Child:
- 87:6e154fd43531
- Commit message:
- SDCard code integrated, works for MMS TC, to be tested for OBSRS TC
Changed in this revision
--- a/COM_SND_TM.h Wed Jan 20 15:00:28 2016 +0000 +++ b/COM_SND_TM.h Wed Jan 20 16:40:28 2016 +0000 @@ -1,7 +1,7 @@ //void adf_not_SDcard(); //~ #include"SDcard.h" -#define T_frames 30 +/*#define T_frames 30 unsigned char buffer_112_counter,sent_tm = 0; int disk_read(uint8_t *, uint64_t),j; bool new_session = true; @@ -18,7 +18,7 @@ uint64_t block_counter = 0; unsigned char buffer_512[512], buffer_112[112],counter_in_S_frame=0,counter_in_SCH=0; unsigned char make_EOS_flag = true; -bool reset = false; +bool reset = false; */ @@ -49,7 +49,7 @@ }\ } -void send_tm_from_SD_card(){} +//void send_tm_from_SD_card(){} class SND_TM{
--- a/DefinitionsAndGlobals.h Wed Jan 20 15:00:28 2016 +0000 +++ b/DefinitionsAndGlobals.h Wed Jan 20 16:40:28 2016 +0000 @@ -128,7 +128,7 @@ // COMMON SPI SPI spi( SPI_MOSI, SPI_MISO, SPI_CLK ); DigitalOut gCS_ADF(SPI_CS_ADF); -DigitalOut gCS_SDC(SPI_CS_SDC); +DigitalOut cs_sd(SPI_CS_SDC); DigitalOut gCS_RTC(SPI_CS_RTC); Mutex SPI_mutex;
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/OBSRS.h Wed Jan 20 16:40:28 2016 +0000 @@ -0,0 +1,538 @@ +// problem in check pa and valid sid not sending anything in one for loop + + + +// no error case 2 ackl234new->TM_string[2] = (101_0000) = 0x_0; spare = 0 10100000 = 0xA0 +// Hardware failure Case 4 ackl234new->TM_string[2] = (100_0101) = 0x_5; spare = 0 10000101 = 0x85 comes from cdms ask pradeep +// Invalid FSC Case 4 ackl234new->TM_string[2] = (100_0110) = 0x_6; spare = 0 10000110 = 0x86 Invalid FSC +// Illegal TC Case 3 ackl234new->TM_string[2] = (000_0010) = 0x_2; spare = 0 00000010 = 0x02 invalid SID + + + +#define TMID_ACK_L234 0xB +#define T_frames_in_segment 10 + +using namespace std; +//Serial pc(USBTX, USBRX); // tx, rx + +//DigitalOut gpo(D0); +//DigitalOut led(LED_RED); + +bool send_EoS_and_stop = false; +bool adf_limit = false; +bool stop = false; +bool check_PA = true; +bool PA_HOT=0; +bool short_TC; +bool valid_SID = true; +bool enable_call_sign = true; +bool enable_new_segment=true; +bool enable_S_frame = true; +bool enable_read_block = false; +bool enable_T_frame = false; +bool enable_Ack_andcallsign = false; +bool enable_ackandcallsign = false; +bool new_session =true; +bool enable_EoS=false; +bool create_Ack_andcallsign = true; +bool Ack_andcallsign_over = false; +bool repeat_last_2T_frames = false; +bool last_block = false; +bool last_buffer = false; +bool new_OBSRS_TC = true; +bool enable_SCH = true; +bool enable_FCCH = false; +bool enable_DS = false; + +uint8_t SID ; +unsigned char buffer_112[112]; +uint32_t FSC; +uint16_t read_success = false; +uint16_t counter_buffer_112=0, counter_EoS=0,T_frames_sent=0; +uint16_t counter_call_sign_buffer=0; +uint16_t counter_buffer_512=0; +uint16_t counter_Ack_andcallsign = 0; +uint16_t max_segments = 65415/(48+T_frames_in_segment*159); +uint16_t ack_code = 0xA0; +uint16_t segments_sent = 0; +uint8_t counter_SCH40 = 0; +uint8_t counter_FCCH80 = 0; +uint8_t counter_S_frame = 0; +uint16_t T_frame_Ack_andcallsign_sent = 0; +uint16_t T_frame_in_Ackandcallsign = 4; // needs to get from sukhdeep depends on size of Ack_L1 +uint64_t start_block_num ; +uint32_t block_counter = 0; +uint32_t no_of_frames =0; +int Ack_L1; // should be always even + +//#define max_segments = 65415/(48+T_frames_in_segment*159) +// data 288 byte with convolution without xoring 0x38,0x90,0x7B,0x40,0x01,0x56,0x45,0xE0,0x3C,0xA0,0x7A,0x90,0x3D,0xE6,0x3E,0x70,0x21,0x42,0x43,0x3C,0x0C,0x20,0x00,0x4C,0x83,0x12,0x67,0xF0,0x8F,0x36,0x60,0x3C,0x86,0x24,0x06,0x80,0x20,0x54,0x22,0x9C,0x07,0x2A,0x00,0x8C,0x0F,0x7A,0x25,0x50,0x88,0x50,0x5F,0x8C,0xAB,0x0A,0x7A,0xCC,0x10,0xC4,0x25,0x10,0xB3,0xCE,0x5F,0x40,0xA1,0x8A,0x05,0xD0,0x90,0x14,0x7E,0x00,0x09,0xCA,0x7F,0xA0,0x1B,0xDE,0x00,0x70,0x12,0x14,0x7D,0x50,0x2A,0xC0,0x7D,0x20,0x14,0x30,0x04,0x4C,0x3C,0xF0,0x02,0xEC,0x28,0x60,0x45,0xA0,0x04,0x04,0x47,0x1C,0x22,0x70,0x02,0xE0,0x26,0xF4,0x41,0xFC,0x04,0x84,0x04,0x9C,0x0A,0xB0,0x41,0x40,0x25,0x0C,0xBF,0x9C,0x2F,0x3C,0xF8,0x5C,0x0A,0x18,0x4A,0xC0,0x21,0x00,0xB2,0x80,0x58,0x9C,0x8A,0x00,0x79,0xBC,0x7D,0x00,0x10,0x28,0x3E,0x3C,0x46,0x94,0x7D,0xB8,0x21,0x20,0x42,0x04,0x77,0xB4,0xB7,0x84,0x53,0x94,0x03,0xA0,0x20,0x08,0xF4,0x00,0x47,0x34,0xF7,0x60,0x63,0x3C,0x01,0xC0,0x24,0x08,0xF3,0xA0,0x11,0xA0,0xF3,0x60,0x68,0x48,0x08,0xB8,0x7D,0xE8,0x0D,0xF8,0x14,0xE0,0x83,0xC0,0x48,0x00,0x8E,0xB8,0x91,0xC8,0x05,0x40,0xD8,0xC8,0x8B,0xF8,0xC9,0x00,0x0D,0x38,0x04,0x68,0x86,0x80,0x9A,0x11,0x7B,0xB8,0x9F,0x79,0xF8,0x38,0x05,0x38,0x99,0x80,0xD2,0x01,0x69,0x80,0x24,0x71,0x14,0x80,0xF6,0x30,0xFE,0x80,0x72,0x41,0xE9,0x00,0x01,0x19,0x17,0x80,0xE6,0x81,0xEA,0x40,0x67,0xD8,0xFD,0xC0,0x81,0x48,0x1E,0xF0,0x34,0x81,0x13,0x30,0x09,0x19,0x8D,0xC8,0xBD,0x88,0x84,0xF8,0x9C,0x90,0x1C,0x00,0x00,0x41,0x8C,0x78,0x39,0xA9,0x12,0x30,0x19,0xF8,0x87,0x48 +// actual data 0x18,0x00,0x00,0x00,0x1C,0x44,0x10,0x04,0x01,0xE0,0x44,0x10,0x04,0x01,0xE0,0x44,0x10,0x04,0x01,0xE0,0x44,0x10,0x04,0x01,0xE0,0x44,0x10,0x04,0x01,0xE0,0x44,0x10,0x40,0x00,0x00,0x00,0x00,0x01,0x40,0x82,0x41,0x20,0x10,0x08,0x04,0x02,0x01,0xE4,0x3A,0x28,0x22,0x3A,0x28,0x22,0x3A,0x28,0x22,0x41,0x10,0x04,0x01,0xE4,0x40,0x20,0x10,0x08,0x04,0x01,0xE4,0x41,0x10,0x04,0x01,0xE4,0x41,0x10,0x04,0x01,0xE4,0x41,0x10,0x04,0x01,0xE4,0x41,0x10,0x04,0x01,0xE4,0x41,0x10,0x04,0x01,0xE4,0x41,0x10,0x40,0x00,0x00,0x00,0x00,0x01,0x48,0x82,0x41,0x20,0x10,0x08,0x04,0x02,0x01,0xE8,0x04,0x28,0x22,0x04,0x28,0x22,0x04,0x28,0x22,0x42,0x10,0x04,0x01,0xE8,0x40,0x20,0x10,0x08,0x04,0x01,0x00,0x00, +//const unsigned char S_frame[] = {0x46,0x9D,0xFB,0xF0,0xD2,0xBA,0x89,0xE4,0x46,0x9D,0xFB,0xF0,0xD2,0xBA,0x89,0xE4,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}; +//const unsigned char EoS[] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x1A,0x77,0xEF,0xC3,0x4A,0xEA,0x27,0x91,0x1A,0x77,0xEF,0xC3,0x4A,0xEA,0x27,0x90,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x1A,0x77,0xEF,0xC3,0x4A,0xEA,0x27,0x91,0x1A,0x77,0xEF,0xC3,0x4A,0xEA,0x27,0x90,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}; +uint16_t counter=0; +unsigned char call_sign_buffer[318]={0x0A,0x3F,0x46,0xB4,0x00,0x38,0x90,0x7B,0x40,0x01,0x56,0x45,0xE0,0x3C,0xA0,0x7A,0x90,0x3D,0xE6,0x3E,0x70,0x21,0x42,0x43,0x3C,0x0C,0x20,0x00,0x4C,0x83,0x12,0x67,0xF0,0x8F,0x36,0x60,0x3C,0x86,0x24,0x06,0x80,0x20,0x54,0x22,0x9C,0x07,0x2A,0x00,0x8C,0x0F,0x7A,0x25,0x50,0x88,0x50,0x5F,0x8C,0xAB,0x0A,0x7A,0xCC,0x10,0xC4,0x25,0x10,0xB3,0xCE,0x5F,0x40,0xA1,0x8A,0x05,0xD0,0x90,0x14,0x7E,0x00,0x09,0xCA,0x7F,0xA0,0x1B,0xDE,0x00,0x70,0x12,0x14,0x7D,0x50,0x2A,0xC0,0x7D,0x20,0x14,0x30,0x04,0x4C,0x3C,0xF0,0x02,0xEC,0x28,0x60,0x45,0xA0,0x04,0x04,0x47,0x1C,0x22,0x70,0x02,0xE0,0x26,0xF4,0x41,0xFC,0x04,0x84,0x04,0x9C,0x0A,0xB0,0x41,0x40,0x25,0x0C,0xBF,0x9C,0x2F,0x3C,0xF8,0x5C,0x0A,0x18,0x4A,0xC0,0x21,0x00,0xB2,0x80,0x58,0x9C,0x8A,0x00,0x79,0xBC,0x7D,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0A,0x3F,0x46,0xB4,0x00,0x10,0x28,0x3E,0x3C,0x46,0x94,0x7D,0xB8,0x21,0x20,0x42,0x04,0x77,0xB4,0xB7,0x84,0x53,0x94,0x03,0xA0,0x20,0x08,0xF4,0x00,0x47,0x34,0xF7,0x60,0x63,0x3C,0x01,0xC0,0x24,0x08,0xF3,0xA0,0x11,0xA0,0xF3,0x60,0x68,0x48,0x08,0xB8,0x7D,0xE8,0x0D,0xF8,0x14,0xE0,0x83,0xC0,0x48,0x00,0x8E,0xB8,0x91,0xC8,0x05,0x40,0xD8,0xC8,0x8B,0xF8,0xC9,0x00,0x0D,0x38,0x04,0x68,0x86,0x80,0x9A,0x11,0x7B,0xB8,0x9F,0x79,0xF8,0x38,0x05,0x38,0x99,0x80,0xD2,0x01,0x69,0x80,0x24,0x71,0x14,0x80,0xF6,0x30,0xFE,0x80,0x72,0x41,0xE9,0x00,0x01,0x19,0x17,0x80,0xE6,0x81,0xEA,0x40,0x67,0xD8,0xFD,0xC0,0x81,0x48,0x1E,0xF0,0x34,0x81,0x13,0x30,0x09,0x19,0x8D,0xC8,0xBD,0x88,0x84,0xF8,0x9C,0x90,0x1C,0x00,0x00,0x41,0x8C,0x78,0x39,0xA9,0x12,0x30,0x19,0xF8,0x87,0x48,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}; + //0x00,0x0A,0x3F,0x46,0xB4,0x00,0x38,0x90,0x7B,0x40,0x01,0x56,0x45,0xE0,0x3C,0xA0,0x7A,0x90,0x3D,0xE6,0x3E,0x70,0x21,0x42,0x43,0x3C,0x0C,0x20,0x00,0x4C,0x83,0x12,0x67,0xF0,0x8F,0x36,0x60,0x3C,0x86,0x24,0x06,0x80,0x20,0x54,0x22,0x9C,0x07,0x2A,0x00,0x8C,0x0F,0x7A,0x25,0x50,0x88,0x50,0x5F,0x8C,0xAB,0x0A,0x7A,0xCC,0x10,0xC4,0x25,0x10,0xB3,0xCE,0x5F,0x40,0xA1,0x8A,0x05,0xD0,0x90,0x14,0x7E,0x00,0x09,0xCA,0x7F,0xA0,0x1B,0xDE,0x00,0x70,0x12,0x14,0x7D,0x50,0x2A,0xC0,0x7D,0x20,0x14,0x30,0x04,0x4C,0x3C,0xF0,0x02,0xEC,0x28,0x60,0x45,0xA0,0x04,0x04,0x47,0x1C,0x22,0x70,0x02,0xE0,0x26,0xF4,0x41,0xFC,0x04,0x84,0x04,0x9C,0x0A,0xB0,0x41,0x40,0x25,0x0C,0xBF,0x9C,0x2F,0x3C,0xF8,0x5C,0x0A,0x18,0x4A,0xC0,0x21,0x00,0xB2,0x80,0x58,0x9C,0x8A,0x00,0x79,0xBC,0x7D,0x00,0x10,0x28,0x3E,0x3C,0x46,0x94,0x7D,0xB8,0x21,0x20,0x42,0x04,0x77,0xB4,0xB7,0x84,0x53,0x94,0x03,0xA0,0x20,0x08,0xF4,0x00,0x47,0x34,0xF7,0x60,0x63,0x3C,0x01,0xC0,0x24,0x08,0xF3,0xA0,0x11,0xA0,0xF3,0x60,0x68,0x48,0x08,0xB8,0x7D,0xE8,0x0D,0xF8,0x14,0xE0,0x83,0xC0,0x48,0x00,0x8E,0xB8,0x91,0xC8,0x05,0x40,0xD8,0xC8,0x8B,0xF8,0xC9,0x00,0x0D,0x38,0x04,0x68,0x86,0x80,0x9A,0x11,0x7B,0xB8,0x9F,0x79,0xF8,0x38,0x05,0x38,0x99,0x80,0xD2,0x01,0x69,0x80,0x24,0x71,0x14,0x80,0xF6,0x30,0xFE,0x80,0x72,0x41,0xE9,0x00,0x01,0x19,0x17,0x80,0xE6,0x81,0xEA,0x40,0x67,0xD8,0xFD,0xC0,0x81,0x48,0x1E,0xF0,0x34,0x81,0x13,0x30,0x09,0x19,0x8D,0xC8,0xBD,0x88,0x84,0xF8,0x9C,0x90,0x1C,0x00,0x00,0x41,0x8C,0x78,0x39,0xA9,0x12,0x30,0x19,0xF8,0x87,0x48,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}; +uint8_t buffer_512[512]; +unsigned char Ack_andcallsign[318]={0x0A,0x3F,0x46,0xB4,0x00,0x38,0x90,0x7B,0x40,0x01,0x56,0x45,0xE0,0x3C,0xA0,0x7A,0x90,0x3D,0xE6,0x3E,0x70,0x21,0x42,0x43,0x3C,0x0C,0x20,0x00,0x4C,0x83,0x12,0x67,0xF0,0x8F,0x36,0x60,0x3C,0x86,0x24,0x06,0x80,0x20,0x54,0x22,0x9C,0x07,0x2A,0x00,0x8C,0x0F,0x7A,0x25,0x50,0x88,0x50,0x5F,0x8C,0xAB,0x0A,0x7A,0xCC,0x10,0xC4,0x25,0x10,0xB3,0xCE,0x5F,0x40,0xA1,0x8A,0x05,0xD0,0x90,0x14,0x7E,0x00,0x09,0xCA,0x7F,0xA0,0x1B,0xDE,0x00,0x70,0x12,0x14,0x7D,0x50,0x2A,0xC0,0x7D,0x20,0x14,0x30,0x04,0x4C,0x3C,0xF0,0x02,0xEC,0x28,0x60,0x45,0xA0,0x04,0x04,0x47,0x1C,0x22,0x70,0x02,0xE0,0x26,0xF4,0x41,0xFC,0x04,0x84,0x04,0x9C,0x0A,0xB0,0x41,0x40,0x25,0x0C,0xBF,0x9C,0x2F,0x3C,0xF8,0x5C,0x0A,0x18,0x4A,0xC0,0x21,0x00,0xB2,0x80,0x58,0x9C,0x8A,0x00,0x79,0xBC,0x7D,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0A,0x3F,0x46,0xB4,0x00,0x10,0x28,0x3E,0x3C,0x46,0x94,0x7D,0xB8,0x21,0x20,0x42,0x04,0x77,0xB4,0xB7,0x84,0x53,0x94,0x03,0xA0,0x20,0x08,0xF4,0x00,0x47,0x34,0xF7,0x60,0x63,0x3C,0x01,0xC0,0x24,0x08,0xF3,0xA0,0x11,0xA0,0xF3,0x60,0x68,0x48,0x08,0xB8,0x7D,0xE8,0x0D,0xF8,0x14,0xE0,0x83,0xC0,0x48,0x00,0x8E,0xB8,0x91,0xC8,0x05,0x40,0xD8,0xC8,0x8B,0xF8,0xC9,0x00,0x0D,0x38,0x04,0x68,0x86,0x80,0x9A,0x11,0x7B,0xB8,0x9F,0x79,0xF8,0x38,0x05,0x38,0x99,0x80,0xD2,0x01,0x69,0x80,0x24,0x71,0x14,0x80,0xF6,0x30,0xFE,0x80,0x72,0x41,0xE9,0x00,0x01,0x19,0x17,0x80,0xE6,0x81,0xEA,0x40,0x67,0xD8,0xFD,0xC0,0x81,0x48,0x1E,0xF0,0x34,0x81,0x13,0x30,0x09,0x19,0x8D,0xC8,0xBD,0x88,0x84,0xF8,0x9C,0x90,0x1C,0x00,0x00,0x41,0x8C,0x78,0x39,0xA9,0x12,0x30,0x19,0xF8,0x87,0x48,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}; +uint32_t list_of_FSC[43]={0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x40,0x41,0x42,0x43}; +uint8_t write_buffer[512] = {0x38,0x90,0x7B,0x40,0x01,0x56,0x45,0xE0,0x3C,0xA0,0x7A,0x90,0x3D,0xE6,0x3E,0x70,0x21,0x42,0x43,0x3C,0x0C,0x20,0x00,0x4C,0x83,0x12,0x67,0xF0,0x8F,0x36,0x60,0x3C,0x86,0x24,0x06,0x80,0x20,0x54,0x22,0x9C,0x07,0x2A,0x00,0x8C,0x0F,0x7A,0x25,0x50,0x88,0x50,0x5F,0x8C,0xAB,0x0A,0x7A,0xCC,0x10,0xC4,0x25,0x10,0xB3,0xCE,0x5F,0x40,0xA1,0x8A,0x05,0xD0,0x90,0x14,0x7E,0x00,0x09,0xCA,0x7F,0xA0,0x1B,0xDE,0x00,0x70,0x12,0x14,0x7D,0x50,0x2A,0xC0,0x7D,0x20,0x14,0x30,0x04,0x4C,0x3C,0xF0,0x02,0xEC,0x28,0x60,0x45,0xA0,0x04,0x04,0x47,0x1C,0x22,0x70,0x02,0xE0,0x26,0xF4,0x41,0xFC,0x04,0x84,0x04,0x9C,0x0A,0xB0,0x41,0x40,0x25,0x0C,0xBF,0x9C,0x2F,0x3C,0xF8,0x5C,0x0A,0x18,0x4A,0xC0,0x21,0x00,0xB2,0x80,0x58,0x9C,0x8A,0x00,0x79,0xBC,0x7D,0x00,0x10,0x28,0x3E,0x3C,0x46,0x94,0x7D,0xB8,0x21,0x20,0x42,0x04,0x77,0xB4,0xB7,0x84,0x53,0x94,0x03,0xA0,0x20,0x08,0xF4,0x00,0x47,0x34,0xF7,0x60,0x63,0x3C,0x01,0xC0,0x24,0x08,0xF3,0xA0,0x11,0xA0,0xF3,0x60,0x68,0x48,0x08,0xB8,0x7D,0xE8,0x0D,0xF8,0x14,0xE0,0x83,0xC0,0x48,0x00,0x8E,0xB8,0x91,0xC8,0x05,0x40,0xD8,0xC8,0x8B,0xF8,0xC9,0x00,0x0D,0x38,0x04,0x68,0x86,0x80,0x9A,0x11,0x7B,0xB8,0x9F,0x79,0xF8,0x38,0x05,0x38,0x99,0x80,0xD2,0x01,0x69,0x80,0x24,0x71,0x14,0x80,0xF6,0x30,0xFE,0x80,0x72,0x41,0xE9,0x00,0x01,0x19,0x17,0x80,0xE6,0x81,0xEA,0x40,0x67,0xD8,0xFD,0xC0,0x81,0x48,0x1E,0xF0,0x34,0x81,0x13,0x30,0x09,0x19,0x8D,0xC8,0xBD,0x88,0x84,0xF8,0x9C,0x90,0x1C,0x00,0x00,0x41,0x8C,0x78,0x39,0xA9,0x12,0x30,0x19,0xF8,0x87,0x48,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}; +//const unsigned char EXOR_SEQ[] = {0x55,0xF1,0x51,0x3D,0xA7,0x42,0xAE,0x2E,0x2E,0x28,0x76,0x80,0x62,0x41,0xC4,0x75,0x4D,0x87,0xDB,0xE1,0x02,0x61,0x60,0x96,0x9C,0xCB,0x8A,0xBD,0x37,0xE4,0x72,0x5D,0xF2,0x19,0x62,0x06,0x9A,0xF9,0x38,0xB0,0x49,0x75,0xD0,0x17,0x1B,0xCC,0x0B,0xEB,0x1B,0x50,0xA2,0x2A,0x8E,0xFA,0x4D,0x6F,0x1B,0xF8,0x0F,0x97,0x39,0x25,0x60,0x55,0x9A,0xDF,0x1D,0x10,0x7F,0xBD,0x3E,0xBF,0xE5,0x68,0x02,0xD1,0x99,0x0D,0xDF,0x84,0x2E,0x15,0xE3,0x08,0xD7,0x44,0x10,0x41,0xCE,0x93,0xF6,0x59,0x71,0xD2,0xF7,0x1C,0x4A,0x44,0x2D,0xA9,0x44,0x98,0x3A,0x00,0x71,0xCC,0x2A,0x35,0xC1,0x81,0xCF,0x44,0xF7,0x6A,0x0E,0xE4,0xF2,0xFC,0xD6,0x0B,0xA8,0x95,0x7B,0x86,0xB5,0xF8,0x33,0xE9,0xBF,0x6A,0x0E,0xE6,0x53,0x82}; +//const unsigned char FCCH80[] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}; +//const unsigned char SCH40[] = {0x0a,0x3f,0x46,0xb4,0x00}; + + + + +#define create_Ack_L234 {\ + Base_tm *ackl234new = new Short_tm;\ + ackl234new->next_TM = NULL;\ + /*return telemetry pointer here*/\ + uint8_t temp8;\ + temp8 = SHORT_TM_CODE;\ + PUTshort_or_long_tm(ackl234new->fields, temp8);\ + temp8 = TMID_ACK_L234;\ + PUTtmid((ackl234new->fields), temp8);\ + ackl234new->TM_string[0] = TMID_ACK_L234 << 4;\ + ackl234new->TM_string[1] = 0x12;\ + ackl234new->TM_string[2] = ack_code; /* Ack code ....to be chnaged accordind to situation */\ + for(int i = 3; i < 11; ++i){\ + ackl234new->TM_string[i] = 0x00;\ + }\ + uint16_t crc = crc16_gen(ackl234new->TM_string, TM_SHORT_SIZE-2);\ + ackl234new->TM_string[11] = (crc & 0xFF00) >> 8;\ + ackl234new->TM_string[12] = crc & 0x00FF; \ +} + +#define make_T_frame_Ack_andcallsign {\ +} + +void restart_adf(){ + + } + +int diff_prev; +void differential_encode(unsigned char* ptr, int length){ + for(int i=0; i<length;i++){ + unsigned char s = ptr[i] , t; + t = s ^ (s >> 1); + (diff_prev == 0) ? t=t^0x00 : t=t^0x80 ; + diff_prev = int(s & 0x01); + ptr[i] = t; + } +} + +#define check_PA_temp {\ +/* return 0 or 1*/\ + PA_HOT=0;\ +} + +int get_Ack_L1(){ + for(int i=0;i<288;i++){ +// Ack_andcallsign[i] = 0xff; + } + //cout<<"in side get_Ack_L1"<<endl<<"\r"; + return 1; +} + +#define send_Ack_andcallsign{\ + if(T_frames_sent < T_frames_in_segment){\ + buffer_112[counter_buffer_112] = Ack_andcallsign[counter_Ack_andcallsign++]; /* to be changed sukhdeep should write in buffer_112*/\ + if(counter_Ack_andcallsign == 318){\ + counter_Ack_andcallsign = 0;\ + T_frames_sent = T_frames_sent +2;\ + if(repeat_last_2T_frames){\ + /*cout<<"repeated last two T frames"<<" ";*/\ + /*cout<<"T_frames_sent = "<<T_frames_sent<<ENDL;*/\ + }\ + else{\ + /*cout<<"Ackandcallsign sent"<<" ";*/\ + /*cout<<"T_frames_sent = "<<T_frames_sent<<ENDL;*/\ + T_frame_Ack_andcallsign_sent = T_frame_Ack_andcallsign_sent + 2;\ + if(T_frame_Ack_andcallsign_sent == T_frame_in_Ackandcallsign ){\ + repeat_last_2T_frames = true;\ + }\ + else if(T_frame_Ack_andcallsign_sent < T_frame_in_Ackandcallsign){\ + make_T_frame_Ack_andcallsign;\ + }\ + else{\ + /*cout<<"error in send_Ack_andcallsign if T_frames_sent < T_frames_in_segment"<<ENDL;*/\ + }\ + }\ + if(T_frames_sent == T_frames_in_segment){\ + if(T_frame_Ack_andcallsign_sent < T_frame_in_Ackandcallsign){\ + if(segments_sent + 1>= max_segments){\ + adf_limit = true;\ + segments_sent = 0;\ + /*cout<<"adf limit reached"<<ENDL;*/\ + }\ + else{\ + enable_new_segment = true;\ + /*cout<<"new segment"<<ENDL;*/\ + }\ + }\ + else{\ + send_EoS_and_stop = true; \ + } \ + }\ + }\ + }\ + else if(send_EoS_and_stop){\ + buffer_112[counter_buffer_112] = EoS[counter_EoS++];\ + if(counter_EoS == 120){\ + /*cout<<"segments_sent = "<<segments_sent<<ENDL;*/\ + /*cout<<"EoS sent"<<ENDL;*/\ + counter_EoS = 0;\ + enable_ackandcallsign = false;\ + stop =true;\ + last_buffer = true;\ + }\ + }\ + else if(adf_limit){\ + buffer_112[counter_buffer_112] = EoS[counter_EoS++];\ + if(counter_EoS == 120){\ + counter_EoS = 0;\ + /*cout<<"EoS sent"<<ENDL;*/\ + restart_adf();\ + enable_new_segment = true;\ + /*cout<<"new session"<<ENDL;*/\ + /*cout<<"new segment"<<ENDL;*/\ + T_frames_sent = 0;\ + segments_sent = 0; \ + adf_limit = false;\ + }\ + }\ + else{\ + gPC.printf("error in send_Ack_andcallsign()");\ + }\ +} +#define send_S_frame {\ + buffer_112[counter_buffer_112] = S_frame[counter_S_frame++];\ + if(counter_S_frame == 48){\ + enable_new_segment=false;\ + counter_S_frame = 0;\ + /*cout<<"S_frame_sent"<<ENDL;*/\ + if(new_OBSRS_TC){\ + enable_call_sign = true;\ + new_OBSRS_TC = false;\ + }\ + else{\ + enable_read_block = true;\ + }\ + }\ +} + +#define send_call_sign {\ + buffer_112[counter_buffer_112] = call_sign_buffer[counter_call_sign_buffer++];\ + if(counter_call_sign_buffer == 318){\ + counter_call_sign_buffer = 0;\ + enable_call_sign = false;\ + new_session =false;\ + /*cout<<"call_sign_sent"<<" ";*/\ + T_frames_sent = T_frames_sent+2;\ + if(SID==0x0 || SID==0x2 || SID==0x3 || SID==0x4 || SID==0x5){\ + valid_SID=true;\ + /*cout<<"valid SID"<<ENDL;*/\ + }\ + else{\ + valid_SID=false;\ + gPC.printf("invalid SID");\ + enable_ackandcallsign = true;\ + create_Ack_andcallsign = true;\ + ack_code = 0x02;\ + }\ + check_PA_temp;\ + /*cout<<"pa_hot = "<<PA_HOT<<ENDL;*/\ + if(PA_HOT){\ + enable_ackandcallsign = true;\ + create_Ack_andcallsign = true;\ + enable_read_block = false;\ + }\ + else{\ + enable_read_block = true;\ + enable_ackandcallsign = false;\ + }\ + }\ +} + +//uint16_t SD_READ(uint64_t block_to_read){ +// for(int i=0;i<318;i++){ +// buffer_512[counter_buffer_512++] = 0xff; +// } +// for(int i=319;i<512;i++){ +// buffer_512[counter_buffer_512++] = 0x00; +// } +// counter_buffer_512 = 0; +// return 0xA0; // if success +//// return 0x85; // Hardware failure +// // return 0x86; // invalid TC +//} + +void send_tm_from_SD_card(){ + for(counter_buffer_112=0;counter_buffer_112<112;counter_buffer_112++){ + if(enable_new_segment){ // starting new segment + send_S_frame; + T_frames_sent=0; + } + else if(enable_call_sign){ // sending call sign + send_call_sign ; + } + else if(enable_T_frame){ + if(read_success == 0){ + if(T_frames_sent < T_frames_in_segment){ + if (enable_SCH) + { + buffer_112[counter_buffer_112] = SCH40[counter_SCH40++]; + if (counter_SCH40 == 5) + { +// cout<<"sch sent"<<ENDL; + counter_SCH40 = 0; + enable_SCH = false; + enable_DS = true; + } + } + else if (enable_DS) + { + buffer_112[counter_buffer_112] = buffer_512[counter_buffer_512++]; + if ((counter_buffer_512 == 288) || (counter_buffer_512 == 144)) + { +// cout<<"ds sent"<<ENDL; +// counter_buffer_512 = 0; + enable_DS = false; + enable_FCCH = true; + } + } + else if (enable_FCCH) + { + buffer_112[counter_buffer_112] = FCCH80[counter_FCCH80++]; + if (counter_FCCH80 == 10) + { +// cout<<"fcch sent"<<ENDL; + enable_FCCH = false; + if(counter_buffer_512 == 144){ + enable_SCH = true; + counter_FCCH80 = 0; + } + else{ + + } + } + } + if((counter_FCCH80 == 10)&&(counter_buffer_512 == 288)){ + counter_FCCH80 = 0; + counter_buffer_512 = 0; + T_frames_sent = T_frames_sent+2; +// cout<<"T_frames_sent "<<T_frames_sent<<ENDL; + if(last_block){ +// cout<<"last block"<<endl<<"\r"; + enable_read_block = false; + enable_T_frame = false; + enable_ackandcallsign = true; + create_Ack_andcallsign = true; + if(T_frames_sent == T_frames_in_segment){ + if(segments_sent + 1>= max_segments){ + adf_limit = true; + segments_sent = 0; + gPC.printf("adf limit reached here"); + } + else{ + enable_new_segment = true; +// cout<<"new segment"<<ENDL; + } + } + continue; + } + else{ + check_PA_temp; +// cout<<"pa_hot = "<<PA_HOT<<" "; + if(PA_HOT){ + enable_T_frame = false; + enable_read_block = false; + enable_ackandcallsign = true; + create_Ack_andcallsign = true; + } + else{ + enable_read_block = true; + } + } + if(T_frames_sent == T_frames_in_segment){ + enable_read_block = false; + enable_T_frame = false; + if((segments_sent + 1) >= max_segments){ + adf_limit = true; + segments_sent++; +// gPC.printf("segments_sent = "<<segments_sent<<ENDL; + gPC.printf("in for adf limit reached"); + } + else{ + enable_new_segment = true; + gPC.printf("data in next segment"); + segments_sent++; +// cout<<"segments_sent = "<<segments_sent<<ENDL; + } + } + else if(T_frames_sent > T_frames_in_segment){ + gPC.printf("error in enable T_frame"); + } + } + } + else if(T_frames_sent > T_frames_in_segment){ + gPC.printf("error in if(read_success)"); + } + } + else{ + gPC.printf("error in enable T_frame"); + } + } + else if(adf_limit){ + buffer_112[counter_buffer_112] = EoS[counter_EoS++]; + if(counter_EoS == 120){ +// cout<<"EoS sent"<<ENDL; + restart_adf(); + enable_new_segment = true; + counter_EoS = 0; +// cout<<"new session"<<ENDL; +// cout<<"new segment"<<ENDL; + T_frames_sent = 0; + segments_sent = 0; + adf_limit = false; + } + } + else if(stop){ +// cout<<"Done bro"<<ENDL; + break; + } + else if(enable_ackandcallsign){ + if(create_Ack_andcallsign){ + create_Ack_L234; + Ack_L1 = get_Ack_L1(); + make_T_frame_Ack_andcallsign; + create_Ack_andcallsign = false; + } + send_Ack_andcallsign; + } + + else if(enable_EoS){ +// send_EoS(); + buffer_112[counter_buffer_112] = EoS[counter_EoS++]; + if(counter_EoS == 120){ +// cout<<"segments_sent = "<<segments_sent<<ENDL; +// cout<<"EoS sent"<<ENDL; + counter_EoS = 0; + enable_EoS=false; + enable_new_segment = true; + break; + } + else{ + gPC.printf("Error in enable EoS"); + } + } + else{ + gPC.printf("error in for loop"); + } + if(enable_read_block && (!last_block)){ + if(short_TC){ + /*cout<<"reading"<<int(FSC)<<" "<<int(SID)<<ENDL;*/ +// for(int i=0;i<512;i++){ +// printf("0x%02X,",write_buffer[i]); +// } + int write_success = SD_WRITE(write_buffer,FSC + block_counter,SID); +// wait_ms(8); + read_success = SD_READ(buffer_512, FSC + block_counter,SID); +// wait_ms(8); +// cout<<"read_success = "<<read_success<<ENDL<<"\r\n"; +// cout<<"write_success = "<<write_success<<ENDL; +// for(int i=0;i<512;i++){ +// printf("0x%02X,",buffer_512[i]); +// } + } + else{ + read_success = SD_READ(buffer_512, list_of_FSC[block_counter],SID); + } + ack_code = read_success; + block_counter++; + if(block_counter == no_of_frames){ + last_block=true; + } + enable_read_block = false; + if(read_success == 0){ +// cout<<"read one block successfully"<<" "; + enable_T_frame = true; + enable_SCH = true; + } + else if(ack_code == 0x85){ + gPC.printf("Hardware failure"); + enable_T_frame = false; + } + else if(ack_code == 0x86){ + gPC.printf("Invalid FSC"); + enable_T_frame = false; + } + else{ + gPC.printf("error Invalid ack code"); + enable_T_frame = false; + stop = true; + } + } + if((PA_HOT || (!valid_SID)|| (read_success != 0))&&(!enable_ackandcallsign)){ + enable_ackandcallsign = true; + create_Ack_andcallsign = true; + enable_T_frame = false; + } + } +// for(int i=0;i<112;i++){ +// printf("0x%02X,",buffer_112[i]); +// } + differential_encode(buffer_112, 112); + if(last_buffer ==true){ + diff_prev=0; + } +} + +void execute_OBSRS_TC(Base_tc *tcp){ + short_TC = true; + //pc.printf("WELCOME\n\r"); +// FCTN_CDMS_SD_INIT();/* sd card initialization*/ +// SID = 0x0; +// FSC =10; +// no_of_frames =1; +// short_TC = true; +// adf_SND_SDCard; + + if( GETshort_or_long_tc(tcp) == SHORT_TC_CODE ){ + short_TC = true; + } + else{ + short_TC = false; + } + /* reading SID from TC */ + SID = (tcp->TC_string[2]) & 0x0f; + /* reading FSC and no. of frames from TC */ + if(short_TC){ + FSC = tcp->TC_string[3] << 24; + FSC += tcp->TC_string[4] << 16; + FSC += tcp->TC_string[5] << 8; + FSC += tcp->TC_string[6]; + no_of_frames = tcp->TC_string[7] << 8; + no_of_frames += tcp->TC_string[8]; + } + else{ + no_of_frames = tcp->TC_string[3]; + for(int i=0 ;i<no_of_frames ; i++){ + list_of_FSC[i] = tcp->TC_string[4+i]; + } + } + gPC.printf("sid = %u \r\n",SID); + gPC.printf("FSC = %u\r\n",FSC); +// cout<<"max_segments = "<<max_segments<<ENDL; + //while(0){ +// while(!stop){ +// // send_call_sign(); +// if(short_TC){ +// send_tm_from_SD_card(); +// } +// else{ +// send_tm_from_SD_card(); +// } +// } +} \ No newline at end of file
--- a/SDC_init.h Wed Jan 20 15:00:28 2016 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,427 +0,0 @@ -//Serial PC(USBTX, USBRX); -//DigitalOut cs_SDCard(PTE22); -DigitalOut cs_SDCard(PTB1); - -#define SD_COMMAND_TIMEOUT 5000 - -#define SD_DBG 0 - -#define R1_IDLE_STATE (1 << 0) -#define R1_ERASE_RESET (1 << 1) -#define R1_ILLEGAL_COMMAND (1 << 2) -#define R1_COM_CRC_ERROR (1 << 3) -#define R1_ERASE_SEQUENCE_ERROR (1 << 4) -#define R1_ADDRESS_ERROR (1 << 5) -#define R1_PARAMETER_ERROR (1 << 6) -//SPI spi(PTA16, PTA17, PTA15); // mosi, miso, sclk - - -int initialise_card(); -int initialise_card_v1(); -int initialise_card_v2(); -int disk_initialize(); -//int disk_write(const uint8_t *, uint64_t); - -int disk_erase(int,int); - -uint64_t sd_sectors(); -uint64_t sectors; - -int cmd(int, int); -int cmd58(); -int cmdx(int, int); -int cmd8(); -int read(uint8_t*, uint32_t ); -int write(const uint8_t*, uint32_t ); -static uint32_t ext_bits(unsigned char *, int , int ); - -int cdv; - -#define SDCARD_FAIL 0 -#define SDCARD_V1 1 -#define SDCARD_V2 2 -#define SDCARD_V2HC 3 - -int count_bro; -int i; -int random[1000]; - - -void initialisation_SDCard(){ -//******************************* - -// cs_adf =1; - -//************************** - -// start_block_num =10 ; // Read from TC -// end_block_num =Science_TMframe::SDC_address ; // Read from TC -// //gPC.printf("welcome\n"); - initialise_card(); - int result= initialise_card(); -// //gPC.printf("initialise card result=%d\n",result); - disk_initialize(); -} - - - - -int initialise_card() -{ - // Set to 100kHz for initialisation, and clock card with cs_SDCard = 1 - spi.frequency(100000); - cs_SDCard = 1; - for (int i = 0; i < 16; i++) { - spi.write(0xFF); - } - - // send CMD0, should return with all zeros except IDLE STATE set (bit 0) - if (cmd(0, 0) != R1_IDLE_STATE) { - debug("No disk, or could not put SD card in to SPI idle state\n"); - return SDCARD_FAIL; - } - -// send CMD8 to determine whther it is ver 2.x - int r = cmd8(); - if (r == R1_IDLE_STATE) { -// //gPC.printf("Entering v2 bro\n"); - return initialise_card_v2(); - - } else if (r == (R1_IDLE_STATE | R1_ILLEGAL_COMMAND)) { - //gPC.printf("Entering v1 bro\n"); - return initialise_card_v1(); - - } else { - debug("Not in idle state after sending CMD8 (not an SD card?)\n"); - return SDCARD_FAIL; - } -} - -int initialise_card_v1() -{ - for (int i = 0; i < SD_COMMAND_TIMEOUT; i++) { - cmd(55, 0); - if (cmd(41, 0) == 0) { - // //gPC.printf("Yuppie v1 successful\n"); - cdv = 512; - debug_if(SD_DBG, "\n\rInit: SEDCARD_V1\n\r"); - - return SDCARD_V1; - } - } - - debug("Timeout waiting for v1.x card\n"); - return SDCARD_FAIL; -} - - -int initialise_card_v2() -{ - for (int i = 0; i < SD_COMMAND_TIMEOUT; i++) { - wait_ms(50); - cmd58(); - cmd(55, 0); - if (cmd(41, 0x40000000) == 0) { - // //gPC.printf("Yuppie,v2 successful\n"); - cmd58(); - debug_if(SD_DBG, "\n\rInit: SDCARD_V2\n\r"); - cdv = 1; - - return SDCARD_V2; - } - } - - debug("Timeout waiting for v2.x card\n"); - return SDCARD_FAIL; -} - -int cmd(int cmd, int arg) -{ - cs_SDCard = 0; - - // send a command - spi.write(0x40 | cmd); - spi.write(arg >> 24); - spi.write(arg >> 16); - spi.write(arg >> 8); - spi.write(arg >> 0); - spi.write(0x95); - - // wait for the repsonse (response[7] == 0) - for (int i = 0; i < SD_COMMAND_TIMEOUT; i++) { - int response = spi.write(0xFF); - if (!(response & 0x80)) { - cs_SDCard = 1; - spi.write(0xFF); - return response; - } - } - cs_SDCard = 1; - spi.write(0xFF); - return -1; // timeout -} - - -int cmd58() -{ - cs_SDCard = 0; - int arg = 0; - - // send a command - spi.write(0x40 | 58); - spi.write(arg >> 24); - spi.write(arg >> 16); - spi.write(arg >> 8); - spi.write(arg >> 0); - spi.write(0x95); - - // wait for the repsonse (response[7] == 0) - for (int i = 0; i < SD_COMMAND_TIMEOUT; i++) { - int response = spi.write(0xFF); - if (!(response & 0x80)) { - int ocr = spi.write(0xFF) << 24; - ocr |= spi.write(0xFF) << 16; - ocr |= spi.write(0xFF) << 8; - ocr |= spi.write(0xFF) << 0; - cs_SDCard = 1; - spi.write(0xFF); - return response; - } - } - cs_SDCard = 1; - spi.write(0xFF); - return -1; // timeout -} - - -int cmd8() -{ - cs_SDCard = 0; - - // send a command - spi.write(0x40 | 8); // CMD8 - spi.write(0x00); // reserved - spi.write(0x00); // reserved - spi.write(0x01); // 3.3v - spi.write(0xAA); // check pattern - spi.write(0x87); // crc - - // wait for the repsonse (response[7] == 0) - for (int i = 0; i < SD_COMMAND_TIMEOUT * 1000; i++) { - char response[5]; - response[0] = spi.write(0xFF); - if (!(response[0] & 0x80)) { - for (int j = 1; j < 5; j++) { - response[i] = spi.write(0xFF); - } - cs_SDCard = 1; - spi.write(0xFF); - return response[0]; - } - } - cs_SDCard = 1; - spi.write(0xFF); - return -1; // timeout -} - -uint64_t sd_sectors() -{ - uint32_t c_size, c_size_mult, read_bl_len; - uint32_t block_len, mult, blocknr, capacity; - uint32_t hc_c_size; - uint64_t blocks; - - // CMD9, Response R2 (R1 byte + 16-byte block read) - if (cmdx(9, 0) != 0) { - debug("Didn't get a response from the disk\n"); - return 0; - } - - uint8_t csd[16]; - if (read(csd, 16) != 0) { - debug("Couldn't read csd response from disk\n"); - return 0; - } - - // csd_structure : csd[127:126] - // c_size : csd[73:62] - // c_size_mult : csd[49:47] - // read_bl_len : csd[83:80] - the *maximum* read block length - - int csd_structure = ext_bits(csd, 127, 126); - - switch (csd_structure) { - case 0: - cdv = 512; - c_size = ext_bits(csd, 73, 62); - c_size_mult = ext_bits(csd, 49, 47); - read_bl_len = ext_bits(csd, 83, 80); - - block_len = 1 << read_bl_len; - mult = 1 << (c_size_mult + 2); - blocknr = (c_size + 1) * mult; - capacity = blocknr * block_len; - blocks = capacity / 512; - debug_if(SD_DBG, "\n\rSDCard\n\rc_size: %d \n\rcapacity: %ld \n\rsectors: %lld\n\r", c_size, capacity, blocks); - break; - - case 1: - cdv = 1; - hc_c_size = ext_bits(csd, 63, 48); - blocks = (hc_c_size+1)*1024; - debug_if(SD_DBG, "\n\rSDHC Card \n\rhc_c_size: %d\n\rcapacity: %lld \n\rsectors: %lld\n\r", hc_c_size, blocks*512, blocks); - break; - - default: - debug("CSD struct unsupported\r\n"); - return 0; - }; - return blocks; -} - -int cmdx(int cmd, int arg) -{ - cs_SDCard = 0; - - // send a command - spi.write(0x40 | cmd); - spi.write(arg >> 24); - spi.write(arg >> 16); - spi.write(arg >> 8); - spi.write(arg >> 0); - spi.write(0x95); - - // wait for the repsonse (response[7] == 0) - for (int i = 0; i < SD_COMMAND_TIMEOUT; i++) { - int response = spi.write(0xFF); - if (!(response & 0x80)) { - return response; - } - } - cs_SDCard = 1; - spi.write(0xFF); - return -1; // timeout -} - -static uint32_t ext_bits(unsigned char *data, int msb, int lsb) -{ - uint32_t bits = 0; - uint32_t size = 1 + msb - lsb; - for (int i = 0; i < size; i++) { - uint32_t position = lsb + i; - uint32_t byte = 15 - (position >> 3); - uint32_t bit = position & 0x7; - uint32_t value = (data[byte] >> bit) & 1; - bits |= value << i; - } - return bits; -} - -int disk_initialize() -{ - int i = initialise_card(); - debug_if(SD_DBG, "init card = %d\n", i); - sectors = sd_sectors(); - - // Set block length to 512 (CMD16) - if (cmd(16, 512) != 0) { - debug("Set 512-byte block timed out\n"); - return 1; - } else { - // //gPC.printf("Hey,block init succesful\n"); - } - - spi.frequency(1000000); // Set to 1MHz for data transfer - return 0; -} - -int disk_write(const uint8_t *buffer, uint64_t block_number) - -{ - // set write address for single block (CMD24) - if (cmd(24, block_number * cdv) != 0) { - return 1; - } - - // send the data block - write(buffer, 512); - ////gPC.printf("Written Successfully bro \n"); - return 0; -} - -int write(const uint8_t*buffer, uint32_t length) -{ - cs_SDCard = 0; - - // indicate start of block - spi.write(0xFE); - - // write the data - for (int i = 0; i < length; i++) { - spi.write(buffer[i]); - } - - // write the checksum - spi.write(0xFF); - spi.write(0xFF); - - // check the response token - if ((spi.write(0xFF) & 0x1F) != 0x05) { - cs_SDCard = 1; - spi.write(0xFF); - return 1; - } - - // wait for write to finish - while (spi.write(0xFF) == 0); - - cs_SDCard = 1; - spi.write(0xFF); - return 0; -} - -int disk_read(uint8_t *buffer, uint64_t block_number) -{ - // set read address for single block (CMD17) - if (cmd(17, block_number * cdv) != 0) { - return 1; - } - - // receive the data - read(buffer, 512); - return 0; -} - -int read(uint8_t *buffer, uint32_t length) -{ - cs_SDCard = 0; - - // read until start byte (0xFF) - while (spi.write(0xFF) != 0xFE); - - // read data - for (int i = 0; i < length; i++) { - buffer[i] = spi.write(0xFF); - } - spi.write(0xFF); // checksum - spi.write(0xFF); - - cs_SDCard = 1; - spi.write(0xFF); - return 0; -} - -int disk_erase(int startBlock, int totalBlocks) -{ - if(cmd(32, startBlock * cdv) != 0) { - return 1; - } - if (cmd(33, (startBlock+totalBlocks-1) * cdv) != 0) { - return 1; - } - if (cmd(38,0) != 0) { - return 1; - } - - return 0; //normal return -} \ No newline at end of file
--- a/SDCread.h Wed Jan 20 15:00:28 2016 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,190 +0,0 @@ -// It takes 276us to read from sd card and write in 112 buffer - -//~ #include"SDcard.h" -#define T_frames 30 -unsigned char buffer_112_counter,sent_tm = 0; -int disk_read(uint8_t *, uint64_t),j; -bool new_session = true; -bool last_buffer = false; -bool first_block = true; -bool last_block =false; -bool repeat_T_frame = false; -unsigned int counter_in_block=0,diff_prev=0; -unsigned char EOS_counter = 0; -unsigned char enable_T_frame = false; -uint64_t start_block_num ; // Read from TC -uint64_t end_block_num ; // Read from TC -uint64_t Number_of_blocks_to_read ; -uint64_t block_counter = 0; -unsigned char buffer_512[512], buffer_112[112],counter_in_S_frame=0,counter_in_SCH=0; -unsigned char make_EOS_flag = true; -bool reset = false; - -void differential_encode(unsigned char* ptr, int length){ - - for(int i=0; i<length;i++){ - - unsigned char s = ptr[i] , t; - t = s ^ (s >> 1); - (diff_prev == 0) ? t=t^0x00 : t=t^0x80 ; - diff_prev = int(s & 0x01); - ptr[i] = t; - } - - } - -void send_tm_from_SD_card(){ - - if(make_EOS_flag == true){ - make_EOS_flag = false; - Number_of_blocks_to_read = end_block_num - start_block_num +1; - } - - - for(buffer_112_counter=0;buffer_112_counter<112;buffer_112_counter++){ - - - if(new_session == true){ //check if it is beginnig of session - - buffer_112[buffer_112_counter]=S_frame[counter_in_S_frame++]; // sending S frame - - if(counter_in_S_frame==48){ -// cout<<"new_session_over\n"; - counter_in_S_frame=0; - new_session = false; - enable_T_frame = true; -// enable_SCH = true; - } - } - else if(enable_T_frame == true){ // To send t frames - - if(block_counter != Number_of_blocks_to_read){ - - if(first_block){ // Read first block -// cout<<"brooooooo"<<start_block_num<<"yo"<<endl; - SPI_mutex.lock(); - disk_read(buffer_512,start_block_num ); - SPI_mutex.unlock(); - counter_in_block = 0; - block_counter++; - - first_block = false; -// cout<<"first block exit\n"; -// cout<<Number_of_blocks_to_read; - - ////gPC.printf("\n"); -// for(int j=0;j<512;j++){ -// //gPC.printf("%02X ",buffer_512[j]); -// } -// //gPC.printf("\n"); -// if(block_counter == Number_of_blocks_to_read){ -// last_block = true; -// } - - - } - if((counter_in_block == 318 )&&(sent_tm<38)){ // Read next block - -// cout<<"next block exit\n"; - SPI_mutex.lock(); - disk_read(buffer_512,start_block_num + block_counter ); - SPI_mutex.unlock(); - counter_in_block = 0; - block_counter++; - if(block_counter == Number_of_blocks_to_read){ - last_block = true; - } - } - } - - if(!last_block){ - - // cout<<int(sent_tm)<<" "; - if(sent_tm<38){ - buffer_112[buffer_112_counter] = buffer_512[counter_in_block++]; // sending T frames -// cout<<int (counter_in_block)<<" "; - if(counter_in_block == 318){ - - sent_tm = sent_tm + 2; - } - } - else if(sent_tm == (T_frames-1)){ - buffer_112[buffer_112_counter] = buffer_512[(counter_in_block++ )-159]; - if(counter_in_block == 318){ -// cout<<"last block exit\n"; - sent_tm = T_frames; - } - } - else if(sent_tm == T_frames){ // Give eos and start new session - buffer_112[buffer_112_counter]=EoS[EOS_counter++]; - if(EOS_counter == 120){ - enable_T_frame = false; - new_session = true; - EOS_counter =0; - sent_tm=0; - repeat_T_frame = false; -// cout<<"eos exit\n"; - } - } - } - if(last_block){ -// cout<<"lb"; - if(sent_tm == (T_frames-1) && (repeat_T_frame == false)){ - buffer_112[buffer_112_counter] = buffer_512[(counter_in_block++ )-159]; - if(counter_in_block == 318){ -// cout<<"repeat block exit\n"; - sent_tm = T_frames; - } - } - if((sent_tm == T_frames) && (repeat_T_frame == false)){ // Give eos and start new session - buffer_112[buffer_112_counter]=EoS[EOS_counter++]; - if(EOS_counter == 120){ -// cout<<"eos exit"; - enable_T_frame = false; - new_session = true; - EOS_counter =0; - sent_tm=0; - } - } - else if((sent_tm < (T_frames-1)) && (repeat_T_frame == false)){ - buffer_112[buffer_112_counter] = buffer_512[counter_in_block++]; // sending last two T frames - if(counter_in_block == 318){ - sent_tm = sent_tm + 2; - repeat_T_frame= true; - } - } - else if((sent_tm< T_frames) && (repeat_T_frame == true)){ - buffer_112[buffer_112_counter] = buffer_512[(counter_in_block++ )-159]; - if(counter_in_block == 477){ - sent_tm = sent_tm +1; - counter_in_block = counter_in_block-159; - } - } - else if((sent_tm == T_frames ) && (repeat_T_frame == true)){ // Give eos and start new session - - buffer_112[buffer_112_counter]=EoS[EOS_counter++]; - if(EOS_counter == 120){ - enable_T_frame = false; - new_session = true; - EOS_counter =0; -// //gPC.printf("yoooo %d",int(sent_tm)); - sent_tm=0; - - last_block = false; - last_buffer = true; - //gPC.printf("?\r\n"); - break; - } - } - - } - - } - - } - differential_encode(buffer_112, 112); - if(last_buffer ==true){ - diff_prev=0; - } - -} \ No newline at end of file
--- a/adf.h Wed Jan 20 15:00:28 2016 +0000 +++ b/adf.h Wed Jan 20 16:40:28 2016 +0000 @@ -317,19 +317,19 @@ }\ } -void read_TC(Base_tc* TC_ptr){ - //gPC.puts("Inside sd card sending\r\n"); - unsigned char service_subtype = 0; - uint64_t starting_add = 0, ending_add = 0; - service_subtype = (TC_ptr->TC_string[2])&0x0f; - starting_add = (TC_ptr->TC_string[5]) + ( (TC_ptr->TC_string[4])<<8 ) + ( (TC_ptr->TC_string[3]) <<16); - ending_add = (TC_ptr->TC_string[8]) + ( (TC_ptr->TC_string[7])<<8 ) + ( (TC_ptr->TC_string[6]) <<16); - starting_add = 10; // for now - ending_add = 20; -// adf_SND_SDCard(starting_add , ending_add); - //gPC.puts("sending from sd card\r\n"); - adf_SND_SDCard; -} +//void read_TC(Base_tc* TC_ptr){ +// //gPC.puts("Inside sd card sending\r\n"); +// unsigned char service_subtype = 0; +// uint64_t starting_add = 0, ending_add = 0; +// service_subtype = (TC_ptr->TC_string[2])&0x0f; +// starting_add = (TC_ptr->TC_string[5]) + ( (TC_ptr->TC_string[4])<<8 ) + ( (TC_ptr->TC_string[3]) <<16); +// ending_add = (TC_ptr->TC_string[8]) + ( (TC_ptr->TC_string[7])<<8 ) + ( (TC_ptr->TC_string[6]) <<16); +// starting_add = 10; // for now +// ending_add = 20; +//// adf_SND_SDCard(starting_add , ending_add); +// //gPC.puts("sending from sd card\r\n"); +// adf_SND_SDCard; +//} #define configure_adf {\ finish_write_data = false;\
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/cdms_sd.h Wed Jan 20 16:40:28 2016 +0000 @@ -0,0 +1,598 @@ + + + +//SPI spi(PTE1, PTE3, PTE2); // MOSI,MISO, CLOCK microcontroller(in order) +//DigitalOut cs_sd(PTE22); + +//Serial sd1(USBTX,USBRX); + + +#define SD_COMMAND_TIMEOUT 5000 + +#define SD_DBG 0 + +#define R1_IDLE_STATE (1 << 0) +#define R1_ERASE_RESET (1 << 1) +#define R1_ILLEGAL_COMMAND (1 << 2) +#define R1_COM_CRC_ERROR (1 << 3) +#define R1_ERASE_SEQUENCE_ERROR (1 << 4) +#define R1_ADDRESS_ERROR (1 << 5) +#define R1_PARAMETER_ERROR (1 << 6) + + + +#define SD_MAX_CYCLES 10000 + +extern uint8_t SD_INIT_FLAGS; + + + +int initialise_card(); +int initialise_card_v1(); +int initialise_card_v2(); +int disk_write(const uint8_t *, uint64_t); +int disk_read(uint8_t *, uint64_t); +int disk_initialize(); +int disk_erase(int,int); + +//void FCTN_CDMS_INIT_SD(); +//int FCTN_CDMS_WR_SD(const uint8_t *, uint64_t); +//int FCTN_CDMS_RD_SD(uint8_t *, uint64_t); +uint8_t FCTN_SD_MNGR(uint8_t); + + +int cmd(int, int); +int cmd58(); +int cmdx(int, int); +int cmd8(); +int read(uint8_t*, uint32_t ); +int write(const uint8_t*, uint32_t ); +static uint32_t ext_bits(unsigned char *, int , int ); +int SD_WRITE(uint8_t*,uint8_t,uint8_t); +void FCTN_CDMS_SD_INIT(); +int SD_READ(uint8_t*,uint8_t,uint8_t); +#define SDCARD_FAIL 0 +#define SDCARD_V1 1 +#define SDCARD_V2 2 +#define SDCARD_V2HC 3 + + + + + + + + + + + +int cdv; +uint64_t sd_sectors(); +uint64_t sectors; + +void FCTN_CDMS_SD_INIT() +{ + + initialise_card(); + + disk_initialize(); + +} + + + +uint8_t FCTN_SD_MNGR(uint8_t sid) + +{ + + uint32_t SD_MNG_SECT=7000; + uint32_t block_number; + uint8_t fsc; + uint8_t *buffer; + uint32_t i=0; + disk_read(buffer, SD_MNG_SECT); + + if(sid==0x0) + { + fsc=buffer[0]; + buffer[0]++; + buffer[511]+=2; + disk_write(buffer,SD_MNG_SECT); + } + if(sid==0x1) + { + fsc=buffer[1]; + buffer[1]++; + buffer[511]+=2; + disk_write(buffer,SD_MNG_SECT); + } + if(sid==0x2) + { + fsc=buffer[2]; + buffer[2]++; + buffer[511]+=2; + disk_write(buffer,SD_MNG_SECT); + } + if(sid==0x3) + { + fsc=buffer[30]; + printf("Hey buffer[300] pre-increment is %d\r\n",buffer[300]); + buffer[300]+=1; + printf("Hey buffer[300] post-increment is %d\r\n",buffer[300]); + buffer[511]+=2; + disk_write(buffer,SD_MNG_SECT); + disk_read(buffer, SD_MNG_SECT); + printf("Hey buffer[300] post writing is %d\r\n",buffer[300]); + printf("Hey buffer[511] post writing is %d\r\n",buffer[511]); + } + if(sid==0x4) + { + fsc=buffer[4]; + buffer[4]++; + buffer[511]+=2; + disk_write(buffer,SD_MNG_SECT); + } + return fsc; +} + + +int SD_WRITE(uint8_t* buffer,uint8_t fsc,uint8_t sid) +{ + + uint32_t SD_SCP_FIRST=1001; + uint32_t SD_SCP_LAST=2000; + uint32_t SD_SFF_AT_FIRST=2001; + uint32_t SD_SFF_AT_LAST = 3000; + uint32_t SD_SFF_BT_FIRST =3001; + uint32_t SD_SFF_BT_LAST=4000; + uint32_t SD_HK_ARCH_FIRST=4001; + uint32_t SD_HK_ARCH_LAST= 5000; + uint32_t LOG_FIRST =5001; + uint32_t LOG_LAST=6000; + uint32_t SD_MNG_SECT=7000; + uint32_t block_number; + int result; + if(sid==0x0) + { + block_number=SD_SCP_FIRST+uint32_t(fsc); +// printf("write_block_number=%d\r\n",block_number); + result= disk_write(buffer,block_number); + return result; + } + if(sid==0x1) + { + block_number=SD_SFF_AT_FIRST + fsc; + result= disk_write(buffer,block_number); + return result; + } + if(sid==0x2) + { + block_number=SD_SFF_BT_FIRST + fsc; + result= disk_write(buffer,block_number); + return result; + } + if(sid==0x3) + { + block_number=SD_HK_ARCH_FIRST+fsc; +// sd1.printf("Block number is %d \r\n",block_number); + result= disk_write(buffer,block_number); + return result; + } + if(sid==0x4) + { + block_number=LOG_FIRST +fsc; + result= disk_write(buffer,block_number); + return result; + } + return 1; +} + +int SD_READ(uint8_t* buffer,uint8_t fsc,uint8_t sid) +{ + + uint32_t SD_SCP_FIRST=1001; + uint32_t SD_SCP_LAST=2000; + uint32_t SD_SFF_AT_FIRST=2001; + uint32_t SD_SFF_AT_LAST = 3000; + uint32_t SD_SFF_BT_FIRST =3001; + uint32_t SD_SFF_BT_LAST=4000; + uint32_t SD_HK_ARCH_FIRST=4001; + uint32_t SD_HK_ARCH_LAST= 5000; + uint32_t LOG_FIRST =5001; + uint32_t LOG_LAST=6000; + uint32_t SD_MNG_SECT=7000; + uint32_t block_number; + int result; + if(sid==0x0) + { + block_number=SD_SCP_FIRST + uint32_t(fsc); +// sd1.printf("read_block_number=%d\r\n",block_number); + result= disk_read(buffer,block_number); + } + else if(sid==0x1) + { + block_number=SD_SFF_AT_FIRST + fsc; + result= disk_read(buffer,block_number); + } + else if(sid==0x2) + { + block_number=SD_SFF_BT_FIRST + fsc; + result= disk_read(buffer,block_number); + } + else if(sid==0x3) + { + block_number=SD_HK_ARCH_FIRST + fsc; + result= disk_read(buffer,block_number); + } + else if(sid==0x4) + { + block_number=LOG_FIRST +fsc; + result= disk_read(buffer,block_number); + } + else + { + return 1; + } + return result; +} + + +int initialise_card() +{ + // Set to 100kHz for initialisation, and clock card with cs_sd = 1 + spi.frequency(100000); // changed on 31 12 2015 to 1 MHz + cs_sd = 1; + for (int i = 0; i < 16; i++) { + spi.write(0xFF); + } + + // send CMD0, should return with all zeros except IDLE STATE set (bit 0) + if (cmd(0, 0) != R1_IDLE_STATE) { + debug("No disk, or could not put SD card in to spi idle state\r\n"); + return SDCARD_FAIL; + } + +// send CMD8 to determine whther it is ver 2.x + int r = cmd8(); + if (r == R1_IDLE_STATE) { + printf("\rEntering v2\r\n"); + return initialise_card_v2(); + + } else if (r == (R1_IDLE_STATE | R1_ILLEGAL_COMMAND)) { + printf("\rEntering v1\r\n"); + return initialise_card_v1(); + + } else { + debug("\rNot in idle state after sending CMD8 (not an SD card?)\r\n"); + return SDCARD_FAIL; + } +} + +int initialise_card_v1() +{ + for (int i = 0; i < SD_COMMAND_TIMEOUT; i++) { + cmd(55, 0); + if (cmd(41, 0) == 0) { + printf("\rv1 initialization successfull\r\n"); + cdv = 512; + debug_if(SD_DBG, "\n\rInit: SEDCARD_V1\n\r"); + + return SDCARD_V1; + } + } + + debug("\rTimeout waiting for v1.x card\r\n"); + return SDCARD_FAIL; +} + + +int initialise_card_v2() +{ + for (int i = 0; i < SD_COMMAND_TIMEOUT; i++) { + wait_ms(50); + cmd58(); + cmd(55, 0); + if (cmd(41, 0x40000000) == 0) { + printf("\rv2 initialization successfull\r\n"); + cmd58(); + debug_if(SD_DBG, "\n\rInit: SDCARD_V2\n\r"); + cdv = 1; + + return SDCARD_V2; + } + } + + debug("\rTimeout waiting for v2.x card\r\n"); + return SDCARD_FAIL; +} + +int cmd(int cmd, int arg) +{ + cs_sd = 0; + + // send a command + spi.write(0x40 | cmd); + spi.write(arg >> 24); + spi.write(arg >> 16); + spi.write(arg >> 8); + spi.write(arg >> 0); + spi.write(0x95); + + // wait for the repsonse (response[7] == 0) + for (int i = 0; i < SD_COMMAND_TIMEOUT; i++) { + int response = spi.write(0xFF); + if (!(response & 0x80)) { + cs_sd = 1; + spi.write(0xFF); + return response; + } + } + cs_sd = 1; + spi.write(0xFF); + return -1; // timeout +} + + +int cmd58() +{ + cs_sd = 0; + int arg = 0; + + // send a command + spi.write(0x40 | 58); + spi.write(arg >> 24); + spi.write(arg >> 16); + spi.write(arg >> 8); + spi.write(arg >> 0); + spi.write(0x95); + + // wait for the repsonse (response[7] == 0) + for (int i = 0; i < SD_COMMAND_TIMEOUT; i++) { + int response = spi.write(0xFF); + if (!(response & 0x80)) { + int ocr = spi.write(0xFF) << 24; + ocr |= spi.write(0xFF) << 16; + ocr |= spi.write(0xFF) << 8; + ocr |= spi.write(0xFF) << 0; + cs_sd = 1; + spi.write(0xFF); + return response; + } + } + cs_sd = 1; + spi.write(0xFF); + return -1; // timeout +} + + +int cmd8() +{ + cs_sd = 0; + + // send a command + spi.write(0x40 | 8); // CMD8 + spi.write(0x00); // reserved + spi.write(0x00); // reserved + spi.write(0x01); // 3.3v + spi.write(0xAA); // check pattern + spi.write(0x87); // crc + + // wait for the repsonse (response[7] == 0) + for (int i = 0; i < SD_COMMAND_TIMEOUT * 1000; i++) { + char response[5]; + response[0] = spi.write(0xFF); + if (!(response[0] & 0x80)) { + for (int j = 1; j < 5; j++) { + response[i] = spi.write(0xFF); + } + cs_sd = 1; + spi.write(0xFF); + return response[0]; + } + } + cs_sd = 1; + spi.write(0xFF); + return -1; // timeout +} + +uint64_t sd_sectors() +{ + uint32_t c_size, c_size_mult, read_bl_len; + uint32_t block_len, mult, blocknr, capacity; + uint32_t hc_c_size; + uint64_t blocks; + + // CMD9, Response R2 (R1 byte + 16-byte block read) + if (cmdx(9, 0) != 0) { + debug("\rDidn't get a response from the disk\n"); + return 0; + } + + uint8_t cs_sdd[16]; + if (read(cs_sdd, 16) != 0) { + debug("\rCouldn't read cs_sdd response from disk\n"); + return 0; + } + + // cs_sdd_structure : cs_sdd[127:126] + // c_size : cs_sdd[73:62] + // c_size_mult : cs_sdd[49:47] + // read_bl_len : cs_sdd[83:80] - the *maximum* read block length + + int cs_sdd_structure = ext_bits(cs_sdd, 127, 126); + + switch (cs_sdd_structure) { + case 0: + cdv = 512; + c_size = ext_bits(cs_sdd, 73, 62); + c_size_mult = ext_bits(cs_sdd, 49, 47); + read_bl_len = ext_bits(cs_sdd, 83, 80); + + block_len = 1 << read_bl_len; + mult = 1 << (c_size_mult + 2); + blocknr = (c_size + 1) * mult; + capacity = blocknr * block_len; + blocks = capacity / 512; + debug_if(SD_DBG, "\n\rSDCard\n\rc_size: %d \n\rcapacity: %ld \n\rsectors: %lld\n\r", c_size, capacity, blocks); + break; + + case 1: + cdv = 1; + hc_c_size = ext_bits(cs_sdd, 63, 48); + blocks = (hc_c_size+1)*1024; + debug_if(SD_DBG, "\n\rSDHC Card \n\rhc_c_size: %d\n\rcapacity: %lld \n\rsectors: %lld\n\r", hc_c_size, blocks*512, blocks); + break; + + default: + debug("cs_sdD struct unsupported\r\n"); + return 0; + }; + return blocks; +} + +int cmdx(int cmd, int arg) +{ + cs_sd = 0; + + // send a command + spi.write(0x40 | cmd); + spi.write(arg >> 24); + spi.write(arg >> 16); + spi.write(arg >> 8); + spi.write(arg >> 0); + spi.write(0x95); + + // wait for the repsonse (response[7] == 0) + for (int i = 0; i < SD_COMMAND_TIMEOUT; i++) { + int response = spi.write(0xFF); + if (!(response & 0x80)) { + return response; + } + } + cs_sd = 1; + spi.write(0xFF); + return -1; // timeout +} + +static uint32_t ext_bits(unsigned char *data, int msb, int lsb) +{ + uint32_t bits = 0; + uint32_t size = 1 + msb - lsb; + for (int i = 0; i < size; i++) { + uint32_t position = lsb + i; + uint32_t byte = 15 - (position >> 3); + uint32_t bit = position & 0x7; + uint32_t value = (data[byte] >> bit) & 1; + bits |= value << i; + } + return bits; +} + +int disk_initialize() +{ + int i = initialise_card(); + debug_if(SD_DBG, "init card = %d\n", i); + sectors = sd_sectors(); + + // Set block length to 512 (CMD16) + if (cmd(16, 512) != 0) { + debug("\rSet 512-byte block timed out\r\n"); + return 1; + } else { + printf("\rDisk initialization successfull\r\n"); + } + + spi.frequency(1000000); // Set to 1MHz for data transfer + return 0; +} + +int disk_write(const uint8_t *buffer, uint64_t block_number) + +{ + // set write address for single block (CMD24) + if (cmd(24, block_number * cdv) != 0) { + return 1; + } + + // send the data block + write(buffer, 512); + //printf("Written Successfully bro \n"); + return 0; +} + +int write(const uint8_t*buffer, uint32_t length) +{ + cs_sd = 0; + + // indicate start of block + spi.write(0xFE); + + // write the data + for (int i = 0; i < length; i++) { + spi.write(buffer[i]); + } + + // write the checksum + spi.write(0xFF); + spi.write(0xFF); + + // check the response token + if ((spi.write(0xFF) & 0x1F) != 0x05) { + cs_sd = 1; + spi.write(0xFF); + return 1; + } + + // wait for write to finish + while (spi.write(0xFF) == 0); + + cs_sd = 1; + spi.write(0xFF); + return 0; +} + +int disk_read(uint8_t *buffer, uint64_t block_number) +{ + // set read address for single block (CMD17) + if (cmd(17, block_number * cdv) != 0) { + return 1; + } + + // receive the data + read(buffer, 512); + return 0; +} + +int read(uint8_t *buffer, uint32_t length) +{ + cs_sd = 0; + + // read until start byte (0xFF) + while (spi.write(0xFF) != 0xFE); + + // read data + for (int i = 0; i < length; i++) { + buffer[i] = spi.write(0xFF); + } + spi.write(0xFF); // checksum + spi.write(0xFF); + + cs_sd = 1; + spi.write(0xFF); + return 0; +} + +int disk_erase(int startBlock, int totalBlocks) +{ + if(cmd(32, startBlock * cdv) != 0) { + return 1; + } + if (cmd(33, (startBlock+totalBlocks-1) * cdv) != 0) { + return 1; + } + if (cmd(38,0) != 0) { + return 1; + } + + return 0; //normal return +}
--- a/main.cpp Wed Jan 20 15:00:28 2016 +0000 +++ b/main.cpp Wed Jan 20 16:40:28 2016 +0000 @@ -10,6 +10,8 @@ #include "COM_SND_TM_functions.h" #include "COM_SND_TM.h" //#include "SDCread.h" +#include "cdms_sd.h" +#include "OBSRS.h" #include "adf.h" //#include "Compression.h" //#include "SDC_init.h" @@ -40,7 +42,7 @@ spi.frequency(1000000); // SD CARD - gCS_SDC = 1; + cs_sd = 1; gCS_RTC = 1; // initialise_card(); // int result= initialise_card();