/*- * Copyright (c) 2005 Salvatore Sanfilippo * Copyright (c) 2007 Uwe Klein Habertwedt * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * * $Id$ * * Jim - POSIX extension */ #include #include #include #include #include #include #include #define JIM_EXTENSION #include "jim.h" static void Jim_PosixSetError(Jim_Interp *interp) { Jim_SetResultString(interp, strerror(errno), -1); } static int Jim_HwIoTemplateCommand(Jim_Interp *interp, int argc, Jim_Obj *const *argv) { long longValue; if (argc != 2) { Jim_WrongNumArgs(interp, 1, argv, "?template?"); return JIM_ERR; } if (Jim_GetLong(interp, argv[1], &longValue) != JIM_OK) return JIM_ERR; // body return JIM_OK; } #define AREAINFOLEN 10 typedef struct areainfo { int len; int base; int flag; char name[20]; } AREAINFO; AREAINFO areainfo[AREAINFOLEN]; #define NEW 0 #define FOUND 1 #define NOTFOUND -1 int placearea(const char *name,int lbase, int len, int flag) { int i; int state = NOTFOUND; int firstempty = NOTFOUND; int numbase = 0; if (lbase==0) { sscanf(name,"%i",&numbase); // fprintf(stderr,"lb0 %s : %x \n",name,numbase); } for (i=0;(i= areainfo[i].base) && (numbase < ( areainfo[i].base + areainfo[i].len)) ) return(numbase); if (lbase && firstempty<0 && areainfo[i].flag == 0) { firstempty = i; //fprintf(stderr,"firstempty: %d\n",firstempty); } } if ((state==NOTFOUND)&&(firstempty>=0)) { i = firstempty; state = NEW; } switch (state) { case NEW: strcpy(areainfo[i].name,name); //fprintf(stderr,"created an entry %s \n",areainfo[i].name); case FOUND: areainfo[i].len = len; areainfo[i].base = lbase; areainfo[i].flag = flag; //fprintf(stderr,"refreshed an entry %s @ %x \n",areainfo[i].name,areainfo[i].base); break; default: //fprintf(stderr,"notfound : entry %s \n",name); return lbase; } return areainfo[i].base; } int getbasefromID(const char *name) { return placearea(name,0,0,0); } static int Jim_HwIoAreaCommand(Jim_Interp *interp, int argc, Jim_Obj *const *argv) { const char *op ; int strlen; const char *name = NULL; long offset = -1; long len = -1; long res; switch (argc) { case 5: if (Jim_GetLong(interp, argv[4], &len) != JIM_OK) { Jim_WrongNumArgs(interp, 1, argv, "invalid len"); return JIM_ERR; } case 4: if (Jim_GetLong(interp, argv[3], &offset) != JIM_OK) { Jim_WrongNumArgs(interp, 1, argv, "invalid offset"); return JIM_ERR; } case 3: if (name = Jim_GetString(argv[2], &strlen),strlen == 0) { return JIM_ERR; } case 2: if (op = Jim_GetString(argv[1], &strlen),strlen == 0) { return JIM_ERR; } break; case 1: op = "list"; break; default: Jim_WrongNumArgs(interp, 1, argv, "invalid offset"); return JIM_ERR; } if (strcmp(op,"create") == 0 ) { if ( ioperm( offset, len, 1) == 0 ) { placearea(name,offset, len,1 ); Jim_SetResult(interp,argv[2]); } } else if (strcmp(op,"delete") == 0 ) { res = ioperm( offset, len, 0); placearea(name,offset, len, 0 ); Jim_SetResult(interp, Jim_NewIntObj(interp, res)); } else if (strcmp(op,"list") == 0 ) { res = 0; Jim_SetResult(interp, Jim_NewIntObj(interp, res)); } else { Jim_WrongNumArgs(interp, 1, argv, "unknown op"); return JIM_ERR; } return JIM_OK; } static long base = 0x300; static long bcast = 0x30a; static int Jim_HwIoBaseCommand(Jim_Interp *interp, int argc, Jim_Obj *const *argv) { Jim_Obj *ret = NULL; switch (argc) { case 3: if (Jim_GetLong(interp, argv[2], &bcast) != JIM_OK) { Jim_WrongNumArgs(interp, 1, argv, "invalid bcast"); return JIM_ERR; } case 2: if (Jim_GetLong(interp, argv[1], &base) != JIM_OK) { Jim_WrongNumArgs(interp, 1, argv, "invalid base"); return JIM_ERR; } case 1: break; default: Jim_WrongNumArgs(interp, 1, argv, "invalid offset"); return JIM_ERR; } ret = Jim_NewListObj(interp, 0, 0); Jim_ListAppendElement(interp,ret,Jim_NewIntObj(interp, base)); Jim_ListAppendElement(interp,ret,Jim_NewIntObj(interp, bcast)); Jim_SetResult(interp, ret); return JIM_OK; } // getIntsfromList retrieves a number of ints from a list (argv) // first item must be a number consecutive elements can be numbers // or '.' for repeat last number // or '+' for increment last number by size // or '-' for decrement last number by size static int HwIo_getIntsfromList(Jim_Interp *interp, Jim_Obj *arg, int size, int *lastval, int *pval) { long tmpval; const char *strarg; int strlen = 0; if (Jim_GetLong(interp, arg, &tmpval) == JIM_OK) { *pval = tmpval; //fprintf(stderr,"int conversion OK\n"); return JIM_OK; } else if (lastval == 0) { //fprintf(stderr,"tmpval: %ld lastval %p \n",tmpval, lastval); return JIM_ERR; } else if (strarg = Jim_GetString(arg, &strlen),strlen>0) { // fprintf(stderr,"lastval: %ld %p %s\n",tmpval, strarg,strarg); do { switch (*strarg) { case '-': *pval = *lastval - size; break; case '.': *pval = *lastval; break; case '+': *pval = *lastval + size; break; default: //fprintf(stderr,"extra opt :%d %c %s\n",strlen,*strarg,strarg); return JIM_ERR; } } while (strarg++,*strarg); //fprintf(stderr,"pval: %d \n",*pval); } else { //fprintf(stderr,"else \n"); return JIM_ERR; } return JIM_OK; } #define MASK(width) ((1<=4) && (Jim_ListLength(interp,argv[1],&llength),llength > 1)) { Jim_Obj* bobj; // fprintf(stderr,"larg length:%d \n",llength); for (i=0;(i 3) && (board = Jim_GetString(argv[1], &strlen))) { if (strcmp("int",board)==0) { rettype = RETisINT; argv++; argc--; continue; } if (strcmp("noswap",board)==0) { swaplist[0] = 0; swaplist[1] = 1; swaplist[2] = 2; swaplist[3] = 3; argv++; argc--; continue; } if (sscanf(board,"swap:%i,%i,%i,%i", &swaplist[0],&swaplist[1],&swaplist[2],&swaplist[3] )==4) { argv++; argc--; continue; } // fprintf(stderr,"marg Board: %s base %x \n",board,getbasefromID(board)); //fprintf(stderr,"cont for ID\n"); lbase[bcnt++] = getbasefromID(board); argv++; argc--; } if (bcnt > MAXBOARD) { Jim_WrongNumArgs(interp, 1, argv, "too many boards specified!"); return JIM_ERR; } if (!bcnt) bcnt = 1; // default base // get start if (Jim_GetLong(interp, argv[1], &addr) != JIM_OK) { return JIM_ERR; } outvalue = COMPOSE(ADDRREG,addr); // get len if (Jim_GetLong(interp, argv[2], &len) != JIM_OK) { return JIM_ERR; } len /= bcnt; // fix for bcnt items per len-- for (i=0;(i=swaplen) { j -= swaplen; for (k=0;(k=swaplen) { j -= swaplen; for (k=0;(k= 0) && newprio && (new <0)) { sched_param.sched_priority = max + new; //fprintf(stderr,"priorel : %d \n",sched_param.sched_priority); if (sched_setscheduler(SELF, policy, &sched_param)) goto tell_posix_error; return JIM_OK; } if (( policy >= 0) && newprio && (new >min)) { sched_param.sched_priority = new; //fprintf(stderr,"prioabs: %d \n",sched_param.sched_priority); if (sched_setscheduler(SELF, policy, &sched_param)) goto tell_posix_error; return JIM_OK; } return JIM_ERR; case 1: { char buff[0x20]; mypolicy = sched_getscheduler(SELF); switch (mypolicy) { case SCHED_OTHER: mypolicy = OTHER ; break; case SCHED_RR: mypolicy = RR ; break; case SCHED_FIFO: mypolicy = FIFO ; break; } if (sched_getparam(SELF, &sched_param)) goto tell_posix_error; sprintf(buff,"%s %d",policies[mypolicy],sched_param.sched_priority); Jim_SetResultString(interp, buff, -1); return JIM_OK; } default: Jim_WrongNumArgs(interp, 1, argv, "?template?"); return JIM_ERR; } sched_param.sched_priority = sched_get_priority_max(SCHED_FIFO) - 10; sched_setscheduler(0, SCHED_FIFO, &sched_param); return JIM_OK; tell_posix_error: //fprintf(stderr,"telling posix error:"); Jim_PosixSetError(interp); return JIM_ERR; } int Jim_OnLoad(Jim_Interp *interp) { Jim_InitExtension(interp); if (Jim_PackageProvide(interp, "hwio", "0.5", JIM_ERRMSG) != JIM_OK) return JIM_ERR; Jim_CreateCommand(interp, "hwio.area", Jim_HwIoAreaCommand, NULL, NULL); Jim_CreateCommand(interp, "hwio.base", Jim_HwIoBaseCommand, NULL, NULL); Jim_CreateCommand(interp, "hwio.inb" , Jim_HwIoInbCommand, NULL, NULL); Jim_CreateCommand(interp, "hwio.outb", Jim_HwIoOutbCommand, NULL, NULL); Jim_CreateCommand(interp, "hwio.inw" , Jim_HwIoInwCommand, NULL, NULL); Jim_CreateCommand(interp, "hwio.outw", Jim_HwIoOutwCommand, NULL, NULL); Jim_CreateCommand(interp, "hwio.inl" , Jim_HwIoInlCommand, NULL, NULL); Jim_CreateCommand(interp, "hwio.outl", Jim_HwIoOutlCommand, NULL, NULL); Jim_CreateCommand(interp, "hwio.wreg", Jim_HwIoWregCommand, NULL, NULL); Jim_CreateCommand(interp, "hwio.rreg", Jim_HwIoRregCommand, NULL, NULL); Jim_CreateCommand(interp, "hwio.rblk", Jim_HwIoRregBlkCommand, NULL, NULL); Jim_CreateCommand(interp, "hwio.mlock", Jim_HwIoMLockCommand, NULL, NULL); Jim_CreateCommand(interp, "hwio.priority", Jim_HwIoSchedPriorityCommand, NULL, NULL); // get the delay port ioperm( 0x80, 1, 1); return JIM_OK; }