examples/tty/serial.c
changeset 1783 8fd654d9ed5c
parent 1782 2ba454c790c5
child 1784 bc2aff866a5b
equal deleted inserted replaced
1782:2ba454c790c5 1783:8fd654d9ed5c
    43 
    43 
    44 /*****************************************************************************/
    44 /*****************************************************************************/
    45 
    45 
    46 #define VendorIdBeckhoff 0x00000002
    46 #define VendorIdBeckhoff 0x00000002
    47 #define ProductCodeBeckhoffEL6002 0x17723052
    47 #define ProductCodeBeckhoffEL6002 0x17723052
    48 #define Beckhoff_EL6002 VendorIdBeckhoff, ProductCodeBeckhoffEL6002
    48 
       
    49 #define VendorIdIds 0x000012ad
       
    50 #define ProductCodeIdsCSI71A 0x17723052
       
    51 
       
    52 /*****************************************************************************/
    49 
    53 
    50 typedef enum {
    54 typedef enum {
    51     SER_REQUEST_INIT,
    55     SER_REQUEST_INIT,
    52     SER_WAIT_FOR_INIT_RESPONSE,
    56     SER_WAIT_FOR_INIT_RESPONSE,
    53     SER_READY,
    57     SER_READY,
   283 #if DEBUG
   287 #if DEBUG
   284     printk(KERN_INFO PFX "%s(data=%p, cflag=%x).\n", __func__, ser, cflag);
   288     printk(KERN_INFO PFX "%s(data=%p, cflag=%x).\n", __func__, ser, cflag);
   285 #endif
   289 #endif
   286 
   290 
   287     rtscts = cflag & CRTSCTS;
   291     rtscts = cflag & CRTSCTS;
   288     printk(KERN_INFO PFX "Requested rts/cts: %s.\n", rtscts ? "yes" : "no");
   292     printk(KERN_INFO PFX "Requested RTS/CTS: %s.\n", rtscts ? "yes" : "no");
   289     
   293     
   290     cbaud = cflag & CBAUD;
   294     cbaud = cflag & CBAUD;
   291 
   295 
   292     for (i = 0; i < sizeof(el600x_baud_rate) / sizeof(el600x_baud_rate_t);
   296     for (i = 0; i < sizeof(el600x_baud_rate) / sizeof(el600x_baud_rate_t);
   293             i++) {
   297             i++) {
   360 }
   364 }
   361 
   365 
   362 /****************************************************************************/
   366 /****************************************************************************/
   363 
   367 
   364 int el6002_init(el6002_t *ser, ec_master_t *master, u16 position,
   368 int el6002_init(el6002_t *ser, ec_master_t *master, u16 position,
   365         ec_domain_t *domain)
   369         ec_domain_t *domain, u32 vendor, u32 product)
   366 {
   370 {
   367     int ret = 0;
   371     int ret = 0;
   368 
   372 
   369     ser->tty = ectty_create(el6002_cflag_changed, ser);
   373     ser->tty = ectty_create(el6002_cflag_changed, ser);
   370     if (IS_ERR(ser->tty)) {
   374     if (IS_ERR(ser->tty)) {
   393     ser->requested_data_frame = 0x03; // 8N1
   397     ser->requested_data_frame = 0x03; // 8N1
   394     ser->current_data_frame = 0x00;
   398     ser->current_data_frame = 0x00;
   395     ser->config_error = 0;
   399     ser->config_error = 0;
   396 
   400 
   397     if (!(ser->sc = ecrt_master_slave_config(
   401     if (!(ser->sc = ecrt_master_slave_config(
   398                     master, 0, position, Beckhoff_EL6002))) {
   402                     master, 0, position, vendor, product))) {
   399         printk(KERN_ERR PFX "Failed to create slave configuration.\n");
   403         printk(KERN_ERR PFX "Failed to create slave configuration.\n");
   400         ret = -EBUSY;
   404         ret = -EBUSY;
   401         goto out_free_tty;
   405         goto out_free_tty;
   402     }
   406     }
   403 
   407 
   580             break;
   584             break;
   581 
   585 
   582         case SER_SET_RTSCTS:
   586         case SER_SET_RTSCTS:
   583             switch (ecrt_sdo_request_state(ser->rtscts_sdo)) {
   587             switch (ecrt_sdo_request_state(ser->rtscts_sdo)) {
   584                 case EC_REQUEST_SUCCESS:
   588                 case EC_REQUEST_SUCCESS:
   585                     printk(KERN_INFO PFX "Slave accepted rts/cts.\n");
   589                     printk(KERN_INFO PFX "Slave accepted RTS/CTS.\n");
   586                     ser->current_rtscts = ser->requested_rtscts;
   590                     ser->current_rtscts = ser->requested_rtscts;
   587                     ser->state = SER_REQUEST_INIT;
   591                     ser->state = SER_REQUEST_INIT;
   588                     break;
   592                     break;
   589                 case EC_REQUEST_ERROR:
   593                 case EC_REQUEST_ERROR:
   590                     printk(KERN_INFO PFX "Failed to set rts/cts!\n");
   594                     printk(KERN_INFO PFX "Failed to set RTS/CTS!\n");
   591                     ser->state = SER_REQUEST_INIT;
   595                     ser->state = SER_REQUEST_INIT;
   592                     ser->config_error = 1;
   596                     ser->config_error = 1;
   593                     break;
   597                     break;
   594                 default:
   598                 default:
   595                     break;
   599                     break;
   646     }
   650     }
   647 }
   651 }
   648 
   652 
   649 /*****************************************************************************/
   653 /*****************************************************************************/
   650 
   654 
       
   655 int create_el6002_handler(ec_master_t *master, ec_domain_t *domain,
       
   656         u16 position, u32 vendor, u32 product)
       
   657 {
       
   658     el6002_t *ser;
       
   659     int ret;
       
   660 
       
   661     printk(KERN_INFO PFX "Creating handler for EL6002 at position %u\n",
       
   662             position);
       
   663 
       
   664     ser = kmalloc(sizeof(*ser), GFP_KERNEL);
       
   665     if (!ser) {
       
   666         printk(KERN_ERR PFX "Failed to allocate serial device object.\n");
       
   667         return -ENOMEM;
       
   668     }
       
   669 
       
   670     ret = el6002_init(ser, master, position, domain, vendor, product);
       
   671     if (ret) {
       
   672         printk(KERN_ERR PFX "Failed to init serial device object.\n");
       
   673         kfree(ser);
       
   674         return ret;
       
   675     }
       
   676 
       
   677     list_add_tail(&ser->list, &handlers);
       
   678     return 0;
       
   679 }
       
   680 
       
   681 /*****************************************************************************/
       
   682 
   651 int create_serial_devices(ec_master_t *master, ec_domain_t *domain)
   683 int create_serial_devices(ec_master_t *master, ec_domain_t *domain)
   652 {
   684 {
   653     int i, ret;
   685     int i, ret;
   654     ec_master_info_t master_info;
   686     ec_master_info_t master_info;
   655     ec_slave_info_t slave_info;
   687     ec_slave_info_t slave_info;
   668         if (ret) {
   700         if (ret) {
   669             printk(KERN_ERR PFX "Failed to obtain slave information.\n");
   701             printk(KERN_ERR PFX "Failed to obtain slave information.\n");
   670             goto out_free_handlers;
   702             goto out_free_handlers;
   671         }
   703         }
   672 
   704 
   673         if (slave_info.vendor_id != VendorIdBeckhoff
   705         if (slave_info.vendor_id == VendorIdBeckhoff
   674                 || slave_info.product_code != ProductCodeBeckhoffEL6002) {
   706                 && slave_info.product_code == ProductCodeBeckhoffEL6002) {
   675             continue;
   707             if (create_el6002_handler(master, domain, i,
       
   708                     slave_info.vendor_id, slave_info.product_code)) {
       
   709                 goto out_free_handlers;
       
   710             }
   676         }
   711         }
   677 
   712 
   678         printk(KERN_INFO PFX "Creating handler for serial device"
   713         if (slave_info.vendor_id == VendorIdIds
   679                 " at position %i\n", i);
   714                 && slave_info.product_code == ProductCodeIdsCSI71A) {
   680 
   715             if (create_el6002_handler(master, domain, i,
   681         ser = kmalloc(sizeof(*ser), GFP_KERNEL);
   716                     slave_info.vendor_id, slave_info.product_code)) {
   682         if (!ser) {
   717                 goto out_free_handlers;
   683             printk(KERN_ERR PFX "Failed to allocate serial device object.\n");
   718             }
   684             ret = -ENOMEM;
       
   685             goto out_free_handlers;
       
   686         }
   719         }
   687 
   720     }
   688         ret = el6002_init(ser, master, i, domain);
       
   689         if (ret) {
       
   690             printk(KERN_ERR PFX "Failed to init serial device object.\n");
       
   691             kfree(ser);
       
   692             goto out_free_handlers;
       
   693         }
       
   694 
       
   695         list_add_tail(&ser->list, &handlers);
       
   696     }
       
   697 
       
   698 
   721 
   699     printk(KERN_INFO PFX "Finished.\n");
   722     printk(KERN_INFO PFX "Finished.\n");
   700     return 0;
   723     return 0;
   701 
   724 
   702 out_free_handlers:
   725 out_free_handlers: