master/datagram.c
changeset 708 90bdb315f560
parent 514 3e5989834735
child 713 ae41cadd25b6
equal deleted inserted replaced
707:9ae68af8e17a 708:90bdb315f560
    69 
    69 
    70 void ec_datagram_init(ec_datagram_t *datagram /**< EtherCAT datagram */)
    70 void ec_datagram_init(ec_datagram_t *datagram /**< EtherCAT datagram */)
    71 {
    71 {
    72     INIT_LIST_HEAD(&datagram->queue); // mark as unqueued
    72     INIT_LIST_HEAD(&datagram->queue); // mark as unqueued
    73     datagram->type = EC_DATAGRAM_NONE;
    73     datagram->type = EC_DATAGRAM_NONE;
    74     datagram->address.logical = 0x00000000;
    74     memset(datagram->address, 0x00, EC_ADDR_LEN);
    75     datagram->data = NULL;
    75     datagram->data = NULL;
    76     datagram->mem_size = 0;
    76     datagram->mem_size = 0;
    77     datagram->data_size = 0;
    77     datagram->data_size = 0;
    78     datagram->index = 0x00;
    78     datagram->index = 0x00;
    79     datagram->working_counter = 0x00;
    79     datagram->working_counter = 0x00;
   145     if (unlikely(node_address == 0x0000))
   145     if (unlikely(node_address == 0x0000))
   146         EC_WARN("Using node address 0x0000!\n");
   146         EC_WARN("Using node address 0x0000!\n");
   147 
   147 
   148     EC_FUNC_HEADER;
   148     EC_FUNC_HEADER;
   149     datagram->type = EC_DATAGRAM_NPRD;
   149     datagram->type = EC_DATAGRAM_NPRD;
   150     datagram->address.physical.slave = node_address;
   150     EC_WRITE_U16(datagram->address, node_address);
   151     datagram->address.physical.mem = offset;
   151     EC_WRITE_U16(datagram->address + 2, offset);
   152     EC_FUNC_FOOTER;
   152     EC_FUNC_FOOTER;
   153 }
   153 }
   154 
   154 
   155 /*****************************************************************************/
   155 /*****************************************************************************/
   156 
   156 
   173     if (unlikely(node_address == 0x0000))
   173     if (unlikely(node_address == 0x0000))
   174         EC_WARN("Using node address 0x0000!\n");
   174         EC_WARN("Using node address 0x0000!\n");
   175 
   175 
   176     EC_FUNC_HEADER;
   176     EC_FUNC_HEADER;
   177     datagram->type = EC_DATAGRAM_NPWR;
   177     datagram->type = EC_DATAGRAM_NPWR;
   178     datagram->address.physical.slave = node_address;
   178     EC_WRITE_U16(datagram->address, node_address);
   179     datagram->address.physical.mem = offset;
   179     EC_WRITE_U16(datagram->address + 2, offset);
   180     EC_FUNC_FOOTER;
   180     EC_FUNC_FOOTER;
   181 }
   181 }
   182 
   182 
   183 /*****************************************************************************/
   183 /*****************************************************************************/
   184 
   184 
   198                      /**< number of bytes to read */
   198                      /**< number of bytes to read */
   199                      )
   199                      )
   200 {
   200 {
   201     EC_FUNC_HEADER;
   201     EC_FUNC_HEADER;
   202     datagram->type = EC_DATAGRAM_APRD;
   202     datagram->type = EC_DATAGRAM_APRD;
   203     datagram->address.physical.slave = (int16_t) ring_position * (-1);
   203     EC_WRITE_S16(datagram->address, (int16_t) ring_position * (-1));
   204     datagram->address.physical.mem = offset;
   204     EC_WRITE_U16(datagram->address + 2, offset);
   205     EC_FUNC_FOOTER;
   205     EC_FUNC_FOOTER;
   206 }
   206 }
   207 
   207 
   208 /*****************************************************************************/
   208 /*****************************************************************************/
   209 
   209 
   223                      /**< number of bytes to write */
   223                      /**< number of bytes to write */
   224                      )
   224                      )
   225 {
   225 {
   226     EC_FUNC_HEADER;
   226     EC_FUNC_HEADER;
   227     datagram->type = EC_DATAGRAM_APWR;
   227     datagram->type = EC_DATAGRAM_APWR;
   228     datagram->address.physical.slave = (int16_t) ring_position * (-1);
   228     EC_WRITE_S16(datagram->address, (int16_t) ring_position * (-1));
   229     datagram->address.physical.mem = offset;
   229     EC_WRITE_U16(datagram->address + 2, offset);
   230     EC_FUNC_FOOTER;
   230     EC_FUNC_FOOTER;
   231 }
   231 }
   232 
   232 
   233 /*****************************************************************************/
   233 /*****************************************************************************/
   234 
   234 
   246                     /**< number of bytes to read */
   246                     /**< number of bytes to read */
   247                     )
   247                     )
   248 {
   248 {
   249     EC_FUNC_HEADER;
   249     EC_FUNC_HEADER;
   250     datagram->type = EC_DATAGRAM_BRD;
   250     datagram->type = EC_DATAGRAM_BRD;
   251     datagram->address.physical.slave = 0x0000;
   251     EC_WRITE_U16(datagram->address, 0x0000);
   252     datagram->address.physical.mem = offset;
   252     EC_WRITE_U16(datagram->address + 2, offset);
   253     EC_FUNC_FOOTER;
   253     EC_FUNC_FOOTER;
   254 }
   254 }
   255 
   255 
   256 /*****************************************************************************/
   256 /*****************************************************************************/
   257 
   257 
   269                     /**< number of bytes to write */
   269                     /**< number of bytes to write */
   270                     )
   270                     )
   271 {
   271 {
   272     EC_FUNC_HEADER;
   272     EC_FUNC_HEADER;
   273     datagram->type = EC_DATAGRAM_BWR;
   273     datagram->type = EC_DATAGRAM_BWR;
   274     datagram->address.physical.slave = 0x0000;
   274     EC_WRITE_U16(datagram->address, 0x0000);
   275     datagram->address.physical.mem = offset;
   275     EC_WRITE_U16(datagram->address + 2, offset);
   276     EC_FUNC_FOOTER;
   276     EC_FUNC_FOOTER;
   277 }
   277 }
   278 
   278 
   279 /*****************************************************************************/
   279 /*****************************************************************************/
   280 
   280 
   292                     /**< number of bytes to read/write */
   292                     /**< number of bytes to read/write */
   293                     )
   293                     )
   294 {
   294 {
   295     EC_FUNC_HEADER;
   295     EC_FUNC_HEADER;
   296     datagram->type = EC_DATAGRAM_LRW;
   296     datagram->type = EC_DATAGRAM_LRW;
   297     datagram->address.logical = offset;
   297     EC_WRITE_U32(datagram->address, offset);
   298     EC_FUNC_FOOTER;
   298     EC_FUNC_FOOTER;
   299 }
   299 }
   300 
   300 
   301 /*****************************************************************************/
   301 /*****************************************************************************/