1*08dc6394SMatthias Ringwald #include <stdint.h> 2*08dc6394SMatthias Ringwald #include <string.h> 3*08dc6394SMatthias Ringwald #include <stdio.h> 4*08dc6394SMatthias Ringwald 5*08dc6394SMatthias Ringwald #define L2CAP_FIXED_CHANNEL_TABLE_SIZE 3 6*08dc6394SMatthias Ringwald #define FIXED_CHANNEL_FIFO_INVALID_INDEX 0xff 7*08dc6394SMatthias Ringwald 8*08dc6394SMatthias Ringwald typedef struct l2cap_fixed_channel { 9*08dc6394SMatthias Ringwald uint8_t waiting_for_can_send_now; 10*08dc6394SMatthias Ringwald uint8_t next_request; 11*08dc6394SMatthias Ringwald } l2cap_fixed_channel_t; 12*08dc6394SMatthias Ringwald 13*08dc6394SMatthias Ringwald static l2cap_fixed_channel_t fixed_channels[L2CAP_FIXED_CHANNEL_TABLE_SIZE]; 14*08dc6394SMatthias Ringwald static uint8_t fixed_channel_head_index = FIXED_CHANNEL_FIFO_INVALID_INDEX; 15*08dc6394SMatthias Ringwald static uint8_t fixed_channel_tail_index = FIXED_CHANNEL_FIFO_INVALID_INDEX; 16*08dc6394SMatthias Ringwald fifo_init(void)17*08dc6394SMatthias Ringwaldstatic void fifo_init(void){ 18*08dc6394SMatthias Ringwald printf("\ninit\n"); 19*08dc6394SMatthias Ringwald memset(fixed_channels, 0, sizeof(fixed_channels)); 20*08dc6394SMatthias Ringwald int i; 21*08dc6394SMatthias Ringwald for (i=0;i<L2CAP_FIXED_CHANNEL_TABLE_SIZE;i++){ 22*08dc6394SMatthias Ringwald fixed_channels[i].next_request = FIXED_CHANNEL_FIFO_INVALID_INDEX; 23*08dc6394SMatthias Ringwald } 24*08dc6394SMatthias Ringwald } 25*08dc6394SMatthias Ringwald fifo_add(int index)26*08dc6394SMatthias Ringwaldstatic void fifo_add(int index){ 27*08dc6394SMatthias Ringwald printf("add index %u\n", index); 28*08dc6394SMatthias Ringwald // insert into queue 29*08dc6394SMatthias Ringwald if (fixed_channel_tail_index == FIXED_CHANNEL_FIFO_INVALID_INDEX){ 30*08dc6394SMatthias Ringwald fixed_channel_head_index = index; 31*08dc6394SMatthias Ringwald } else { 32*08dc6394SMatthias Ringwald fixed_channels[fixed_channel_tail_index].next_request = index; 33*08dc6394SMatthias Ringwald } 34*08dc6394SMatthias Ringwald fixed_channel_tail_index = index; 35*08dc6394SMatthias Ringwald fixed_channels[index].next_request = FIXED_CHANNEL_FIFO_INVALID_INDEX; 36*08dc6394SMatthias Ringwald fixed_channels[index].waiting_for_can_send_now = 1; 37*08dc6394SMatthias Ringwald } 38*08dc6394SMatthias Ringwald fifo_get_next(void)39*08dc6394SMatthias Ringwaldstatic int fifo_get_next(void){ 40*08dc6394SMatthias Ringwald if (fixed_channel_head_index == FIXED_CHANNEL_FIFO_INVALID_INDEX) return -1; 41*08dc6394SMatthias Ringwald 42*08dc6394SMatthias Ringwald int can_send = 0; 43*08dc6394SMatthias Ringwald uint8_t i = fixed_channel_head_index; 44*08dc6394SMatthias Ringwald if (fixed_channels[i].waiting_for_can_send_now){ 45*08dc6394SMatthias Ringwald can_send = 1; 46*08dc6394SMatthias Ringwald } 47*08dc6394SMatthias Ringwald fixed_channels[i].waiting_for_can_send_now = 0; 48*08dc6394SMatthias Ringwald fixed_channel_head_index = fixed_channels[i].next_request; 49*08dc6394SMatthias Ringwald fixed_channels[i].next_request = FIXED_CHANNEL_FIFO_INVALID_INDEX; 50*08dc6394SMatthias Ringwald if (fixed_channel_head_index == FIXED_CHANNEL_FIFO_INVALID_INDEX){ 51*08dc6394SMatthias Ringwald fixed_channel_tail_index = FIXED_CHANNEL_FIFO_INVALID_INDEX; 52*08dc6394SMatthias Ringwald } 53*08dc6394SMatthias Ringwald if (can_send) { 54*08dc6394SMatthias Ringwald return i; 55*08dc6394SMatthias Ringwald } 56*08dc6394SMatthias Ringwald return -1; 57*08dc6394SMatthias Ringwald } 58*08dc6394SMatthias Ringwald fifo_dump(void)59*08dc6394SMatthias Ringwaldstatic void fifo_dump(void){ 60*08dc6394SMatthias Ringwald while (1){ 61*08dc6394SMatthias Ringwald int i = fifo_get_next(); 62*08dc6394SMatthias Ringwald if (i < 0) break; 63*08dc6394SMatthias Ringwald printf("got index %u\n", i); 64*08dc6394SMatthias Ringwald } 65*08dc6394SMatthias Ringwald } 66*08dc6394SMatthias Ringwald test1(void)67*08dc6394SMatthias Ringwaldstatic void test1(void){ 68*08dc6394SMatthias Ringwald fifo_init(); 69*08dc6394SMatthias Ringwald fifo_add(1); 70*08dc6394SMatthias Ringwald fifo_dump(); 71*08dc6394SMatthias Ringwald } 72*08dc6394SMatthias Ringwald test2(void)73*08dc6394SMatthias Ringwaldstatic void test2(void){ 74*08dc6394SMatthias Ringwald fifo_init(); 75*08dc6394SMatthias Ringwald fifo_add(1); 76*08dc6394SMatthias Ringwald fifo_add(2); 77*08dc6394SMatthias Ringwald fifo_dump(); 78*08dc6394SMatthias Ringwald } 79*08dc6394SMatthias Ringwald test3(void)80*08dc6394SMatthias Ringwaldstatic void test3(void){ 81*08dc6394SMatthias Ringwald fifo_init(); 82*08dc6394SMatthias Ringwald fifo_add(1); 83*08dc6394SMatthias Ringwald int index; 84*08dc6394SMatthias Ringwald index = fifo_get_next(); 85*08dc6394SMatthias Ringwald printf("got %u\n", index); 86*08dc6394SMatthias Ringwald fifo_add(2); 87*08dc6394SMatthias Ringwald fifo_add(1); 88*08dc6394SMatthias Ringwald fifo_add(0); 89*08dc6394SMatthias Ringwald fifo_dump(); 90*08dc6394SMatthias Ringwald } 91*08dc6394SMatthias Ringwald main(int argc,const char ** argv)92*08dc6394SMatthias Ringwaldint main(int argc, const char ** argv){ 93*08dc6394SMatthias Ringwald (void) argc; 94*08dc6394SMatthias Ringwald (void) argv; 95*08dc6394SMatthias Ringwald test1(); 96*08dc6394SMatthias Ringwald test2(); 97*08dc6394SMatthias Ringwald test3(); 98*08dc6394SMatthias Ringwald } 99