static void av_exit(H264Decoder *d) { ErlDrvTermData reply[] = { ERL_DRV_ATOM, driver_mk_atom("av_decoder_closed"), ERL_DRV_PORT, driver_mk_port(d->port), ERL_DRV_TUPLE, 2 }; driver_output_term(d->port, reply, sizeof(reply) / sizeof(reply[0])); driver_exit(d->port, 0); }
static int __init driver_init (void) { printk("<1> driver_init\n"); /* allokere device-nummer */ major = 252; /* Allocating memory for the buffer */ memory_buffer = kmalloc(1, GFP_KERNEL); if (!memory_buffer) { driver_exit(); return -ENOMEM; } memset(memory_buffer, 0, 1); /* button_buffer = kmalloc(1, GFP_KERNEL); if (!button_buffer) { result = -ENOMEM; driver_exit(); return result; } memset(button_buffer, 0, 1); led_buffer = kmalloc(1, GFP_KERNEL); if (!led_buffer) { result = -ENOMEM; driver_exit(); return result; } memset(led_buffer, 0, 1); */ /* be om tilgang til I/O-porter */ /* buttons */ int per_res = check_region(piob->per, 1); int puer_res = check_region(piob->puer, 1); int ier_res = check_region(piob->ier, 1); if(per_res){ printk("<1>buttons: cannot reserve piob->per\n"); driver_exit(); return per_res; } if(puer_res){ printk("<1>buttons: cannot reserve piob->puer\n"); driver_exit(); return puer_res; } if(ier_res){ printk("<1>buttons: cannot reserve piob->ier\n"); driver_exit(); return ier_res; } request_region(piob->per, 1, "STK1000_LEDBUTTON_DRIVER"); request_region(piob->puer, 1, "STK1000_LEDBUTTON_DRIVER"); request_region(piob->ier, 1, "STK1000_LEDBUTTON_DRIVER"); /* leds */ int perLED_res = check_region(pioc->per, 1); int oer_res = check_region(pioc->oer, 1); if(perLED_res){ printk("<1>leds: cannot reserve pioc->per\n"); driver_exit(); return perLED_res; } if(oer_res){ printk("<1>leds: cannot reserve pioc->oer\n"); driver_exit(); return oer_res; } request_region(pioc->per, 1, "STK1000_LEDBUTTON_DRIVER"); request_region(pioc->oer, 1, "STK1000_LEDBUTTON_DRIVER"); /* dev_t dev; int r =alloc_chrdev_region(&dev, 0,16,"STK1000_LEDBUTTON_DRIVER"); printk(KERN_INFO "device id: %d",r); int piob_check = check_region((int)&AVR32_PIOB,1); int pioc_check = check_region((int)&AVR32_PIOC,1); if (piob_check && pioc_check){ printk(KERN_INFO "Diddnt get the regions we wanted."); } else{ request_region((int)&AVR32_PIOB,1,"STK1000_LEDBUTTON_DRIVER"); request_region((int)&AVR32_PIOC,1,"STK1000_LEDBUTTON_DRIVER"); } */ /* initialisere PIO-maskinvaren (som i øving 2) */ //Setup buttons //register_interrupt( button_isr, AVR32_PIOB_IRQ/32, AVR32_PIOB_IRQ % 32, BUTTONS_INT_LEVEL); piob->per = 0xff; piob->puer= 0xff; piob->ier = 0xff; //Setup leds pioc->per = 0xff; pioc->oer = 0xff; /* registrere device i systemet (må gjøres når alt annet er initialisert) */ int result = register_chrdev(major, "STK1000_LEDBUTTON_DRIVER", &driver_fops); if (result < 0) { printk("<1>memory: cannot obtain major number %d\n", major); return result; } return 0; }