examples/tty/serial.c
changeset 1785 9ed0334edaf9
parent 1784 bc2aff866a5b
child 1787 439f186185be
equal deleted inserted replaced
1784:bc2aff866a5b 1785:9ed0334edaf9
    58     SER_SET_RTSCTS,
    58     SER_SET_RTSCTS,
    59     SER_SET_BAUD_RATE,
    59     SER_SET_BAUD_RATE,
    60     SER_SET_DATA_FRAME,
    60     SER_SET_DATA_FRAME,
    61 } el60xx_port_state;
    61 } el60xx_port_state;
    62 
    62 
       
    63 #define EL6002_PORT_NAME_SIZE 16
       
    64 
    63 typedef struct {
    65 typedef struct {
    64     ec_tty_t *tty;
    66     ec_tty_t *tty;
       
    67     char name[EL6002_PORT_NAME_SIZE];
    65 
    68 
    66     size_t max_tx_data_size;
    69     size_t max_tx_data_size;
    67     size_t max_rx_data_size;
    70     size_t max_rx_data_size;
    68 
    71 
    69     u8 *tx_data;
    72     u8 *tx_data;
   288     unsigned int i;
   291     unsigned int i;
   289     el600x_baud_rate_t *b_to_use = NULL;
   292     el600x_baud_rate_t *b_to_use = NULL;
   290     el600x_data_frame_t *df_to_use = NULL;
   293     el600x_data_frame_t *df_to_use = NULL;
   291 
   294 
   292 #if DEBUG
   295 #if DEBUG
   293     printk(KERN_INFO PFX "%s(data=%p, cflag=%x).\n", __func__, port, cflag);
   296     printk(KERN_INFO PFX "%s(%s, cflag=%x).\n", __func__, port->name, cflag);
   294 #endif
   297 #endif
   295 
   298 
   296     rtscts = cflag & CRTSCTS;
   299     rtscts = cflag & CRTSCTS;
   297     printk(KERN_INFO PFX "Requested RTS/CTS: %s.\n", rtscts ? "yes" : "no");
   300     printk(KERN_INFO PFX "%s: Requested RTS/CTS: %s.\n",
       
   301             port->name, rtscts ? "yes" : "no");
   298     
   302     
   299     cbaud = cflag & CBAUD;
   303     cbaud = cflag & CBAUD;
   300 
   304 
   301     for (i = 0; i < sizeof(el600x_baud_rate) / sizeof(el600x_baud_rate_t);
   305     for (i = 0; i < sizeof(el600x_baud_rate) / sizeof(el600x_baud_rate_t);
   302             i++) {
   306             i++) {
   306             break;
   310             break;
   307         }
   311         }
   308     }
   312     }
   309 
   313 
   310     if (b_to_use) {
   314     if (b_to_use) {
   311         printk(KERN_INFO PFX "Requested baud rate: %u.\n", b_to_use->baud);
   315         printk(KERN_INFO PFX "%s: Requested baud rate: %u.\n",
       
   316                 port->name, b_to_use->baud);
   312     } else {
   317     } else {
   313         printk(KERN_ERR PFX "Error: Baud rate index %x not supported.\n",
   318         printk(KERN_ERR PFX "Error: %s does not support"
   314                 cbaud);
   319                 " baud rate index %x.\n", port->name, cbaud);
   315         return -EINVAL;
   320         return -EINVAL;
   316     }
   321     }
   317 
   322 
   318     switch (cflag & CSIZE) {
   323     switch (cflag & CSIZE) {
   319         case CS5:
   324         case CS5:
   338         par = PAR_NONE;
   343         par = PAR_NONE;
   339     }
   344     }
   340 
   345 
   341     stop_bits = (cflag & CSTOPB) ? 2 : 1;
   346     stop_bits = (cflag & CSTOPB) ? 2 : 1;
   342 
   347 
   343     printk(KERN_INFO PFX "Requested Data frame: %u%c%u.\n",
   348     printk(KERN_INFO PFX "%s: Requested Data frame: %u%c%u.\n",
   344             data_bits,
   349             port->name, data_bits,
   345             (par == PAR_NONE ? 'N' : (par == PAR_ODD ? 'O' : 'E')),
   350             (par == PAR_NONE ? 'N' : (par == PAR_ODD ? 'O' : 'E')),
   346             stop_bits);
   351             stop_bits);
   347 
   352 
   348     for (i = 0; i < sizeof(el600x_data_frame) / sizeof(el600x_data_frame_t);
   353     for (i = 0; i < sizeof(el600x_data_frame) / sizeof(el600x_data_frame_t);
   349             i++) {
   354             i++) {
   355             break;
   360             break;
   356         }
   361         }
   357     }
   362     }
   358 
   363 
   359     if (!df_to_use) {
   364     if (!df_to_use) {
   360         printk(KERN_ERR PFX "Error: Data frame type not supported.\n");
   365         printk(KERN_ERR PFX "Error: %s does not support data frame type.\n",
       
   366                 port->name);
   361         return -EINVAL;
   367         return -EINVAL;
   362     }
   368     }
   363 
   369 
   364     port->requested_rtscts = rtscts != 0;
   370     port->requested_rtscts = rtscts != 0;
   365     port->requested_baud_rate = b_to_use->value;
   371     port->requested_baud_rate = b_to_use->value;
   369 }
   375 }
   370 
   376 
   371 /****************************************************************************/
   377 /****************************************************************************/
   372 
   378 
   373 int el60xx_port_init(el60xx_port_t *port, ec_slave_config_t *sc,
   379 int el60xx_port_init(el60xx_port_t *port, ec_slave_config_t *sc,
   374         ec_domain_t *domain, unsigned int slot_offset)
   380         ec_domain_t *domain, unsigned int slot_offset, const char *name)
   375 {
   381 {
   376     int ret = 0;
   382     int ret = 0;
       
   383 
       
   384     strncpy(port->name, name, EL6002_PORT_NAME_SIZE);
   377 
   385 
   378     port->tty = ectty_create(el60xx_cflag_changed, port);
   386     port->tty = ectty_create(el60xx_cflag_changed, port);
   379     if (IS_ERR(port->tty)) {
   387     if (IS_ERR(port->tty)) {
   380         printk(KERN_ERR PFX "Failed to create tty.\n");
   388         printk(KERN_ERR PFX "Failed to create tty for %s.\n",
       
   389                 port->name);
   381         ret = PTR_ERR(port->tty);
   390         ret = PTR_ERR(port->tty);
   382         goto out_return;
   391         goto out_return;
   383     }
   392     }
   384 
   393 
   385     port->max_tx_data_size = 22;
   394     port->max_tx_data_size = 22;
   402     port->current_data_frame = 0x00;
   411     port->current_data_frame = 0x00;
   403     port->config_error = 0;
   412     port->config_error = 0;
   404 
   413 
   405     if (!(port->rtscts_sdo = ecrt_slave_config_create_sdo_request(sc,
   414     if (!(port->rtscts_sdo = ecrt_slave_config_create_sdo_request(sc,
   406                     0x8000 + slot_offset, 0x01, 1))) {
   415                     0x8000 + slot_offset, 0x01, 1))) {
   407         printk(KERN_ERR PFX "Failed to create SDO request.\n");
   416         printk(KERN_ERR PFX "Failed to create SDO request for %s.\n",
       
   417                 port->name);
   408         ret = -ENOMEM;
   418         ret = -ENOMEM;
   409         goto out_free_tty;
   419         goto out_free_tty;
   410     }
   420     }
   411 
   421 
   412     if (!(port->baud_sdo = ecrt_slave_config_create_sdo_request(sc,
   422     if (!(port->baud_sdo = ecrt_slave_config_create_sdo_request(sc,
   413                     0x8000 + slot_offset, 0x11, 1))) {
   423                     0x8000 + slot_offset, 0x11, 1))) {
   414         printk(KERN_ERR PFX "Failed to create SDO request.\n");
   424         printk(KERN_ERR PFX "Failed to create SDO request for %s.\n",
       
   425                 port->name);
   415         ret = -ENOMEM;
   426         ret = -ENOMEM;
   416         goto out_free_tty;
   427         goto out_free_tty;
   417     }
   428     }
   418 
   429 
   419     if (!(port->frame_sdo = ecrt_slave_config_create_sdo_request(sc,
   430     if (!(port->frame_sdo = ecrt_slave_config_create_sdo_request(sc,
   420                     0x8000 + slot_offset, 0x15, 1))) {
   431                     0x8000 + slot_offset, 0x15, 1))) {
   421         printk(KERN_ERR PFX "Failed to create SDO request.\n");
   432         printk(KERN_ERR PFX "Failed to create SDO request for %s\n",
       
   433                 port->name);
   422         ret = -ENOMEM;
   434         ret = -ENOMEM;
   423         goto out_free_tty;
   435         goto out_free_tty;
   424     }
   436     }
   425 
   437 
   426     ret = ecrt_slave_config_reg_pdo_entry(
   438     ret = ecrt_slave_config_reg_pdo_entry(
   427             sc, 0x7001 + slot_offset, 0x01, domain, NULL);
   439             sc, 0x7001 + slot_offset, 0x01, domain, NULL);
   428     if (ret < 0) {
   440     if (ret < 0) {
   429         printk(KERN_ERR PFX "Failed to register PDO entry.\n");
   441         printk(KERN_ERR PFX "Failed to register PDO entry of %s\n",
       
   442                 port->name);
   430         goto out_free_tty;
   443         goto out_free_tty;
   431     }
   444     }
   432     port->off_ctrl = ret;
   445     port->off_ctrl = ret;
   433 
   446 
   434     ret = ecrt_slave_config_reg_pdo_entry(
   447     ret = ecrt_slave_config_reg_pdo_entry(
   435             sc, 0x7000 + slot_offset, 0x11, domain, NULL);
   448             sc, 0x7000 + slot_offset, 0x11, domain, NULL);
   436     if (ret < 0) {
   449     if (ret < 0) {
   437         printk(KERN_ERR PFX "Failed to register PDO entry.\n");
   450         printk(KERN_ERR PFX "Failed to register PDO entry of %s.\n",
       
   451                 port->name);
   438         goto out_free_tty;
   452         goto out_free_tty;
   439     }
   453     }
   440     port->off_tx = ret;
   454     port->off_tx = ret;
   441 
   455 
   442     ret = ecrt_slave_config_reg_pdo_entry(
   456     ret = ecrt_slave_config_reg_pdo_entry(
   443             sc, 0x6001 + slot_offset, 0x01, domain, NULL);
   457             sc, 0x6001 + slot_offset, 0x01, domain, NULL);
   444     if (ret < 0) {
   458     if (ret < 0) {
   445         printk(KERN_ERR PFX "Failed to register PDO entry.\n");
   459         printk(KERN_ERR PFX "Failed to register PDO entry of %s.\n",
       
   460                 port->name);
   446         goto out_free_tty;
   461         goto out_free_tty;
   447     }
   462     }
   448     port->off_status = ret;
   463     port->off_status = ret;
   449 
   464 
   450     ret = ecrt_slave_config_reg_pdo_entry(
   465     ret = ecrt_slave_config_reg_pdo_entry(
   451             sc, 0x6000 + slot_offset, 0x11, domain, NULL);
   466             sc, 0x6000 + slot_offset, 0x11, domain, NULL);
   452     if (ret < 0) {
   467     if (ret < 0) {
   453         printk(KERN_ERR PFX "Failed to register PDO entry.\n");
   468         printk(KERN_ERR PFX "Failed to register PDO entry of %s.\n",
       
   469                 port->name);
   454         goto out_free_tty;
   470         goto out_free_tty;
   455     }
   471     }
   456     port->off_rx = ret;
   472     port->off_rx = ret;
   457 
   473 
   458     if (port->max_tx_data_size > 0) {
   474     if (port->max_tx_data_size > 0) {
   459         port->tx_data = kmalloc(port->max_tx_data_size, GFP_KERNEL);
   475         port->tx_data = kmalloc(port->max_tx_data_size, GFP_KERNEL);
   460         if (port->tx_data == NULL) {
   476         if (port->tx_data == NULL) {
       
   477             printk(KERN_ERR PFX "Failed to allocate %u bytes of TX"
       
   478                     " memory for %s.\n", port->max_tx_data_size, port->name);
   461             ret = -ENOMEM;
   479             ret = -ENOMEM;
   462             goto out_free_tty;
   480             goto out_free_tty;
   463         }
   481         }
   464     }
   482     }
   465 
   483 
   528             if (tx_accepted_toggle != port->tx_accepted_toggle) { // ready
   546             if (tx_accepted_toggle != port->tx_accepted_toggle) { // ready
   529                 port->tx_data_size =
   547                 port->tx_data_size =
   530                     ectty_tx_data(port->tty, port->tx_data, port->max_tx_data_size);
   548                     ectty_tx_data(port->tty, port->tx_data, port->max_tx_data_size);
   531                 if (port->tx_data_size) {
   549                 if (port->tx_data_size) {
   532 #if DEBUG
   550 #if DEBUG
   533                     printk(KERN_INFO PFX "Sending %u bytes.\n", port->tx_data_size);
   551                     printk(KERN_INFO PFX "%s: Sending %u bytes.\n",
       
   552                             port->name, port->tx_data_size);
   534 #endif
   553 #endif
   535                     port->tx_request_toggle = !port->tx_request_toggle;
   554                     port->tx_request_toggle = !port->tx_request_toggle;
   536                     port->tx_accepted_toggle = tx_accepted_toggle;
   555                     port->tx_accepted_toggle = tx_accepted_toggle;
   537                 }
   556                 }
   538             }
   557             }
   542             rx_request_toggle = status & 0x0002;
   561             rx_request_toggle = status & 0x0002;
   543             if (rx_request_toggle != port->rx_request_toggle) {
   562             if (rx_request_toggle != port->rx_request_toggle) {
   544                 uint8_t rx_data_size = status >> 8;
   563                 uint8_t rx_data_size = status >> 8;
   545                 port->rx_request_toggle = rx_request_toggle;
   564                 port->rx_request_toggle = rx_request_toggle;
   546 #if DEBUG
   565 #if DEBUG
   547                 printk(KERN_INFO PFX "Received %u bytes.\n", rx_data_size);
   566                 printk(KERN_INFO PFX "%s: Received %u bytes.\n",
       
   567                         port->name, rx_data_size);
   548 #endif
   568 #endif
   549                 ectty_rx_data(port->tty, rx_data, rx_data_size);
   569                 ectty_rx_data(port->tty, rx_data, rx_data_size);
   550                 port->rx_accepted_toggle = !port->rx_accepted_toggle;
   570                 port->rx_accepted_toggle = !port->rx_accepted_toggle;
   551             }
   571             }
   552 
   572 
   565             }
   585             }
   566             break;
   586             break;
   567 
   587 
   568         case SER_WAIT_FOR_INIT_RESPONSE:
   588         case SER_WAIT_FOR_INIT_RESPONSE:
   569             if (!(status & (1 << 2))) {
   589             if (!(status & (1 << 2))) {
   570                 printk(KERN_INFO PFX "EL600x init successful.\n");
   590                 printk(KERN_INFO PFX "%s: Init successful.\n", port->name);
   571                 port->tx_accepted_toggle = 1;
   591                 port->tx_accepted_toggle = 1;
   572                 port->control = 0x0000;
   592                 port->control = 0x0000;
   573                 port->state = SER_READY;
   593                 port->state = SER_READY;
   574             }
   594             }
   575             break;
   595             break;
   576 
   596 
   577         case SER_SET_RTSCTS:
   597         case SER_SET_RTSCTS:
   578             switch (ecrt_sdo_request_state(port->rtscts_sdo)) {
   598             switch (ecrt_sdo_request_state(port->rtscts_sdo)) {
   579                 case EC_REQUEST_SUCCESS:
   599                 case EC_REQUEST_SUCCESS:
   580                     printk(KERN_INFO PFX "Slave accepted RTS/CTS.\n");
   600                     printk(KERN_INFO PFX "%s: Accepted RTS/CTS.\n",
       
   601                             port->name);
   581                     port->current_rtscts = port->requested_rtscts;
   602                     port->current_rtscts = port->requested_rtscts;
   582                     port->state = SER_REQUEST_INIT;
   603                     port->state = SER_REQUEST_INIT;
   583                     break;
   604                     break;
   584                 case EC_REQUEST_ERROR:
   605                 case EC_REQUEST_ERROR:
   585                     printk(KERN_INFO PFX "Failed to set RTS/CTS!\n");
   606                     printk(KERN_ERR PFX "Failed to set RTS/CTS on %s!\n",
       
   607                             port->name);
   586                     port->state = SER_REQUEST_INIT;
   608                     port->state = SER_REQUEST_INIT;
   587                     port->config_error = 1;
   609                     port->config_error = 1;
   588                     break;
   610                     break;
   589                 default:
   611                 default:
   590                     break;
   612                     break;
   592             break;
   614             break;
   593 
   615 
   594         case SER_SET_BAUD_RATE:
   616         case SER_SET_BAUD_RATE:
   595             switch (ecrt_sdo_request_state(port->baud_sdo)) {
   617             switch (ecrt_sdo_request_state(port->baud_sdo)) {
   596                 case EC_REQUEST_SUCCESS:
   618                 case EC_REQUEST_SUCCESS:
   597                     printk(KERN_INFO PFX "Slave accepted baud rate.\n");
   619                     printk(KERN_INFO PFX "%s: Accepted baud rate.\n",
       
   620                             port->name);
   598                     port->current_baud_rate = port->requested_baud_rate;
   621                     port->current_baud_rate = port->requested_baud_rate;
   599                     port->state = SER_REQUEST_INIT;
   622                     port->state = SER_REQUEST_INIT;
   600                     break;
   623                     break;
   601                 case EC_REQUEST_ERROR:
   624                 case EC_REQUEST_ERROR:
   602                     printk(KERN_INFO PFX "Failed to set baud rate!\n");
   625                     printk(KERN_ERR PFX "Failed to set baud rate on %s!\n",
       
   626                             port->name);
   603                     port->state = SER_REQUEST_INIT;
   627                     port->state = SER_REQUEST_INIT;
   604                     port->config_error = 1;
   628                     port->config_error = 1;
   605                     break;
   629                     break;
   606                 default:
   630                 default:
   607                     break;
   631                     break;
   609             break;
   633             break;
   610 
   634 
   611         case SER_SET_DATA_FRAME:
   635         case SER_SET_DATA_FRAME:
   612             switch (ecrt_sdo_request_state(port->frame_sdo)) {
   636             switch (ecrt_sdo_request_state(port->frame_sdo)) {
   613                 case EC_REQUEST_SUCCESS:
   637                 case EC_REQUEST_SUCCESS:
   614                     printk(KERN_INFO PFX "Slave accepted data frame.\n");
   638                     printk(KERN_INFO PFX "%s: Accepted data frame.\n",
       
   639                             port->name);
   615                     port->current_data_frame = port->requested_data_frame;
   640                     port->current_data_frame = port->requested_data_frame;
   616                     port->state = SER_REQUEST_INIT;
   641                     port->state = SER_REQUEST_INIT;
   617                     break;
   642                     break;
   618                 case EC_REQUEST_ERROR:
   643                 case EC_REQUEST_ERROR:
   619                     printk(KERN_INFO PFX "Failed to set data frame!\n");
   644                     printk(KERN_ERR PFX "Failed to set data frame on %s!\n",
       
   645                             port->name);
   620                     port->state = SER_REQUEST_INIT;
   646                     port->state = SER_REQUEST_INIT;
   621                     port->config_error = 1;
   647                     port->config_error = 1;
   622                     break;
   648                     break;
   623                 default:
   649                 default:
   624                     break;
   650                     break;
   637 {
   663 {
   638     int ret = 0, i;
   664     int ret = 0, i;
   639 
   665 
   640     if (!(el6002->sc = ecrt_master_slave_config(
   666     if (!(el6002->sc = ecrt_master_slave_config(
   641                     master, 0, position, vendor, product))) {
   667                     master, 0, position, vendor, product))) {
   642         printk(KERN_ERR PFX "Failed to create slave configuration.\n");
   668         printk(KERN_ERR PFX "EL6002(%u): Failed to create"
       
   669                 " slave configuration.\n", position);
   643         ret = -EBUSY;
   670         ret = -EBUSY;
   644         goto out_return;
   671         goto out_return;
   645     }
   672     }
   646 
   673 
   647     if (ecrt_slave_config_pdos(el6002->sc, EC_END, el6002_syncs)) {
   674     if (ecrt_slave_config_pdos(el6002->sc, EC_END, el6002_syncs)) {
   648         printk(KERN_ERR PFX "Failed to configure PDOs.\n");
   675         printk(KERN_ERR PFX "EL6002(%u): Failed to configure PDOs.\n",
       
   676                 position);
   649         ret = -ENOMEM;
   677         ret = -ENOMEM;
   650         goto out_return;
   678         goto out_return;
   651     }
   679     }
   652 
   680 
   653     for (i = 0; i < EL6002_PORTS; i++) {
   681     for (i = 0; i < EL6002_PORTS; i++) {
   654         if (el60xx_port_init(el6002->port + i, el6002->sc, domain, i * 0x10)) {
   682         char name[EL6002_PORT_NAME_SIZE];
   655             printk(KERN_ERR PFX "Failed to init port X%u.\n", i);
   683         snprintf(name, EL6002_PORT_NAME_SIZE, "EL6002(%u) X%u",
       
   684                 position, i + 1);
       
   685         if (el60xx_port_init(el6002->port + i, el6002->sc, domain, i * 0x10,
       
   686                     name)) {
       
   687             printk(KERN_ERR PFX "EL6002(%u): Failed to init port X%u.\n",
       
   688                     position, i);
   656             goto out_ports;
   689             goto out_ports;
   657         }
   690         }
   658     }
   691     }
   659 
   692 
   660     return 0;
   693     return 0;
   717         return -ENOMEM;
   750         return -ENOMEM;
   718     }
   751     }
   719 
   752 
   720     ret = el6002_init(el6002, master, position, domain, vendor, product);
   753     ret = el6002_init(el6002, master, position, domain, vendor, product);
   721     if (ret) {
   754     if (ret) {
   722         printk(KERN_ERR PFX "Failed to init serial device object.\n");
       
   723         kfree(el6002);
   755         kfree(el6002);
   724         return ret;
   756         return ret;
   725     }
   757     }
   726 
   758 
   727     list_add_tail(&el6002->list, &handlers);
   759     list_add_tail(&el6002->list, &handlers);
   767                 goto out_free_handlers;
   799                 goto out_free_handlers;
   768             }
   800             }
   769         }
   801         }
   770     }
   802     }
   771 
   803 
   772     printk(KERN_INFO PFX "Finished.\n");
   804     printk(KERN_INFO PFX "Finished registering serial devices.\n");
   773     return 0;
   805     return 0;
   774 
   806 
   775 out_free_handlers:
   807 out_free_handlers:
   776     list_for_each_entry_safe(ser, next, &handlers, list) {
   808     list_for_each_entry_safe(ser, next, &handlers, list) {
   777         list_del(&ser->list);
   809         list_del(&ser->list);