Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- component pcl720 """Driver for the Advantech PCL 720 card. Only creates the
- digital inputs and outputs, not the counters/timers.""";
- pin in bit pin-##-out[32] "output pins";
- pin out bit pin-##-in[32] "input pins";
- pin out unsigned R0-in;
- pin out unsigned R1-in;
- pin out unsigned R2-in;
- pin out unsigned R3-in;
- pin out unsigned R0-out;
- pin out unsigned R1-out;
- pin out unsigned R2-out;
- pin out unsigned R3-out;
- function read nofp;
- function write nofp;
- variable unsigned base_addr;
- option count_function yes;
- option extra_setup yes;
- modparam dummy ioaddr """Base address of card. Separate each card base address
- with a comma but no space to load more than one card. eg
- loadrt pcl720 ioaddr=0x200,0x200. use 0xNNN to define addresses in Hex""";
- license "GPL";
- author "Andy Pugh";
- ;;
- #include <asm/io.h>
- #define MAX_CHAN 8
- static int ioaddr[MAX_CHAN] = {-1, -1, -1, -1, -1, -1, -1, -1};
- RTAPI_MP_ARRAY_INT(ioaddr, MAX_CHAN, "Base addresses")
- FUNCTION(read){
- unsigned char R0, R1, R2, R3;
- int i;
- R0 = inb(base_addr);
- R1 = inb(base_addr + 1);
- R2 = inb(base_addr + 2);
- R3 = inb(base_addr + 3);
- R0_in = R0;
- R1_in = R1;
- R2_in = R2;
- R3_in = R3;
- for (i = 0;i <= 7;i++){
- pin_in(i) = R0 & (1 << i);
- pin_in(i+8) = R1 & (1 << i);
- pin_in(i+16) = R2 & (1 << i);
- pin_in(i+24) = R3 & (1 << i);
- }
- }
- FUNCTION(write){
- unsigned char R0, R1, R2, R3;
- int i;
- R0 = 0;
- R1 = 0;
- R2 = 0;
- R3 = 0;
- for (i = 0;i <= 7;i++){
- R0 |= pin_out(i) << i;
- R1 |= pin_out(i+8) << i;
- R2 |= pin_out(i+16) << i;
- R3 |= pin_out(i+24) << i;
- }
- outb(base_addr, R0);
- outb(base_addr + 1, R1);
- outb(base_addr + 2, R2);
- outb(base_addr + 3, R3);
- R0_out = R0;
- R1_out = R1;
- R2_out = R2;
- R3_out = R3;
- }
- EXTRA_SETUP(){
- if (ioaddr[extra_arg] > 0) {
- base_addr = ioaddr[extra_arg];
- rtapi_print("Loading Advantech pcl720 driver at base addr %X\n", base_addr);
- return 0;
- }
- return -EINVAL;
- }
- int get_count(void){
- int i;
- for (i=0; ioaddr[i] > 0 && i < MAX_CHAN; i++){}
- return i;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement