equal
deleted
inserted
replaced
1819 ec_slave_t *slave = fsm->slave; |
1819 ec_slave_t *slave = fsm->slave; |
1820 ec_master_t *master = slave->master; |
1820 ec_master_t *master = slave->master; |
1821 uint8_t *data, mbox_prot; |
1821 uint8_t *data, mbox_prot; |
1822 size_t rec_size, data_size; |
1822 size_t rec_size, data_size; |
1823 ec_sdo_request_t *request = fsm->request; |
1823 ec_sdo_request_t *request = fsm->request; |
1824 uint32_t seg_size; |
|
1825 unsigned int last_segment; |
1824 unsigned int last_segment; |
1826 |
1825 |
1827 if (datagram->state == EC_DATAGRAM_TIMED_OUT && fsm->retries--) |
1826 if (datagram->state == EC_DATAGRAM_TIMED_OUT && fsm->retries--) |
1828 return; // FIXME: request again? |
1827 return; // FIXME: request again? |
1829 |
1828 |
1897 fsm->retries = EC_FSM_RETRIES; |
1896 fsm->retries = EC_FSM_RETRIES; |
1898 fsm->state = ec_fsm_coe_up_seg_check; |
1897 fsm->state = ec_fsm_coe_up_seg_check; |
1899 return; |
1898 return; |
1900 } |
1899 } |
1901 |
1900 |
1902 last_segment = EC_READ_U8(data + 2) & 0x01; |
1901 data_size = rec_size - 3; /* Header of segment upload is smaller than |
1903 seg_size = (EC_READ_U8(data + 2) & 0xE) >> 1; |
1902 normal upload */ |
1904 if (rec_size > 10) { |
1903 if (rec_size == 10) { |
1905 data_size = rec_size - 3; /* Header of segment upload is smaller than |
1904 uint8_t seg_size = (EC_READ_U8(data + 2) & 0xE) >> 1; |
1906 normal upload */ |
1905 data_size -= seg_size; |
1907 } else { // == 10 |
|
1908 /* seg_size contains the number of trailing bytes to ignore. */ |
|
1909 data_size = rec_size - seg_size; |
|
1910 } |
1906 } |
1911 |
1907 |
1912 if (request->data_size + data_size > fsm->complete_size) { |
1908 if (request->data_size + data_size > fsm->complete_size) { |
1913 EC_ERR("SDO upload 0x%04X:%02X failed on slave %u: Fragment" |
1909 EC_ERR("SDO upload 0x%04X:%02X failed on slave %u: Fragment" |
1914 " exceeding complete size!\n", |
1910 " exceeding complete size!\n", |
1918 } |
1914 } |
1919 |
1915 |
1920 memcpy(request->data + request->data_size, data + 3, data_size); |
1916 memcpy(request->data + request->data_size, data + 3, data_size); |
1921 request->data_size += data_size; |
1917 request->data_size += data_size; |
1922 |
1918 |
|
1919 last_segment = EC_READ_U8(data + 2) & 0x01; |
1923 if (!last_segment) { |
1920 if (!last_segment) { |
1924 fsm->toggle = !fsm->toggle; |
1921 fsm->toggle = !fsm->toggle; |
1925 ec_fsm_coe_up_prepare_segment_request(fsm); |
1922 ec_fsm_coe_up_prepare_segment_request(fsm); |
1926 fsm->retries = EC_FSM_RETRIES; |
1923 fsm->retries = EC_FSM_RETRIES; |
1927 fsm->state = ec_fsm_coe_up_seg_request; |
1924 fsm->state = ec_fsm_coe_up_seg_request; |