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: |