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

📄 scp_atom.c

📁 IBM source for pallas/vulcan/vesta
💻 C
字号:
/*---------------------------------------------------------------------------+|       This source code has been made available to you by IBM on an AS-IS|       basis.  Anyone receiving this source is licensed under IBM|       copyrights to use it in any way he or she deems fit, including|       copying it, modifying it, compiling it, and redistributing it either|       with or without modifications.  No license under IBM patents or|       patent applications is to be implied by the copyright license.||       Any user of this software should understand that IBM cannot provide|       technical support for this software and will not be responsible for|       any consequences resulting from the use of this software.||       Any person who transfers this source code or any derivative work|       must include the IBM copyright notice, this paragraph, and the|       preceding two paragraphs in the transferred software.||       COPYRIGHT   I B M   CORPORATION 1997, 1999, 2001, 2003|       LICENSED MATERIAL  -  PROGRAM PROPERTY OF I B M+----------------------------------------------------------------------------*//*----------------------------------------------------------------------------+| Author:    Mark Detrick| Component: scp| File:      scp_atom.c| Purpose:   Atom functions for serial control port| Changes:|| Date:       Author            Comment:| ----------  ----------------  -----------------------------------------------| 09/19/2003  MSD               Created.+----------------------------------------------------------------------------*//* The necessary header files */#include <linux/config.h>#include <linux/version.h>#include <linux/kernel.h>#include <linux/module.h>#include <linux/init.h>#include <linux/stddef.h>#include <asm/system.h>#include "os/os-sync.h"#include "os/os-interrupt.h"#include "scp_atom.h"#include "scp/scp_inf.h"#include "xilinx.h"unsigned short * volatile fpga;unsigned char * volatile scp_regs;unsigned long *gpio_regs;void scp_atom_regs_init(){   ULONG flag;      flag = os_enter_critical_section();      fpga = ioremap(STB_FPGA_BASE_ADDRESS, 32);      scp_regs = ioremap(SCP_REG_BASE, 7);           gpio_regs = ioremap(STB_GPIO0_BASE_ADDRESS, 72);   os_leave_critical_section(flag);   }void scp_atom_init(){    unsigned long gpio_val;    ULONG flag;         flag = os_enter_critical_section();   #ifdef __DRV_FOR_VULCAN__//     Set GPIO0[10][12] to alternate output 2 to enable SCP CLK and TX //     Set GPIO0[11] to alternate input 2 to enable SCP RX                 gpio_val = gpio_regs[GPIO0_OS0_OFFSET] & ~0x00000FC0;   gpio_regs[GPIO0_OS0_OFFSET] = gpio_val |  0x00000880;   gpio_val = gpio_regs[GPIO0_TS0_OFFSET] & ~0x00000FC0;   gpio_regs[GPIO0_TS0_OFFSET] = gpio_val |  0x00000880;   gpio_val = gpio_regs[GPIO0_IS20_OFFSET] & ~0x00000300;   gpio_regs[GPIO0_IS20_OFFSET] = gpio_val |  0x00000100;   #endif#ifdef __DRV_FOR_PALLAS__//     Set GPIO0[6][8] to alternate output 1 to enable SCP CLK(8) and TX(6) //     Set GPIO0[7] to alternate input 1 to enable SCP RX                 gpio_val = gpio_regs[GPIO0_OS0_OFFSET] & ~0x000FC000;   gpio_regs[GPIO0_OS0_OFFSET] = gpio_val |  0x00044000;   gpio_val = gpio_regs[GPIO0_TS0_OFFSET] & ~0x000FC000;   gpio_regs[GPIO0_TS0_OFFSET] = gpio_val |  0x00044000;   gpio_val = gpio_regs[GPIO0_IS10_OFFSET] & ~0x00030000;   gpio_regs[GPIO0_IS20_OFFSET] = gpio_val |  0x00010000;#endif   os_leave_critical_section(flag);   }void scp_atom_uninit(){  /* unmap IO */   iounmap(fpga);   iounmap(scp_regs);   iounmap(gpio_regs);}void scp_atom_display_regs(){      printk("scp_osi_display_regs: SPMODE register = 0x%4.4x\n", scp_regs[SCP_SPMODE_OFFSET]);   printk("scp_osi_display_regs: RXDATA register = 0x%4.4x\n", scp_regs[SCP_RXDATA_OFFSET]);   printk("scp_osi_display_regs: TXDATA register = 0x%4.4x\n", scp_regs[SCP_TXDATA_OFFSET]);   printk("scp_osi_display_regs: SPCOM  register = 0x%4.4x\n", scp_regs[SCP_SPCOM_OFFSET]);   printk("scp_osi_display_regs: STATUS register = 0x%4.4x\n", scp_regs[SCP_STATUS_OFFSET]);   printk("scp_osi_display_regs: CDM    register = 0x%4.4x\n", scp_regs[SCP_CDM_OFFSET]);}int scp_atom_get_cdm(unsigned long *p_value){   *p_value = scp_regs[SCP_CDM_OFFSET];   return(0);}       int scp_atom_set_cdm(unsigned long value){   ULONG flag;      flag = os_enter_critical_section();      scp_regs[SCP_CDM_OFFSET] = value;      os_leave_critical_section(flag);   return(0);}    int scp_atom_get_reverse_data(unsigned long *p_value){  *p_value = scp_regs[SCP_SPMODE_OFFSET] & SCP_SPMODE_REVDAT;  return(0);}         int scp_atom_set_reverse_data(unsigned long value){   ULONG flag;   if((value < 0) ||value > 1)    {      printk("scp_atom_set_clock_invert: invalid value specified\n");      return (-1);   }         flag = os_enter_critical_section();   if(value == 1)      scp_regs[SCP_SPMODE_OFFSET] = scp_regs[SCP_SPMODE_OFFSET]| SCP_SPMODE_REVDAT;   if(value == 0)      scp_regs[SCP_SPMODE_OFFSET] = scp_regs[SCP_SPMODE_OFFSET]& ~SCP_SPMODE_REVDAT;      os_leave_critical_section(flag);         return (0);   }       int scp_atom_get_clock_invert(unsigned long *p_value){  *p_value = scp_regs[SCP_SPMODE_OFFSET] & SCP_SPMODE_CI;   return(0);}             int scp_atom_set_clock_invert(unsigned long value){   ULONG flag;      if((value < 0) ||value > 1)    {      printk("scp_atom_set_clock_invert: invalid value specified\n");      return (-1);   }      flag = os_enter_critical_section();      if(value == 1)      scp_regs[SCP_SPMODE_OFFSET] = scp_regs[SCP_SPMODE_OFFSET]| SCP_SPMODE_CI;   if(value == 0)      scp_regs[SCP_SPMODE_OFFSET] = scp_regs[SCP_SPMODE_OFFSET]& ~SCP_SPMODE_CI;      os_leave_critical_section(flag);         return (0);   }           int scp_atom_get_loopback(unsigned long *p_value){   *p_value = scp_regs[SCP_SPMODE_OFFSET] & SCP_SPMODE_LOOP;   return(0); }   int scp_atom_set_loopback(unsigned long value){   ULONG flag;      if((value < 0) ||value > 1)    {      printk("scp_atom_set_clock_invert: invalid value specified\n");      return (-1);   }         flag = os_enter_critical_section();      if(value == 1)      scp_regs[SCP_SPMODE_OFFSET] = scp_regs[SCP_SPMODE_OFFSET]| SCP_SPMODE_LOOP;   if(value == 0)      scp_regs[SCP_SPMODE_OFFSET] = scp_regs[SCP_SPMODE_OFFSET]& ~SCP_SPMODE_LOOP;      os_leave_critical_section(flag);   return (0);   }          int scp_atom_check_port(){    unsigned long dwCount;    unsigned char btSCPStatus;            for (dwCount = 0; dwCount < 5; dwCount++)    {        btSCPStatus = scp_regs[SCP_STATUS_OFFSET];        if (btSCPStatus & 0x20)        {            os_delay(10000);        }        else         {            return SCP_READY;        }                 }    return SCP_BUSY;}unsigned char scp_atom_get_scp_reg (int regid){   unsigned char value;       switch(regid)   {      case SCP_SPMODE_OFFSET:         value = scp_regs[SCP_SPMODE_OFFSET];           break;      case SCP_RXDATA_OFFSET:         value = scp_regs[SCP_RXDATA_OFFSET];           break;      case SCP_TXDATA_OFFSET:         value = scp_regs[SCP_TXDATA_OFFSET];           break;      case SCP_SPCOM_OFFSET:         value = scp_regs[SCP_SPCOM_OFFSET];           break;      case SCP_STATUS_OFFSET:         value = scp_regs[SCP_STATUS_OFFSET];           break;      case SCP_CDM_OFFSET:         value = scp_regs[SCP_CDM_OFFSET];           break;      default:         printk("get_scp_reg: Invalid register id\n");         value = 0;   }      return value;}                              int scp_atom_set_scp_reg (int regid, unsigned char value){   int rc = 0;    ULONG flag;      flag = os_enter_critical_section();      switch(regid)   {      case SCP_SPMODE_OFFSET:         scp_regs[SCP_SPMODE_OFFSET] = value;           break;      case SCP_RXDATA_OFFSET:         scp_regs[SCP_RXDATA_OFFSET] = value;           break;      case SCP_TXDATA_OFFSET:         scp_regs[SCP_TXDATA_OFFSET] = value;           break;      case SCP_SPCOM_OFFSET:         scp_regs[SCP_SPCOM_OFFSET] = value;           break;      case SCP_STATUS_OFFSET:         scp_regs[SCP_STATUS_OFFSET] = value;           break;      case SCP_CDM_OFFSET:         scp_regs[SCP_CDM_OFFSET] = value;           break;      default:         printk("set_scp_reg: Invalid register id\n");         rc = -1;   }      os_leave_critical_section(flag);      return rc;}                              

⌨️ 快捷键说明

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