// example static void test_milstd_rt_main() { // Подадрес для получения данных от КШ (КШ-ОУ) const unsigned char bc_subaddr_from = 8; // Подадрес для передачи данных в КШ (ОУ-КШ) const unsigned char bc_subaddr_to = 7; const int txIndex = MIL_STD_SUBADDR_WORD_INDEX(bc_subaddr_to); const int rxIndex = MIL_STD_SUBADDR_WORD_INDEX(bc_subaddr_from); mutex_lock(&mil_rt.lock); mil_std_tx_buffer[txIndex+0] = 0x30; mil_std_tx_buffer[txIndex+1] = 0x31; mil_std_tx_buffer[txIndex+2] = 0x32; mutex_unlock(&mil_rt.lock); int i=0; for (;;) { mutex_lock(&mil_rt.lock); for (i=0; i<3; ++i) ++mil_std_tx_buffer[txIndex + i]; mutex_unlock(&mil_rt.lock); debug_printf("\n"); debug_printf("rt(%d): dataToBeSent =", mil_rt.port); for (i=0; i<3; ++i) debug_printf(" %x", mil_std_tx_buffer[txIndex + i]); debug_printf("\n"); debug_printf("rt(%d): dataToBeRecvd =", mil_rt.port); for (i=0; i<3; ++i) debug_printf(" %x", mil_std_rx_buffer[rxIndex + i]); debug_printf("\n"); mdelay(5000); } }
static bool_t status_handler(void *arg) { milandr_mil1553_t *mil = (milandr_mil1553_t *)arg; MIL_STD_1553B_t *reg = (MIL_STD_1553B_t *)mil->reg; int word; uint32_t flag = reg->STATUS; if (mil->mode == MIL_MODE_RT) { unsigned short answerWord = MIL_STD_STATUS_ADDR_OU(mil->addr_self); if (flag & MIL_STD_STATUS_ERR) { answerWord |= MIL_STD_STATUS_MSG_ERR; mil->nb_errors++; } else { const unsigned short comWrd1 = reg->CommandWord1; const unsigned short comWrd2 = reg->CommandWord2; const unsigned int msg = reg->MSG; // Подадрес из командного слова 1 const unsigned char subaddr = (comWrd1 & MIL_STD_COMWORD_SUBADDR_MODE_MASK) >> MIL_STD_COMWORD_SUBADDR_MODE_SHIFT; // Код команды const unsigned int cmdCode = (comWrd1 & MIL_STD_COMWORD_WORDSCNT_CODE_MASK) >> MIL_STD_COMWORD_WORDSCNT_CODE_SHIFT; // Подадрес из командного слова 2 const unsigned char subaddr2 = (comWrd2 & MIL_STD_COMWORD_SUBADDR_MODE_MASK) >> MIL_STD_COMWORD_SUBADDR_MODE_SHIFT; // Код команды const unsigned int cmdCode2 = (comWrd2 & MIL_STD_COMWORD_WORDSCNT_CODE_MASK) >> MIL_STD_COMWORD_WORDSCNT_CODE_SHIFT; // Количество слов данных в сообщении const unsigned char wordsCount = (cmdCode == 0 ? 32 : cmdCode); const unsigned char wordsCount2 = (cmdCode2 == 0 ? 32 : cmdCode2); switch (msg) { // приём данных от КШ (КШ-ОУ), формат сообщения 7 case MSG_DATARECV__BC_RT__GROUP: answerWord |= MIL_STD_STATUS_GROUP_COMMAND_RECEIVED; // приём данных от КШ (КШ-ОУ), формат сообщения 1 case MSG_DATARECV__BC_RT__SINGLE: // Получено достоверное слово из канала if ((flag & MIL_STD_STATUS_RFLAGN) != 0) { // Установить ответное слово mil->reg->StatusWord1 = answerWord; } if ((flag & MIL_STD_STATUS_VALMESS) != 0) { mil->nb_words += wordsCount; int index = MIL_STD_SUBADDR_WORD_INDEX(subaddr); if (!mil->rxbuf[subaddr].busy) { for (word = 0; word < wordsCount; ++word) { mil->rxbuf[subaddr].data[word] = mil->reg->DATA[index + word] & 0xFFFF; } mil->rxbuf[subaddr].nb_words = wordsCount; } } break; // приём данных от ОУ (ОУ-ОУ), формат сообщения 8 case MSG_DATARECV__RT_RT__GROUP: answerWord |= MIL_STD_STATUS_GROUP_COMMAND_RECEIVED; // приём данных от ОУ (ОУ-ОУ), формат сообщения 3 case MSG_DATARECV__RT_RT__SINGLE: // #4 // Получено достоверное слово из канала if ((flag & MIL_STD_STATUS_RFLAGN) != 0) { // Установить ответное слово mil->reg->StatusWord1 = answerWord; } if ((flag & MIL_STD_STATUS_VALMESS) != 0) { mil->nb_words += wordsCount; // Прием от оконечного устройства if (!mil->rxbuf[subaddr].busy) { int index = MIL_STD_SUBADDR_WORD_INDEX(subaddr); for (word = 0; word < wordsCount; ++word) { mil->rxbuf[subaddr].data[word] = mil->reg->DATA[index + word] & 0xFFFF; } mil->rxbuf[subaddr].nb_words = wordsCount; } } break; // передача данных в КШ (ОУ-КШ), формат сообщения 2 case MSG_DATASEND__RT_BC__SINGLE: // Получено достоверное слово из канала if ((flag & MIL_STD_STATUS_RFLAGN) != 0) { // Установить ответное слово mil->reg->StatusWord1 = answerWord; if (!mil->txbuf[subaddr].busy) { int index = MIL_STD_SUBADDR_WORD_INDEX(subaddr); for (word = 0; word < wordsCount; ++word) { mil->reg->DATA[index + word] = mil->txbuf[subaddr].data[word] & 0xFFFF; } } } if ((flag & MIL_STD_STATUS_VALMESS) != 0) { mil->nb_words += wordsCount; } break; // передача данных в ОУ (ОУ-ОУ), формат сообщения 8 case MSG_DATASEND__RT_RT__GROUP: answerWord |= MIL_STD_STATUS_GROUP_COMMAND_RECEIVED; // передача данных в ОУ (ОУ-ОУ), формат сообщения 3 case MSG_DATASEND__RT_RT__SINGLE: // #1008 в оконечное устройство // Получено достоверное слово из канала if ((flag & MIL_STD_STATUS_RFLAGN) != 0) { // Установить ответное слово mil->reg->StatusWord1 = answerWord; if (!mil->txbuf[subaddr2].busy) { int index = MIL_STD_SUBADDR_WORD_INDEX(subaddr2); for (word = 0; word < wordsCount2; ++word) { mil->reg->DATA[index + word] = mil->txbuf[subaddr2].data[word] & 0xFFFF; } } } if ((flag & MIL_STD_STATUS_VALMESS) != 0) { mil->nb_words += wordsCount; } break; // команда управления 0-15 от КШ без слов данных, формат сообщения 9 case MSG_CMD_WITH_NODATA__0_0xf__GROUP: answerWord |= MIL_STD_STATUS_GROUP_COMMAND_RECEIVED; // команда управления 0-15 от КШ без слов данных, формат сообщения 4 case MSG_CMD_WITH_NODATA__0_0xf__SINGLE: // Получено достоверное слово из канала if ((flag & MIL_STD_STATUS_RFLAGN) != 0) { // неподдерживаемые команды (резерв) if (cmdCode >= 9 && cmdCode <= 0xf) { answerWord |= MIL_STD_STATUS_MSG_ERR; // Установить ответное слово mil->reg->StatusWord1 = answerWord; } else { // Команда "блокировать передатчик" if (cmdCode == CMD_LockSender) { if ((flag & MIL_STD_STATUS_RCVA) != 0) { mil->reg->CONTROL &= ~MIL_STD_CONTROL_TRB; } else if ((flag & MIL_STD_STATUS_RCVB) != 0) { mil->reg->CONTROL &= ~MIL_STD_CONTROL_TRA; } } // Команда "разблокировать передатчик" else if (cmdCode == CMD_UnlockSender) { if ((flag & MIL_STD_STATUS_RCVA) != 0) { mil->reg->CONTROL |= MIL_STD_CONTROL_TRB; } else if ((flag & MIL_STD_STATUS_RCVB) != 0) { mil->reg->CONTROL |= MIL_STD_CONTROL_TRA; } } // Команда "установить ОУ в исходное состояние" else if (cmdCode == CMD_SetRtInitialState) { mil->reg->CONTROL |= MIL_STD_CONTROL_TRA; mil->reg->CONTROL |= MIL_STD_CONTROL_TRB; } // Команды установить ответное слово (ответ на предыдущую груповую команду) else if (cmdCode == CMD_SendAnswerWord) { answerWord = answerWordPreveous; } // Установить ответное слово mil->reg->StatusWord1 = answerWord; } } break; // команда управления 16-31 от КШ, ожидается слово данных (не групповая), формат сообщения 5 case MSG_CMD_WITH_NODATA__0x10_0x1f__DATAWORD_EXPECTED__SINGLE: // Получено достоверное слово из канала if ((flag & MIL_STD_STATUS_RFLAGN) != 0) { // неподдерживаемые команды (резерв) if (cmdCode >= 0x16) { answerWord |= MIL_STD_STATUS_MSG_ERR; // Установить ответное слово mil->reg->StatusWord1 = answerWord; } else { if (cmdCode == CMD_SendLastCommand) { mil->reg->ModeData = commandWordPreveous; answerWord = answerWordPreveous; } // Установить ответное слово mil->reg->StatusWord1 = answerWord; } } break; // команда управления 16-31 от КШ со словом данных, формат сообщения 10 case MSG_CMD_WITH_DATA__0x10_0x1f__GROUP: answerWord |= MIL_STD_STATUS_GROUP_COMMAND_RECEIVED; // команда управления 16-31 от КШ со словом данных, формат сообщения 6 case MSG_CMD_WITH_DATA__0x10_0x1f__SINGLE: // Получено достоверное слово из канала if ((flag & MIL_STD_STATUS_RFLAGN) != 0) { // неподдерживаемые команды (резерв) if (cmdCode >= 0x16) { answerWord |= MIL_STD_STATUS_MSG_ERR; // Установить ответное слово mil->reg->StatusWord1 = answerWord; } else { // Установить ответное слово mil->reg->StatusWord1 = answerWord; } } break; } // switch (msg) if (cmdCode != CMD_SendLastCommand) { commandWordPreveous = comWrd1; } } // else if (flag & MIL_STD_STATUS_ERR) answerWordPreveous = answerWord; } else {