1 #include <ubb/ubb.h> 2 #include <stdio.h> 3 #include <time.h> 4 5 /* Pin assignments: 6 * 7 * M74HC595B1R 8 * 9 * QB |----| VCC UBB_VDD 10 * QC | | QA 11 * QD | | SI UBB_DAT2 12 * QE | | G UBB_DAT0 13 * QF | | RCK UBB_DAT1 14 * QG | | SCK UBB_CLK 15 * QH | | SCLR UBB_CMD 16 * UBB_GND GND |----| QH' UBB_DAT3 17 */ 18 19 #define SHIFT_SI UBB_DAT2 20 #define SHIFT_QH UBB_DAT3 21 #define SHIFT_SCLR UBB_CMD 22 #define SHIFT_SCK UBB_CLK 23 #define SHIFT_G UBB_DAT0 24 #define SHIFT_RCK UBB_DAT1 25 26 struct timespec tSCKs = {0, 15}, 27 tWH = {0, 15}, 28 tWL = {0, 15}; 29 30 void shift_in(uint8_t v) 31 { 32 uint8_t mask; 33 34 for (mask = 0x80; mask; mask >>= 1) 35 { 36 if (v & mask) 37 { 38 printf("1"); 39 SET(SHIFT_SI); 40 } 41 else 42 { 43 printf("0"); 44 CLR(SHIFT_SI); 45 } 46 47 nanosleep(&tSCKs, NULL); 48 SET(SHIFT_SCK); 49 nanosleep(&tWH, NULL); 50 CLR(SHIFT_SCK); 51 } 52 53 printf("\n"); 54 } 55 56 uint8_t shift_out() 57 { 58 uint8_t mask, result = 0; 59 60 for (mask = 0x80; mask; mask >>= 1) 61 { 62 if (PIN(SHIFT_QH)) 63 { 64 result |= mask; 65 printf("1"); 66 } 67 else 68 printf("0"); 69 70 nanosleep(&tSCKs, NULL); 71 SET(SHIFT_SCK); 72 nanosleep(&tWH, NULL); 73 CLR(SHIFT_SCK); 74 } 75 76 printf("\n"); 77 return result; 78 } 79 80 int main(int argc, char *argv[]) 81 { 82 uint8_t result = 0; 83 84 if (ubb_open(0) < 0) { 85 perror("ubb_open"); 86 return 1; 87 } 88 89 ubb_power(1); 90 printf("Power on.\n"); 91 92 OUT(SHIFT_SI); 93 OUT(SHIFT_RCK); 94 OUT(SHIFT_SCLR); 95 OUT(SHIFT_SCK); 96 OUT(SHIFT_G); 97 IN(SHIFT_QH); 98 99 CLR(SHIFT_SCK); 100 CLR(SHIFT_RCK); 101 102 /* Clear the register. */ 103 104 CLR(SHIFT_SCLR); 105 SET(SHIFT_SCK); 106 nanosleep(&tWL, NULL); 107 CLR(SHIFT_SCK); 108 SET(SHIFT_SCLR); 109 110 /* Shift in a value. */ 111 112 shift_in(0xa6); 113 114 /* Shift out the value. */ 115 116 result = shift_out(); 117 118 printf("Result: %x\n", result); 119 120 printf("Closing...\n"); 121 ubb_close(0); 122 123 return 0; 124 }