⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sa1100_generic.c

📁 这是一个SIGMA方案的PMP播放器的UCLINUX程序,可播放DVD,VCD,CD MP3...有很好的参考价值.
💻 C
📖 第 1 页 / 共 3 页
字号:
  }  *map=sa1100_pcmcia_socket[sock].io_map[map->map];  return 0;}/* sa1100_pcmcia_set_io_map() * ^^^^^^^^^^^^^^^^^^^^^^^^^^ * Implements the set_io_map() operation for the in-kernel PCMCIA * service (formerly SS_SetIOMap in Card Services). We configure * the map speed as requested, but override the address ranges * supplied by Card Services. * * Returns: 0 on success, -1 on error */static int sa1100_pcmcia_set_io_map(unsigned int sock,				    struct pccard_io_map *map){  unsigned int clock, speed;  unsigned long mecr, start;  DEBUG(4, "%s() for sock %u\n", __FUNCTION__, sock);  DEBUG(4, "\tmap %u  speed %u\n\tstart 0x%08lx  stop 0x%08lx\n"	"\tflags: %s%s%s%s%s%s%s%s\n",	map->map, map->speed, map->start, map->stop,	(map->flags==0)?"<NONE>":"",	(map->flags&MAP_ACTIVE)?"ACTIVE ":"",	(map->flags&MAP_16BIT)?"16BIT ":"",	(map->flags&MAP_AUTOSZ)?"AUTOSZ ":"",	(map->flags&MAP_0WS)?"0WS ":"",	(map->flags&MAP_WRPROT)?"WRPROT ":"",	(map->flags&MAP_USE_WAIT)?"USE_WAIT ":"",	(map->flags&MAP_PREFETCH)?"PREFETCH ":"");  if(map->map>=MAX_IO_WIN){    printk(KERN_ERR "%s(): map (%d) out of range\n", __FUNCTION__,	   map->map);    return -1;  }  if(map->flags&MAP_ACTIVE){    speed=(map->speed>0)?map->speed:SA1100_PCMCIA_IO_ACCESS;    clock = get_cclk_frequency() * 100;    mecr=MECR;    MECR_BSIO_SET(mecr, sock, sa1100_pcmcia_mecr_bs(speed, clock));    sa1100_pcmcia_socket[sock].speed_io=speed;    DEBUG(4, "%s(): FAST%u %lx  BSM%u %lx  BSA%u %lx  BSIO%u %lx\n",	  __FUNCTION__, sock, MECR_FAST_GET(mecr, sock), sock,	  MECR_BSM_GET(mecr, sock), sock, MECR_BSA_GET(mecr, sock), 	  sock, MECR_BSIO_GET(mecr, sock));    MECR=mecr;  }  start=map->start;  if(map->stop==1)    map->stop=PAGE_SIZE-1;  map->start=sa1100_pcmcia_socket[sock].virt_io;  map->stop=map->start+(map->stop-start);  sa1100_pcmcia_socket[sock].io_map[map->map]=*map;  return 0;}  /* sa1100_pcmcia_set_io_map() *//* sa1100_pcmcia_get_mem_map() * ^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Implements the get_mem_map() operation for the in-kernel PCMCIA * service (formerly SS_GetMemMap in Card Services). Just returns a *  memory map descriptor which was assigned earlier by a *  set_mem_map() request. * * Returns: 0 on success, -1 if the map index was out of range */static int sa1100_pcmcia_get_mem_map(unsigned int sock,				     struct pccard_mem_map *map){  DEBUG(4, "%s() for sock %u\n", __FUNCTION__, sock);  if(map->map>=MAX_WIN){    printk(KERN_ERR "%s(): map (%d) out of range\n", __FUNCTION__,	   map->map);    return -1;  }  *map=sa1100_pcmcia_socket[sock].mem_map[map->map];  return 0;}/* sa1100_pcmcia_set_mem_map() * ^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Implements the set_mem_map() operation for the in-kernel PCMCIA * service (formerly SS_SetMemMap in Card Services). We configure * the map speed as requested, but override the address ranges * supplied by Card Services. * * Returns: 0 on success, -1 on error */static int sa1100_pcmcia_set_mem_map(unsigned int sock,				     struct pccard_mem_map *map){  unsigned int clock, speed;  unsigned long mecr, start;  DEBUG(4, "%s() for sock %u\n", __FUNCTION__, sock);  DEBUG(4, "\tmap %u  speed %u\n\tsys_start  %#lx\n"	"\tsys_stop   %#lx\n\tcard_start %#x\n"	"\tflags: %s%s%s%s%s%s%s%s\n",	map->map, map->speed, map->sys_start, map->sys_stop,	map->card_start, (map->flags==0)?"<NONE>":"",	(map->flags&MAP_ACTIVE)?"ACTIVE ":"",	(map->flags&MAP_16BIT)?"16BIT ":"",	(map->flags&MAP_AUTOSZ)?"AUTOSZ ":"",	(map->flags&MAP_0WS)?"0WS ":"",	(map->flags&MAP_WRPROT)?"WRPROT ":"",	(map->flags&MAP_ATTRIB)?"ATTRIB ":"",	(map->flags&MAP_USE_WAIT)?"USE_WAIT ":"");  if(map->map>=MAX_WIN){    printk(KERN_ERR "%s(): map (%d) out of range\n", __FUNCTION__,	   map->map);    return -1;  }  if(map->flags&MAP_ACTIVE){    /* When clients issue RequestMap, the access speed is not always     * properly configured:     */    if(map->speed > 0)      speed = map->speed;    else      switch(sa1100_pcmcia_socket[sock].cs_state.Vcc){      case 33:	speed = SA1100_PCMCIA_3V_MEM_ACCESS;	break;      default:	speed = SA1100_PCMCIA_5V_MEM_ACCESS;      }    clock = get_cclk_frequency() * 100;        mecr=MECR;        if(map->flags&MAP_ATTRIB){      MECR_BSA_SET(mecr, sock, sa1100_pcmcia_mecr_bs(speed, clock));      sa1100_pcmcia_socket[sock].speed_attr=speed;    } else {      MECR_BSM_SET(mecr, sock, sa1100_pcmcia_mecr_bs(speed, clock));      sa1100_pcmcia_socket[sock].speed_mem=speed;    }        DEBUG(4, "%s(): FAST%u %lx  BSM%u %lx  BSA%u %lx  BSIO%u %lx\n",	  __FUNCTION__, sock, MECR_FAST_GET(mecr, sock), sock,	  MECR_BSM_GET(mecr, sock), sock, MECR_BSA_GET(mecr, sock), 	  sock, MECR_BSIO_GET(mecr, sock));        MECR=mecr;  }  start=map->sys_start;  if(map->sys_stop==0)    map->sys_stop=PAGE_SIZE-1;  map->sys_start=(map->flags & MAP_ATTRIB)?\    sa1100_pcmcia_socket[sock].phys_attr:\    sa1100_pcmcia_socket[sock].phys_mem;  map->sys_stop=map->sys_start+(map->sys_stop-start);  sa1100_pcmcia_socket[sock].mem_map[map->map]=*map;  return 0;}  /* sa1100_pcmcia_set_mem_map() */#if defined(CONFIG_PROC_FS)/* sa1100_pcmcia_proc_setup() * ^^^^^^^^^^^^^^^^^^^^^^^^^^ * Implements the proc_setup() operation for the in-kernel PCMCIA * service (formerly SS_ProcSetup in Card Services). * * Returns: 0 on success, -1 on error */static void sa1100_pcmcia_proc_setup(unsigned int sock,				     struct proc_dir_entry *base){  struct proc_dir_entry *entry;  DEBUG(4, "%s() for sock %u\n", __FUNCTION__, sock);  if((entry=create_proc_entry("status", 0, base))==NULL){    printk(KERN_ERR "Unable to install \"status\" procfs entry\n");    return;  }  entry->read_proc=sa1100_pcmcia_proc_status;  entry->data=(void *)sock;}/* sa1100_pcmcia_proc_status() * ^^^^^^^^^^^^^^^^^^^^^^^^^^^ * Implements the /proc/bus/pccard/??/status file. * * Returns: the number of characters added to the buffer */static int sa1100_pcmcia_proc_status(char *buf, char **start, off_t pos,				     int count, int *eof, void *data){  char *p=buf;  unsigned int sock=(unsigned int)data;  unsigned int clock = get_cclk_frequency() * 100;  unsigned long mecr = MECR;  p+=sprintf(p, "k_flags  : %s%s%s%s%s%s%s\n", 	     sa1100_pcmcia_socket[sock].k_state.detect?"detect ":"",	     sa1100_pcmcia_socket[sock].k_state.ready?"ready ":"",	     sa1100_pcmcia_socket[sock].k_state.bvd1?"bvd1 ":"",	     sa1100_pcmcia_socket[sock].k_state.bvd2?"bvd2 ":"",	     sa1100_pcmcia_socket[sock].k_state.wrprot?"wrprot ":"",	     sa1100_pcmcia_socket[sock].k_state.vs_3v?"vs_3v ":"",	     sa1100_pcmcia_socket[sock].k_state.vs_Xv?"vs_Xv ":"");  p+=sprintf(p, "status   : %s%s%s%s%s%s%s%s%s\n",	     sa1100_pcmcia_socket[sock].k_state.detect?"SS_DETECT ":"",	     sa1100_pcmcia_socket[sock].k_state.ready?"SS_READY ":"",	     sa1100_pcmcia_socket[sock].cs_state.Vcc?"SS_POWERON ":"",	     sa1100_pcmcia_socket[sock].cs_state.flags&SS_IOCARD?\	     "SS_IOCARD ":"",	     (sa1100_pcmcia_socket[sock].cs_state.flags&SS_IOCARD &&	      sa1100_pcmcia_socket[sock].k_state.bvd1)?"SS_STSCHG ":"",	     ((sa1100_pcmcia_socket[sock].cs_state.flags&SS_IOCARD)==0 &&	      (sa1100_pcmcia_socket[sock].k_state.bvd1==0))?"SS_BATDEAD ":"",	     ((sa1100_pcmcia_socket[sock].cs_state.flags&SS_IOCARD)==0 &&	      (sa1100_pcmcia_socket[sock].k_state.bvd2==0))?"SS_BATWARN ":"",	     sa1100_pcmcia_socket[sock].k_state.vs_3v?"SS_3VCARD ":"",	     sa1100_pcmcia_socket[sock].k_state.vs_Xv?"SS_XVCARD ":"");  p+=sprintf(p, "mask     : %s%s%s%s%s\n",	     sa1100_pcmcia_socket[sock].cs_state.csc_mask&SS_DETECT?\	     "SS_DETECT ":"",	     sa1100_pcmcia_socket[sock].cs_state.csc_mask&SS_READY?\	     "SS_READY ":"",	     sa1100_pcmcia_socket[sock].cs_state.csc_mask&SS_BATDEAD?\	     "SS_BATDEAD ":"",	     sa1100_pcmcia_socket[sock].cs_state.csc_mask&SS_BATWARN?\	     "SS_BATWARN ":"",	     sa1100_pcmcia_socket[sock].cs_state.csc_mask&SS_STSCHG?\	     "SS_STSCHG ":"");  p+=sprintf(p, "cs_flags : %s%s%s%s%s\n",	     sa1100_pcmcia_socket[sock].cs_state.flags&SS_PWR_AUTO?\	     "SS_PWR_AUTO ":"",	     sa1100_pcmcia_socket[sock].cs_state.flags&SS_IOCARD?\	     "SS_IOCARD ":"",	     sa1100_pcmcia_socket[sock].cs_state.flags&SS_RESET?\	     "SS_RESET ":"",	     sa1100_pcmcia_socket[sock].cs_state.flags&SS_SPKR_ENA?\	     "SS_SPKR_ENA ":"",	     sa1100_pcmcia_socket[sock].cs_state.flags&SS_OUTPUT_ENA?\	     "SS_OUTPUT_ENA ":"");  p+=sprintf(p, "Vcc      : %d\n", sa1100_pcmcia_socket[sock].cs_state.Vcc);  p+=sprintf(p, "Vpp      : %d\n", sa1100_pcmcia_socket[sock].cs_state.Vpp);  p+=sprintf(p, "irq      : %d\n", sa1100_pcmcia_socket[sock].cs_state.io_irq);  p+=sprintf(p, "I/O      : %u (%u)\n", sa1100_pcmcia_socket[sock].speed_io,	     sa1100_pcmcia_cmd_time(clock, MECR_BSIO_GET(mecr, sock)));  p+=sprintf(p, "attribute: %u (%u)\n", sa1100_pcmcia_socket[sock].speed_attr,	     sa1100_pcmcia_cmd_time(clock, MECR_BSA_GET(mecr, sock)));  p+=sprintf(p, "common   : %u (%u)\n", sa1100_pcmcia_socket[sock].speed_mem,	     sa1100_pcmcia_cmd_time(clock, MECR_BSM_GET(mecr, sock)));  return p-buf;}#endif  /* defined(CONFIG_PROC_FS) */#ifdef CONFIG_CPU_FREQ/* sa1100_pcmcia_update_mecr() * ^^^^^^^^^^^^^^^^^^^^^^^^^^^ * When sa1100_pcmcia_notifier() decides that a MECR adjustment (due * to a core clock frequency change) is needed, this routine establishes * new BS_xx values consistent with the clock speed `clock'. */static void sa1100_pcmcia_update_mecr(unsigned int clock){  unsigned int sock;  unsigned long mecr = MECR;  for(sock = 0; sock < SA1100_PCMCIA_MAX_SOCK; ++sock){    MECR_BSIO_SET(mecr, sock,		  sa1100_pcmcia_mecr_bs(sa1100_pcmcia_socket[sock].speed_io,					clock));    MECR_BSA_SET(mecr, sock,		 sa1100_pcmcia_mecr_bs(sa1100_pcmcia_socket[sock].speed_attr,				       clock));    MECR_BSM_SET(mecr, sock,		 sa1100_pcmcia_mecr_bs(sa1100_pcmcia_socket[sock].speed_mem,				       clock));  }  MECR = mecr;}/* sa1100_pcmcia_notifier() * ^^^^^^^^^^^^^^^^^^^^^^^^ * When changing the processor core clock frequency, it is necessary * to adjust the MECR timings accordingly. We've recorded the timings * requested by Card Services, so this is just a matter of finding * out what our current speed is, and then recomputing the new MECR * values. * * Returns: 0 on success, -1 on error */static int sa1100_pcmcia_notifier(struct notifier_block *nb,				  unsigned long val, void *data){  struct cpufreq_info *ci = data;  switch(val){  case CPUFREQ_MINMAX:    break;  case CPUFREQ_PRECHANGE:    if(ci->new_freq > ci->old_freq){      DEBUG(2, "%s(): new frequency %u.%uMHz > %u.%uMHz, pre-updating\n",	    __FUNCTION__,	    ci->new_freq / 1000, (ci->new_freq / 100) % 10,	    ci->old_freq / 1000, (ci->old_freq / 100) % 10);      sa1100_pcmcia_update_mecr(ci->new_freq);    }    break;  case CPUFREQ_POSTCHANGE:    if(ci->new_freq < ci->old_freq){      DEBUG(2, "%s(): new frequency %u.%uMHz < %u.%uMHz, post-updating\n",	    __FUNCTION__,	    ci->new_freq / 1000, (ci->new_freq / 100) % 10,	    ci->old_freq / 1000, (ci->old_freq / 100) % 10);      sa1100_pcmcia_update_mecr(ci->new_freq);    }    break;  default:    printk(KERN_ERR "%s(): unknown CPU frequency event %lx\n", __FUNCTION__,	   val);    return -1;  }  return 0;}static struct notifier_block sa1100_pcmcia_notifier_block = {  notifier_call: sa1100_pcmcia_notifier};#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -