static int nm_loadcoeff(struct neo_softc *sc, int dir, int num) { int ofs, sz, i; u_int32_t addr; if (nf == NULL) { size_t buflen; u_char *buf; int error; error = loadfirmware("neo-coefficients", &buf, &buflen); if (error) return (error); nf = (struct neo_firmware *)buf; } addr = (dir == AUMODE_PLAY)? 0x01c : 0x21c; if (dir == AUMODE_RECORD) num += 8; sz = nf->coefficientSizes[num]; ofs = 0; while (num-- > 0) ofs+= nf->coefficientSizes[num]; for (i = 0; i < sz; i++) nm_wrbuf(sc, sc->cbuf + i, nf->coefficients[ofs + i], 1); nm_wr(sc, addr, sc->cbuf, 4); if (dir == AUMODE_PLAY) sz--; nm_wr(sc, addr + 4, sc->cbuf + sz, 4); return (0); }
int kue_load_fw(struct kue_softc *sc) { usb_device_descriptor_t dd; usbd_status err; struct kue_firmware *fw; u_char *buf; size_t buflen; DPRINTFN(1,("%s: %s: enter\n", sc->kue_dev.dv_xname, __func__)); /* * First, check if we even need to load the firmware. * If the device was still attached when the system was * rebooted, it may already have firmware loaded in it. * If this is the case, we don't need to do it again. * And in fact, if we try to load it again, we'll hang, * so we have to avoid this condition if we don't want * to look stupid. * * We can test this quickly by checking the bcdRevision * code. The NIC will return a different revision code if * it's probed while the firmware is still loaded and * running. */ if (usbd_get_device_desc(sc->kue_udev, &dd)) return (EIO); if (UGETW(dd.bcdDevice) >= KUE_WARM_REV) { printf("%s: warm boot, no firmware download\n", sc->kue_dev.dv_xname); return (0); } err = loadfirmware("kue", &buf, &buflen); if (err) { printf("%s: failed loadfirmware of file %s: errno %d\n", sc->kue_dev.dv_xname, "kue", err); return (err); } fw = (struct kue_firmware *)buf; printf("%s: cold boot, downloading firmware\n", sc->kue_dev.dv_xname); /* Load code segment */ DPRINTFN(1,("%s: kue_load_fw: download code_seg\n", sc->kue_dev.dv_xname)); err = kue_ctl(sc, KUE_CTL_WRITE, KUE_CMD_SEND_SCAN, 0, (void *)&fw->data[0], ntohl(fw->codeseglen)); if (err) { printf("%s: failed to load code segment: %s\n", sc->kue_dev.dv_xname, usbd_errstr(err)); free(buf, M_DEVBUF); return (EIO); } /* Load fixup segment */ DPRINTFN(1,("%s: kue_load_fw: download fix_seg\n", sc->kue_dev.dv_xname)); err = kue_ctl(sc, KUE_CTL_WRITE, KUE_CMD_SEND_SCAN, 0, (void *)&fw->data[ntohl(fw->codeseglen)], ntohl(fw->fixseglen)); if (err) { printf("%s: failed to load fixup segment: %s\n", sc->kue_dev.dv_xname, usbd_errstr(err)); free(buf, M_DEVBUF); return (EIO); } /* Send trigger command. */ DPRINTFN(1,("%s: kue_load_fw: download trig_seg\n", sc->kue_dev.dv_xname)); err = kue_ctl(sc, KUE_CTL_WRITE, KUE_CMD_SEND_SCAN, 0, (void *)&fw->data[ntohl(fw->codeseglen) + ntohl(fw->fixseglen)], ntohl(fw->trigseglen)); if (err) { printf("%s: failed to load trigger segment: %s\n", sc->kue_dev.dv_xname, usbd_errstr(err)); free(buf, M_DEVBUF); return (EIO); } free(buf, M_DEVBUF); usbd_delay_ms(sc->kue_udev, 10); /* * Reload device descriptor. * Why? The chip without the firmware loaded returns * one revision code. The chip with the firmware * loaded and running returns a *different* revision * code. This confuses the quirk mechanism, which is * dependent on the revision data. */ (void)usbd_reload_device_desc(sc->kue_udev); DPRINTFN(1,("%s: %s: done\n", sc->kue_dev.dv_xname, __func__)); /* Reset the adapter. */ kue_reset(sc); return (0); }
static int uticom_download_fw(struct uticom_softc *sc, int pipeno, struct usbd_device *dev) { u_char *obuf, *firmware; size_t firmware_size; int buffer_size, pos; uint8_t cs = 0, *buffer; usbd_status err; struct uticom_fw_header *header; struct usbd_xfer *oxfer = 0; usbd_status error = 0; struct usbd_pipe *pipe; error = loadfirmware("tusb3410", &firmware, &firmware_size); if (error) return (error); buffer_size = UTICOM_FW_BUFSZ + sizeof(struct uticom_fw_header); buffer = malloc(buffer_size, M_USBDEV, M_WAITOK | M_CANFAIL); if (!buffer) { printf("%s: uticom_download_fw: out of memory\n", sc->sc_dev.dv_xname); free(firmware, M_DEVBUF); return ENOMEM; } memcpy(buffer, firmware, firmware_size); memset(buffer + firmware_size, 0xff, buffer_size - firmware_size); for (pos = sizeof(struct uticom_fw_header); pos < buffer_size; pos++) cs = (uint8_t)(cs + buffer[pos]); header = (struct uticom_fw_header*)buffer; header->length = (uint16_t)(buffer_size - sizeof(struct uticom_fw_header)); header->checkSum = cs; DPRINTF(("%s: downloading firmware ...\n", sc->sc_dev.dv_xname)); err = usbd_open_pipe(sc->sc_iface, pipeno, USBD_EXCLUSIVE_USE, &pipe); if (err) { printf("%s: open bulk out error (addr %d): %s\n", sc->sc_dev.dv_xname, pipeno, usbd_errstr(err)); error = EIO; goto finish; } oxfer = usbd_alloc_xfer(dev); if (oxfer == NULL) { error = ENOMEM; goto finish; } obuf = usbd_alloc_buffer(oxfer, buffer_size); if (obuf == NULL) { error = ENOMEM; goto finish; } memcpy(obuf, buffer, buffer_size); usbd_setup_xfer(oxfer, pipe, (void *)sc, obuf, buffer_size, USBD_NO_COPY | USBD_SYNCHRONOUS, USBD_NO_TIMEOUT, 0); err = usbd_transfer(oxfer); if (err != USBD_NORMAL_COMPLETION) printf("%s: uticom_download_fw: error: %s\n", sc->sc_dev.dv_xname, usbd_errstr(err)); finish: free(firmware, M_DEVBUF); usbd_free_buffer(oxfer); usbd_free_xfer(oxfer); oxfer = NULL; usbd_abort_pipe(pipe); usbd_close_pipe(pipe); free(buffer, M_USBDEV); return err; }
int main(int argc, char **argv) { int fd,ret, nfd; CD cd; Keda_CapPrm param; if (argc != 3){ printf("usage: %s <host> <port>\n", argv[0]); exit(0); } printf("%s\n", book); loadfirmware(); memset(&cd, 0, sizeof(CD)); cd.host = argv[1]; cd.port = atoi(argv[2]); param.width1 = 720;// 1280; param.height1 = 576;// 576; param.width2 = 320; param.height2 = 240; // param.aewbenable = 1; printf("........main.\n"); ret = Keda_Ipnc_CaptureCreate(¶m); printf("........main...\n"); if (ret){ printf ("Capture Create failed\n"); return -1; } cd.thread_stat = 1; pthread_create(&cd.thread, 0, process, &cd); unsigned short w,h; int kcode; while(1) { kcode = getkey(); if ('q' == kcode){ cd.thread_stat = 0; break; } else if ('t' == kcode){ printf("......w:%d, h:%d.....\n", w, h); Keda_CaptureGetParam(0, &w, &h); printf("......w:%d, h:%d.....\n", w, h); sleep(1); Keda_CaptureSetParam(0, 320, 240); sleep(1); Keda_CaptureGetParam(0, &w, &h); printf("o......w:%d, h:%d.....\n", w, h); } usleep(200*000); } pthread_join(cd.thread, 0); Keda_Ipnc_CaptureDelete(); unloadfirmware(); return 0; }
static int yds_download_mcode(struct yds_softc *sc) { u_int ctrl; const u_int32_t *p; size_t size; u_char *buf; size_t buflen; int error; struct yds_firmware *yf; error = loadfirmware("yds", &buf, &buflen); if (error) return 1; yf = (struct yds_firmware *)buf; if (sc->sc_flags & YDS_CAP_MCODE_1) { p = (u_int32_t *)&yf->data[ntohl(yf->dsplen)]; size = ntohl(yf->ds1len); } else if (sc->sc_flags & YDS_CAP_MCODE_1E) { p = (u_int32_t *)&yf->data[ntohl(yf->dsplen) + ntohl(yf->ds1len)]; size = ntohl(yf->ds1elen); } else { free(buf, M_DEVBUF); return 1; /* unknown */ } if (size > buflen) { printf("%s: old firmware file, update please\n", sc->sc_dev.dv_xname); free(buf, M_DEVBUF); return 1; } if (yds_disable_dsp(sc)) { free(buf, M_DEVBUF); return 1; } /* Software reset */ YWRITE4(sc, YDS_MODE, YDS_MODE_RESET); YWRITE4(sc, YDS_MODE, 0); YWRITE4(sc, YDS_MAPOF_REC, 0); YWRITE4(sc, YDS_MAPOF_EFFECT, 0); YWRITE4(sc, YDS_PLAY_CTRLBASE, 0); YWRITE4(sc, YDS_REC_CTRLBASE, 0); YWRITE4(sc, YDS_EFFECT_CTRLBASE, 0); YWRITE4(sc, YDS_WORK_BASE, 0); ctrl = YREAD2(sc, YDS_GLOBAL_CONTROL); YWRITE2(sc, YDS_GLOBAL_CONTROL, ctrl & ~0x0007); /* Download DSP microcode. */ nswaph((u_int32_t *)&yf->data[0], ntohl(yf->dsplen)); YWRITEREGION4(sc, YDS_DSP_INSTRAM, (u_int32_t *)&yf->data[0], ntohl(yf->dsplen)); /* Download CONTROL microcode. */ nswaph((u_int32_t *)p, size); YWRITEREGION4(sc, YDS_CTRL_INSTRAM, p, size); yds_enable_dsp(sc); delay(10*1000); /* neccesary on my 724F (??) */ free(buf, M_DEVBUF); return 0; }