文章目录

  • 2.cpu_wtd_sysfs:
    • switchboard.c (fpga下i2c访问Switch CPLD1,Switch CPLD2 :CPLD, FPGA , QSFP)
  • script

2.cpu_wtd_sysfs:

switchboard.c (fpga下i2c访问Switch CPLD1,Switch CPLD2 :CPLD, FPGA , QSFP)

ONIE_ROOT=$(realpath $(dirname $0)/../../../)
MACHINE=$(basename $(dirname $(realpath $0)))
MACHINEROOT=$ONIE_ROOT/machine/huaqin
PARAMS=$*
PARAMS=${PARAMS:-help}
BUILD_IMAGE=$ONIE_ROOT/build/imagesif [[ $PARAMS =~ .*rmbuild.* ]]; thenecho "Delete all the build directories, which may require root permission"sudo rm -rf $ONIE_ROOT/buildexit
fimake -C $ONIE_ROOT/build-config -j64 MACHINEROOT=$MACHINEROOT MACHINE=$MACHINE $PARAMSif [[ $PARAMS =~ .*help.* ]]; thenecho "The following is the customized help of Huaqin : "echoecho "./build.sh clean   : Delete compiled image"echo "./build.sh rmbuild : Delete everything in the current build"
fiif [[ $PARAMS =~ .*all.* ]] || [[ $PARAMS =~ .*demo.* ]]; thenecho "Build images path: $BUILD_IMAGE"ls -l $BUILD_IMAGE/*${MACHINE}* | sed "s#$BUILD_IMAGE/##g"
fi
// cpld_h.c : lpc访问COMe/Baseboard CPLD : CPLD , LED , WatchDog
#include "common_hq.h"
#include <linux/kobject.h>
#define CPLD_DRIVER_NAME    "sys_cpld"
#define CPLD_DRIVER_VER     "0.0.1"
/*** CPLD register address for read and write.*/
/** Base CPLD:0xA100 ~ 0xA1DF* COMe CPLD:0xA1E0 ~ 0xA1FF* */
#define BASE_CPLD_ADDR      0xA100
#define COME_CPLD_ADDR      0xA1E0
#define VERSION_ADDR        0xA100#define BASE_PCB_VER_ADDR 0xA100
#define BASE_H_VER_ADDR     0xA101
#define BASE_M_VER_ADDR     0xA102
#define BASE_L_VER_ADDR     0xA103
#define BASE_SCRATCH_ADDR   0xA104#define COME_PCB_VER_ADDR 0xA1E0
#define COME_H_VER_ADDR     0xA1E1
#define COME_M_VER_ADDR     0xA1E2
#define COME_L_VER_ADDR     0xA1E3
#define COME_SCRATCH_ADDR   0xA1E4#define CPLD_REGISTER_SIZE    0xFF
#define CPLD_TOTAL_NUMBER   4/*watchdog*/
#define BASE_REG_ADDR_WD_EN         0xA190
#define BASE_REG_ADDR_WD_LTIME      0xA191
#define BASE_REG_ADDR_WD_HTIME      0xA192
#define BASE_REG_ADDR_WD_KICK       0xA193
#define BASE_REG_ADDR_WD_FOUN       0xA194
#define BASE_REG_ADDR_WD_STAE       0xA195  //status
#define BASE_REG_ADDR_WD_CLEAR      0xA196
#define BASE_REG_ADDR_WD_LTIMELEFT  0xA197
#define BASE_REG_ADDR_WD_HTIMELEFT  0xA198/*sysled*/
#define PSU_LED_ADDR     0xA140
#define SYS_LED_ADDR     0xA141
#define Alarm_LED_ADDR   0xA142
#define Fan_LED_ADDR     0xA143
#define BMC_LED_ADDR     0xA144enum
{DARK,GREEN,YELLOW,RED,BLUE,GREEN_LIGHT_FLASHING,YELLOW_LIGHT_FLASHING,RED_LIGHT_FLASHING,BLUE_LIGHT_FLASHING
};int set_bit_value(int value,int bit,int status);
int get_bit_value(int value,int bit);/******************************************************watchdog*******************************************************************/
ssize_t get_main_watchdog_identify(char *buf, size_t count)
{return sprintf(buf,"CPU_wdt\n");
}
EXPORT_SYMBOL(get_main_watchdog_identify);ssize_t get_main_watchdog_state(char *buf, size_t count)
{int data=inb(BASE_REG_ADDR_WD_EN);// printk(KERN_INFO "Baseboard CPLD addr:%.2x ,value: %.2x \n",BASE_REG_ADDR_WD_EN,inb(BASE_REG_ADDR_WD_EN));data = get_bit_value(data,0);data=sprintf(buf,"%x\n",data);  //转为16进制return data;
}
EXPORT_SYMBOL(get_main_watchdog_state);ssize_t get_main_watchdog_timeleft(char *buf, size_t count)
{int data_ligh = inb(BASE_REG_ADDR_WD_HTIMELEFT);// printk(KERN_INFO "Baseboard CPLD addr BASE_REG_ADDR_WD_HTIME :%.2x,value: %.2x \n",BASE_REG_ADDR_WD_HTIMELEFT,data_ligh);int data_low = inb(BASE_REG_ADDR_WD_LTIMELEFT);// printk(KERN_INFO "Baseboard CPLD addr BASE_REG_ADDR_WD_LTIME:%.2x,value: %.2x \n",BASE_REG_ADDR_WD_LTIMELEFT,data_low);int data=(data_ligh << 8 )+data_low;// printk(KERN_INFO "data :%.2x \n",data);data=data/1000;data=sprintf(buf,"%d\n",data);return data;
}
EXPORT_SYMBOL(get_main_watchdog_timeleft);ssize_t get_main_watchdog_timeout(char *buf, size_t count)
{int data_ligh = inb(BASE_REG_ADDR_WD_HTIME);// printk(KERN_INFO "Baseboard CPLD addr BASE_REG_ADDR_WD_HTIME :%.2x,value: %.2x \n",BASE_REG_ADDR_WD_HTIME,data_ligh);int data_low = inb(BASE_REG_ADDR_WD_LTIME);// printk(KERN_INFO "Baseboard CPLD addr BASE_REG_ADDR_WD_LTIME:%.2x,value: %.2x \n",BASE_REG_ADDR_WD_LTIME,data_low);int data=(data_ligh << 8 )+data_low;    //拼接// printk(KERN_INFO "data :%.2x \n",data);data=data/1000;   //毫秒变成秒data=sprintf(buf,"%d\n",data);return data;
}
EXPORT_SYMBOL(get_main_watchdog_timeout);int set_main_watchdog_timeout(int value)
{int value_ms = value * 1000 ;  //秒变成毫秒outb(value_ms&0xff ,BASE_REG_ADDR_WD_LTIME);  //outb写,取低八位outb((value_ms>>8)&0xff ,BASE_REG_ADDR_WD_HTIME);return;
}
EXPORT_SYMBOL(set_main_watchdog_timeout);static void feed_watchdog(void)
{int addr,value;addr = BASE_REG_ADDR_WD_KICK;value = inb(addr);  // 读value = set_bit_value(value,0,0);  // 设 0x7cvalue = set_bit_value(value,1,0);value = set_bit_value(value,2,1);value = set_bit_value(value,3,1);value = set_bit_value(value,4,1);value = set_bit_value(value,5,1);value = set_bit_value(value,6,1);value = set_bit_value(value,7,0);outb(value,addr);  // 写
}ssize_t get_main_watchdog_enable_status(char *buf, size_t count)
{int addr,value;addr = BASE_REG_ADDR_WD_EN;value=inb(addr);value = get_bit_value(value,0);   //看最后一位return sprintf(buf,"%02X\n", value);
}
EXPORT_SYMBOL(get_main_watchdog_enable_status);int set_main_watchdog_enable_status(int status)
{int addr,value;addr = BASE_REG_ADDR_WD_EN;value = inb(addr);switch(status){case 0:value = set_bit_value(value,0,0);outb(value,addr);break;case 1:value = set_bit_value(value,0,1);outb(value,addr);feed_watchdog();break;default:return -ENOSYS;}return status;
}
EXPORT_SYMBOL(set_main_watchdog_enable_status);/******************************************************************************new enable node***********************************/
ssize_t get_watchdog_enable_status(struct device *dev, struct device_attribute *attr, char *buf)
{size_t count=0;return get_main_watchdog_enable_status(buf, count);
}
static ssize_t set_watchdog_enable_status(struct device *dev, struct device_attribute *attr, const char *buf, size_t size)
{int value,rc = 0;rc = kstrtoint(buf,10,&value);if (rc != 0) {return size;}set_main_watchdog_enable_status(value);return size;
}
static struct device_attribute watchdog_enable_attr = __ATTR(enable, S_IRUGO | S_IWUSR,get_watchdog_enable_status,set_watchdog_enable_status);/****************************************************************************new timeout node*******************************/
ssize_t get_watchdog_timeout(struct device *dev, struct device_attribute *attr, char *buf)
{return get_main_watchdog_timeout(buf,NULL);
}
static ssize_t set_watchdog_timeout(struct device *dev, struct device_attribute *attr, const char *buf, size_t size)
{int value,rc = 0;rc = kstrtoint(buf,10,&value);if (rc != 0) {return size;}set_main_watchdog_timeout(value);return size;
}
static struct device_attribute watchdog_timeout_attr = __ATTR(timeout, S_IRUGO | S_IWUSR,get_watchdog_timeout,set_watchdog_timeout);/******************************************************************************new feed node*******************************/
static ssize_t hq_set_watchdog_feed(struct device *dev, struct device_attribute *attr, const char *buf, size_t size)
{int data,rc = 0;rc = kstrtoint(buf,16,&data);if (rc != 0) {return size;}// printk(KERN_INFO "Baseboard CPLD addr BASE_REG_ADDR_WD_KICK :%.2x,value: %.2x \n",BASE_REG_ADDR_WD_KICK,data);if(data==0x7c){outb(data,BASE_REG_ADDR_WD_KICK);// printk(KERN_INFO "Baseboard CPLD feed dog getreg value : %.2x \n",inb(BASE_REG_ADDR_WD_KICK));}else{return -EINVAL;}return size;
}
static struct device_attribute watchdog_feed_attt = __ATTR(feed, S_IRUGO | S_IWUSR, NULL, hq_set_watchdog_feed);/************************************************************************new strategy node*******************************/
ssize_t hq_get_watchdog_strategy(struct device *dev, struct device_attribute *attr, char *buf)
{return sprintf(buf,"%0.2x\n",inb(BASE_REG_ADDR_WD_FOUN));
}
static ssize_t hq_set_watchdog_strategy(struct device *dev, struct device_attribute *attr, const char *buf, size_t size)
{int data,rc = 0;rc = kstrtoint(buf,16,&data);if (rc != 0) {return size;}if((data==0x01) || (data ==0x02)){outb(data,BASE_REG_ADDR_WD_FOUN);// printk(KERN_INFO " hq_set_watchdog_strategy addr value : %.2x \n",inb(BASE_REG_ADDR_WD_FOUN));}else{return -EINVAL;}return size;
}
static struct device_attribute watchdog_strategy_attr = __ATTR(strategy, S_IRUGO | S_IWUSR,hq_get_watchdog_strategy ,hq_set_watchdog_strategy);/********************************************************************new timeout_counts node*******************************/
ssize_t hq_get_watchdog_timeout_times(struct device *dev, struct device_attribute *attr, char *buf)
{return sprintf(buf,"%d\n",inb(BASE_REG_ADDR_WD_STAE));
}
static struct device_attribute watchdog_timeout_counts_attr = __ATTR(timeout_counts, S_IWUSR|S_IRUGO,hq_get_watchdog_timeout_times, NULL);/********************************************************************new timeout_reset node*******************************/
static ssize_t hq_set_watchdog_timeout_reset(struct device *dev, struct device_attribute *attr, const char *buf, size_t size)
{int data,rc = 0;rc = kstrtoint(buf,16,&data);if (rc != 0) {return size;}if(data==1){outb(data,BASE_REG_ADDR_WD_KICK);}else{return -EINVAL;}return size;
}
static struct device_attribute watchdog_timeout_reset_attr = __ATTR(timeout_reset, S_IRUGO | S_IWUSR,NULL ,hq_set_watchdog_timeout_reset);static struct attribute *watchdog_dir_attrs[] = {&watchdog_enable_attr.attr,&watchdog_timeout_attr.attr,&watchdog_feed_attt.attr,&watchdog_strategy_attr.attr,&watchdog_timeout_counts_attr.attr,&watchdog_timeout_reset_attr.attr,NULL
};static struct attribute_group watchdog_attr_group = {   // 在下面cpld_hq_drv_probe函数里: kobject_create_and_add, sysfs_create_group.attrs = watchdog_dir_attrs,
};
/******************************************************watchdog end*********************************************************************************//******************************************************sysled begain*******************************************************************************/
int set_sysled_state(int status,char *names)
{int addr,value;if(strcmp(names,"PSU")==0){addr=PSU_LED_ADDR;}else if(strcmp(names,"SYS")==0){addr=SYS_LED_ADDR;}else if(strcmp(names,"Alarm")==0){addr=Alarm_LED_ADDR;}else if(strcmp(names,"Fan")==0){addr=Fan_LED_ADDR;}else if(strcmp(names,"BMC")==0){addr=BMC_LED_ADDR;}else{return -ENOSYS;}value=inb(addr);switch(status){case DARK:value=set_bit_value(value,6,1);value=set_bit_value(value,0,1);value=set_bit_value(value,1,0);outb(value,addr);// printk(KERN_INFO "Baseboard CPLD addr:%.2x ,value: %.2x \n",addr,inb(addr));break;case GREEN:value=set_bit_value(value,6,1);value=set_bit_value(value,4,0);value=set_bit_value(value,5,0);value=set_bit_value(value,1,0);value=set_bit_value(value,0,0);outb(value,addr);// printk(KERN_INFO "Baseboard CPLD addr:%.2x ,value: %.2x \n",addr,inb(addr));break;case YELLOW:value=set_bit_value(value,6,1);value=set_bit_value(value,4,1);value=set_bit_value(value,5,0);value=set_bit_value(value,1,0);value=set_bit_value(value,0,0);outb(value,addr);// printk(KERN_INFO "Baseboard CPLD addr:%.2x ,value: %.2x \n",addr,inb(addr));break; case RED:return -ENOSYS;case BLUE:return -ENOSYS;case GREEN_LIGHT_FLASHING:value=set_bit_value(value,6,1);value=set_bit_value(value,4,0);value=set_bit_value(value,5,0);value=set_bit_value(value,1,1);value=set_bit_value(value,0,0);outb(value,addr);// printk(KERN_INFO "Baseboard CPLD addr:%.2x ,value: %.2x \n",addr,inb(addr));break;case YELLOW_LIGHT_FLASHING:value=set_bit_value(value,6,1);value=set_bit_value(value,4,1);value=set_bit_value(value,5,0);value=set_bit_value(value,1,1);value=set_bit_value(value,0,0);outb(value,addr);// printk(KERN_INFO "Baseboard CPLD addr:%.2x ,value: %.2x \n",addr,inb(addr));break;case RED_LIGHT_FLASHING:return -ENOSYS;case BLUE_LIGHT_FLASHING:return -ENOSYS;default:return -ENOSYS;}return 1;
}
EXPORT_SYMBOL(set_sysled_state);ssize_t get_sysled_state(char *buf, size_t count,char *names)
{int addr,value;int len=-1;if(strcmp(names,"PSU")==0){addr=PSU_LED_ADDR;}else if(strcmp(names,"SYS")==0){addr=SYS_LED_ADDR;}else if(strcmp(names,"Alarm")==0){addr=Alarm_LED_ADDR;}else if(strcmp(names,"Fan")==0){addr=Fan_LED_ADDR;}else if(strcmp(names,"BMC")==0){addr=BMC_LED_ADDR;}else{return -ENOSYS;}value=inb(addr);if(get_bit_value(value,0)==1 && get_bit_value(value,1)==0){len=sprintf(buf,"dark\n");return len;}else if(get_bit_value(value,0)==0 && get_bit_value(value,1)==0){//buf chang liang 常亮if(get_bit_value(value,4)==0 && get_bit_value(value,5)==0){len=sprintf(buf,"green\n");return len;}else if(get_bit_value(value,4)==1 && get_bit_value(value,5)==0){len=sprintf(buf,"yellow\n");return len;}else{;}}else if(get_bit_value(value,0)==0 && get_bit_value(value,1)==1){//buf 闪烁if(get_bit_value(value,4)==0 && get_bit_value(value,5)==0){len=sprintf(buf,"green light flashing\n");return len;}else if(get_bit_value(value,4)==1 && get_bit_value(value,5)==0){len=sprintf(buf,"yellow light flashing\n");return len;}else{;}}else{return -ENOSYS;}
}
EXPORT_SYMBOL(get_sysled_state);int get_bit_value(int value,int bit)
{if(value<0 || value>0xff || bit<0 || bit>7){return -1;}int data ;data=value >> bit & 0x01;    // 右移bit位并取最后一位return data;
}int set_bit_value(int value,int bit,int status)
{if(value<0 || value>0xff || bit<0 || bit>7|| status<0 || status>1){return -1;}else{if(status==0)  //将1111 1111第二位(从0开始即第三位)置为0{value=(~(1<<bit)) & value;      //0000 0100 (1<<2)     1111 1011 & 1111 1111  =  1111 1011 (&:有0为0)return value;}else if(status==1)  //将0001 0001第二位(从0开始即第三位)置为1{value = (1<<bit) | value;       //0000 0100 (1<<2)      0000 0100 | 0001 0001  =  0001 0101 (|:有1为1)return value;}else{;}}
}
/*****************************************************sysled end*************************************************************************************//***********************************************CPLD begain*******************************************************************************************/
int get_board_cpld_number(void)
{/* add vendor codes here */return CPLD_TOTAL_NUMBER;
}
EXPORT_SYMBOL(get_board_cpld_number);/** demo_get_main_board_cpld_alias - Used to identify the location of cpld,* @cpld_index: start with 1* @buf: Data receiving buffer* @count: length of buf** This function returns the length of the filled buffer,* if not support this attributes filled "NA" to buf,* otherwise it returns a negative value on failed.*/
ssize_t get_board_cpld_alias(unsigned int cpld_index, char *buf, size_t count)
{/* add vendor codes here */int len = -1 ;switch(cpld_index){case 1 :len=sprintf(buf,"Base board CPLD\n");break ;case 2 :len=sprintf(buf,"Come CPLD\n");break ;default:len = -1 ;break;}return len;
}
EXPORT_SYMBOL(get_board_cpld_alias);/** demo_get_main_board_cpld_type - Used to get cpld model name* @cpld_index: start with 1* @buf: Data receiving buffer* @count: length of buf** This function returns the length of the filled buffer,* if not support this attributes filled "NA" to buf,* otherwise it returns a negative value on failed.*/
ssize_t get_board_cpld_type(unsigned int cpld_index, char *buf, size_t count)
{/* add vendor codes here */int len = -1 ;switch(cpld_index){case 1 :len=sprintf(buf,"LCMXO3LF-4300C-5BG400C CPLD\n");break ;case 2 :len=sprintf(buf,"LCMXO3LF-2100C-5BG400C CPLD\n");break ;default:len = -1 ;break;}return len;
}
EXPORT_SYMBOL(get_board_cpld_type);/** demo_get_main_board_cpld_firmware_version - Used to get cpld firmware version,* @cpld_index: start with 1* @buf: Data receiving buffer* @count: length of buf** This function returns the length of the filled buffer,* if not support this attributes filled "NA" to buf,* otherwise it returns a negative value on failed.*/
ssize_t get_board_cpld_firmware_version(unsigned int cpld_index, char *buf, size_t count)
{/* add vendor codes here */int len = -1; switch(cpld_index){case 1:printk(KERN_INFO "BASE CPLD H version:0x%2.2x\n", inb(BASE_H_VER_ADDR));printk(KERN_INFO "BASE CPLD M version:0x%2.2x\n", inb(BASE_M_VER_ADDR));printk(KERN_INFO "BASE CPLD L version:0x%2.2x\n", inb(BASE_L_VER_ADDR)); len = sprintf(buf,"%x.%x.%x\n", inb(BASE_H_VER_ADDR),inb(BASE_M_VER_ADDR),inb(BASE_L_VER_ADDR));break;case 2:printk(KERN_INFO "COME CPLD H version:0x%2.2x\n", inb(COME_H_VER_ADDR));printk(KERN_INFO "COME CPLD M version:0x%2.2x\n", inb(COME_M_VER_ADDR));printk(KERN_INFO "COME CPLD L version:0x%2.2x\n", inb(COME_L_VER_ADDR));len = sprintf(buf,"%x.%x.%x\n", inb(COME_H_VER_ADDR),inb(COME_M_VER_ADDR),inb(COME_L_VER_ADDR));   break;default:len = -1;break;}return len;
}
EXPORT_SYMBOL(get_board_cpld_firmware_version);/** demo_get_main_board_cpld_board_version - Used to get cpld board version,* @cpld_index: start with 1* @buf: Data receiving buffer* @count: length of buf** This function returns the length of the filled buffer,* if not support this attributes filled "NA" to buf,* otherwise it returns a negative value on failed.*/
ssize_t get_board_cpld_board_version(unsigned int cpld_index, char *buf, size_t count)
{/* add vendor codes here */int len = -1; switch(cpld_index){case 1:len = sprintf(buf,"%02X\n", inb(BASE_PCB_VER_ADDR));break;case 2:len = sprintf(buf,"%02X\n", inb(COME_PCB_VER_ADDR));break;default:len = -1;break;}return len;
}
EXPORT_SYMBOL(get_board_cpld_board_version);/** demo_get_main_board_cpld_test_reg - Used to test cpld register read* filled the value to buf, value is hexadecimal, start with 0x* @cpld_index: start with 1* @buf: Data receiving buffer* @count: length of buf** This function returns the length of the filled buffer,* if not support this attributes filled "NA" to buf,* otherwise it returns a negative value on failed.*/
ssize_t get_board_cpld_test_reg(unsigned int cpld_index, char *buf, size_t count)
{/* add vendor codes here */int len = -1 ;switch(cpld_index){case 1 :len=sprintf(buf,"%02x\n",inb(BASE_SCRATCH_ADDR));break ;case 2 :len=sprintf(buf,"%02x\n",inb(COME_SCRATCH_ADDR));break ;default:len = -1 ;break;}return len;
}
EXPORT_SYMBOL(get_board_cpld_test_reg);/** demo_set_main_board_cpld_test_reg - Used to test cpld register write* @cpld_index: start with 1* @value: value write to cpld** This function returns 0 on success,* otherwise it returns a negative value on failed.*/
int set_board_cpld_test_reg(unsigned int cpld_index, unsigned int value)
{/* add vendor codes here */int ret = -1 ;switch(cpld_index){case 1 :outb(value,BASE_SCRATCH_ADDR);ret = 1;break ;case 2 :outb(value,COME_SCRATCH_ADDR);ret = 1;break ;default: ret = -1 ;break;}return ret;
}
EXPORT_SYMBOL(set_board_cpld_test_reg);
/********************************************************CPLD end***********************************************************************/struct cpld_hq_data {struct mutex       cpld_lock;uint16_t           read_addr;uint16_t           base_addr;
};struct cpld_hq_data *cpld_data;static ssize_t get_cpld_reg_address(struct device *dev, struct device_attribute *attr, char *buf)
{int len = 0;// CPLD register is one bytemutex_lock(&cpld_data->cpld_lock);len = sprintf(buf, "0x%2.2x\n",inb(cpld_data->read_addr));mutex_unlock(&cpld_data->cpld_lock);return len;
}/*** Store the register address* @param  buf     address wanted to be read value of* @return         number of bytes stored, or an error code*/
static ssize_t set_cpld_reg_address(struct device *dev, struct device_attribute *devattr,const char *buf, size_t count)
{uint32_t addr;char *last;mutex_lock(&cpld_data->cpld_lock);addr = (uint32_t)strtoul(buf, &last, 16);if (addr == 0 && buf == last) {return -EINVAL;}cpld_data->read_addr = cpld_data->base_addr + addr;mutex_unlock(&cpld_data->cpld_lock);return count;
}static DEVICE_ATTR( getreg, 0600, get_cpld_reg_address, set_cpld_reg_address);static ssize_t setreg_store(struct device *dev, struct device_attribute *devattr,const char *buf, size_t count)
{// CPLD register is one byteuint16_t addr;uint8_t value;char *tok;char clone[count+1];char *pclone = clone;char *last;strcpy(clone, buf);mutex_lock(&cpld_data->cpld_lock);tok = strsep((char**)&pclone, " ");if(tok == NULL){mutex_unlock(&cpld_data->cpld_lock);return -EINVAL;}addr = (uint16_t)strtoul(tok, &last,16);if(addr == 0 && tok == last){mutex_unlock(&cpld_data->cpld_lock);return -EINVAL;}tok = strsep((char**)&pclone, " ");if(tok == NULL){mutex_unlock(&cpld_data->cpld_lock);return -EINVAL;}value = (uint8_t)strtoul(tok, &last,16);if(value == 0 && tok == last){mutex_unlock(&cpld_data->cpld_lock);return -EINVAL;}outb(value, cpld_data->base_addr + addr);mutex_unlock(&cpld_data->cpld_lock);return count;
}
//static DEVICE_ATTR_WO(setreg);
static DEVICE_ATTR( setreg, 0200, NULL , setreg_store);
/*** Read all CPLD register in binary mode.* @return number of byte read.*/
static ssize_t dump_read(struct file *filp, struct kobject *kobj,struct bin_attribute *attr, char *buf,loff_t off, size_t count)
{unsigned long i = 0;ssize_t status;mutex_lock(&cpld_data->cpld_lock);begin:if(i < count){buf[i++] = inb(VERSION_ADDR + off);off++;msleep(1);goto begin;}status = count;exit:mutex_unlock(&cpld_data->cpld_lock);return status;
}static BIN_ATTR_RO(dump, CPLD_REGISTER_SIZE);static struct attribute *cpld_hq_attrs[] = {&dev_attr_getreg.attr,&dev_attr_setreg.attr,NULL,
};static struct bin_attribute *cpld_hq_bin_attrs[] = {&bin_attr_dump,NULL,
};static struct attribute_group cpld_hq_attrs_group = {.attrs = cpld_hq_attrs,.bin_attrs = cpld_hq_bin_attrs,
};static struct resource cpld_hq_resources[] = {{.start  = 0xA100,.end    = 0xA1FF,.flags  = IORESOURCE_IO,},
};static void cpld_hq_dev_release( struct device * dev)
{return;
}static struct platform_device cpld_hq_dev = {.name           = CPLD_DRIVER_NAME,.id             = -1,.num_resources  = ARRAY_SIZE(cpld_hq_resources),.resource       = cpld_hq_resources,.dev = {.release = cpld_hq_dev_release,}
};static int cpld_hq_drv_remove(struct platform_device *pdev)
{sysfs_remove_group(&pdev->dev.kobj, &cpld_hq_attrs_group);return 0;
}static struct kobject *watchdog = NULL;
static int cpld_hq_drv_probe(struct platform_device *pdev)
{struct resource *resource;int err = 0;cpld_data = devm_kzalloc(&pdev->dev, sizeof(struct cpld_hq_data), GFP_KERNEL);if(!cpld_data)return -ENOMEM;mutex_init(&cpld_data->cpld_lock);cpld_data ->read_addr = VERSION_ADDR;cpld_data ->base_addr = BASE_CPLD_ADDR;resource = platform_get_resource(pdev, IORESOURCE_IO, 0);if(unlikely(!resource)){printk(KERN_ERR "Specified Resource Not Available...\n");return -ENODEV;}err = sysfs_create_group(&pdev->dev.kobj, &cpld_hq_attrs_group);if(err) {printk(KERN_ERR "Cannot create sysfs for system CPLD\n");return err;}printk(KERN_INFO "CPLD Probe driver");printk(KERN_INFO "BASE CPLD Address:ox%2.2x\n", BASE_CPLD_ADDR);printk(KERN_INFO "COMe CPLD Address:ox%2.2x\n", COME_CPLD_ADDR);printk(KERN_INFO "BASE CPLD PCB version:0x%2.2x\n", inb(BASE_PCB_VER_ADDR));printk(KERN_INFO "BASE CPLD H version:0x%2.2x\n", inb(BASE_H_VER_ADDR));printk(KERN_INFO "BASE CPLD M version:0x%2.2x\n", inb(BASE_M_VER_ADDR));printk(KERN_INFO "BASE CPLD L version:0x%2.2x\n", inb(BASE_L_VER_ADDR));printk(KERN_INFO "COME CPLD PCB version:0x%2.2x\n", inb(COME_PCB_VER_ADDR));printk(KERN_INFO "COME CPLD H version:0x%2.2x\n", inb(COME_H_VER_ADDR));printk(KERN_INFO "COME CPLD M version:0x%2.2x\n", inb(COME_M_VER_ADDR));printk(KERN_INFO "COME CPLD L version:0x%2.2x\n", inb(COME_L_VER_ADDR));   printk(KERN_INFO "GPIO base address:0x%x\n", inl(0x48));//watchdogwatchdog = kobject_create_and_add("watchdog",&pdev->dev.kobj);if (!watchdog){return -ENOMEM;}if(sysfs_create_group(watchdog,&watchdog_attr_group)){printk(KERN_INFO"watchdog_attr_group failed\n");return -1;}/*int ret;ret=watchdog_root_create();if (ret < 0) {WDT_ERR("watchdog create error.\n");return ret;}*/return 0;}static struct platform_driver cpld_hq_drv = {.probe = cpld_hq_drv_probe,.remove = __exit_p(cpld_hq_drv_remove),.driver = {.name = CPLD_DRIVER_NAME,},
};static int __init cpld_hq_init(void)
{/*Register Platform device and Platform Driver*/platform_device_register(&cpld_hq_dev);platform_driver_register(&cpld_hq_drv);printk(KERN_INFO "%s: version %s loaded successfully\n", CPLD_DRIVER_NAME, CPLD_DRIVER_VER);return 0;
}static void __exit cpld_hq_exit(void)
{/*Unregister Platform device and Platform Driver*/platform_driver_unregister(&cpld_hq_drv);platform_device_unregister(&cpld_hq_dev);printk(KERN_INFO "%s: unloaded successfully\n", CPLD_DRIVER_NAME);
}module_init(cpld_hq_init);
module_exit(cpld_hq_exit);MODULE_AUTHOR("Huaqin Technology Co.,Ltd.");
MODULE_DESCRIPTION("Hua Qin Common CPLD");
MODULE_VERSION(CPLD_DRIVER_VER);
MODULE_LICENSE("GPL");
#include "common_hq.h" //相当于复制进来static int demo_get_main_board_cpld_number(void)
{/* add vendor codes here */return get_board_cpld_number();
}static ssize_t demo_get_main_board_cpld_alias(unsigned int cpld_index, char *buf, size_t count)
{/* add vendor codes here */if((cpld_index == 1) || (cpld_index == 2)){return get_board_cpld_alias(cpld_index, buf, count);}else if((cpld_index == 3) || (cpld_index == 4)){return get_switch_board_cpld_alias(cpld_index, buf, count);}else{return -EINVAL;}
}

# 外层Makefile
PWD     = $(shell pwd)
SYSFS_OUT_PUT := $(PWD)/build
sysfs_out_put_dir := $(SYSFS_OUT_PUT)/S3IP_sysfs/
export sysfs_out_put_dir
# KERNEL_SRC=/lib/modules/$(shell uname -r)
KERNEL_SRC=/home_a/yutao/sysfs/my/header/usr/src/linux-headers-4.9.0-14-2-amd64
export KERNEL_SRCSYSFS_DRIVER_DIR = $(PWD)/s3ip_sysfs_frame
SWITCH_DRIVER_DIR = $(PWD)/demo_driver
HQ_DRIVER_DIR = $(PWD)/s3ip_hq_driver
KBUILD_EXTRA_SYMBOLS += $(HQ_DRIVER_DIR)/Module.symvers
KBUILD_EXTRA_SYMBOLS += $(SYSFS_DRIVER_DIR)/Module.symvers
KBUILD_EXTRA_SYMBOLS += $(SWITCH_DRIVER_DIR)/Module.symvers
export KBUILD_EXTRA_SYMBOLSall :$(MAKE) -C $(HQ_DRIVER_DIR)$(MAKE) -C $(SYSFS_DRIVER_DIR)$(MAKE) -C $(SWITCH_DRIVER_DIR)clean :-rm  -rf $(SYSFS_OUT_PUT)$(MAKE) -C $(HQ_DRIVER_DIR) clean$(MAKE) -C $(SYSFS_DRIVER_DIR) clean$(MAKE) -C $(SWITCH_DRIVER_DIR) cleaninstall:install -d $(DESTDIR)/lib/modules/s3ip/install -D $(sysfs_out_put_dir)/*.ko \$(DESTDIR)/lib/modules/s3ip/install -D scripts/s3ip_load.py \$(DESTDIR)/$(prefix)/bin/s3ip_load.pyinstall -D scripts/s3ip_sysfs_conf.json \$(DESTDIR)/etc/s3ip/s3ip_sysfs_conf.jsoninstall -D scripts/s3ip_sysfs_tool.sh \$(DESTDIR)/$(prefix)/bin/s3ip_sysfs_tool.shinstall -D scripts/s3ip-sysfs.service \$(DESTDIR)/etc/systemd/system/s3ip-sysfs.serviceuninstall:-rm -f $(DESTDIR)$(prefix)/bin/s3ip_load.py-rm -f $(DESTDIR)/lib/modules/s3ip/-rm -f $(DESTDIR)/etc/s3ip-rm -f $(DESTDIR)/$(prefix)/bin/s3ip_sysfs_tool.sh-rm -f $(DESTDIR)/etc/systemd/system/s3ip-sysfs.service
# 里层Makefile
PWD     = $(shell pwd)
MAKEFILE_FILE_PATH = $(abspath $(lastword $(MAKEFILE_LIST)))
DEV_SYSFS_HEADER_DIR = $(abspath $(MAKEFILE_FILE_PATH)/../../s3ip_sysfs_frame/include)
SWITCH_DVR_HEADER_DIR = $(abspath $(MAKEFILE_FILE_PATH)/../../demo_driver/include)
HQ_DVR_HEADER_DIR = $(abspath $(MAKEFILE_FILE_PATH)/../../s3ip_hq_driver/include)
EXTRA_CFLAGS:= -I$(M)/include
EXTRA_CFLAGS+= -I$(DEV_SYSFS_HEADER_DIR)
EXTRA_CFLAGS+= -I$(SWITCH_DVR_HEADER_DIR)
EXTRA_CFLAGS+= -I$(HQ_DVR_HEADER_DIR)
EXTRA_CFLAGS+= -Wallobj-m := cpld_hq.o
obj-m += fpga_i2c_adapter.o
obj-m += i2c-ocores.o
obj-m += mc24lc64t.o
obj-m += optoe.o
obj-m += switchboard.oall:$(MAKE) -C $(KERNEL_SRC) M=$(PWD) modules@if [ ! -d $(sysfs_out_put_dir) ]; then mkdir -p $(sysfs_out_put_dir) ;ficp -p  $(PWD)/*.ko $(sysfs_out_put_dir)
clean:rm -f $(PWD)/*.o $(PWD)/*.ko $(PWD)/*.mod.c $(PWD)/.*.cmd rm -f $(PWD)/Module.markers $(PWD)/Module.symvers $(PWD)/modules.order rm -rf $(PWD)/.tmp_versionsrm -rf $(PWD)/.cache.mkrm -rf $(PWD)/*.mod
#ifndef _COMMON_HQ_H_
#define _COMMON_HQ_H_#include <linux/slab.h>
#include <linux/interrupt.h>
#include <linux/module.h>
#include <linux/pci.h>
#include <linux/kernel.h>
#include <linux/stddef.h>
#include <linux/delay.h>
#include <linux/ioport.h>
#include <linux/init.h>
#include <linux/i2c.h>
#include <linux/acpi.h>
#include <linux/io.h>
#include <linux/dmi.h>
#include <linux/slab.h>
#include <linux/wait.h>
#include <linux/err.h>
#include <linux/kobject.h>
#include <linux/platform_device.h>
#include <linux/types.h>
#include <uapi/linux/stat.h>
#include <linux/string.h>
#include <linux/fs.h>
#include <linux/uaccess.h>
#include <linux/jiffies.h>
#include <linux/moduleparam.h>
#include <linux/platform_data/pca954x.h>
#include <linux/clk.h>
#include <linux/errno.h>
#include <linux/log2.h>
#include <linux/spinlock.h>extern int get_board_cpld_number(void);
extern ssize_t get_board_cpld_alias(unsigned int cpld_index, char *buf, size_t count);
extern ssize_t get_board_cpld_type(unsigned int cpld_index, char *buf, size_t count);
extern ssize_t get_board_cpld_firmware_version(unsigned int cpld_index, char *buf, size_t count);
extern ssize_t get_board_cpld_board_version(unsigned int cpld_index, char *buf, size_t count);
extern ssize_t get_board_cpld_test_reg(unsigned int cpld_index, char *buf, size_t count);
extern int set_board_cpld_test_reg(unsigned int cpld_index, unsigned int value);extern int get_board_fpga_number(void);
extern ssize_t get_board_fpga_alias(unsigned int fpga_index, char *buf, size_t count);
extern ssize_t get_board_fpga_type(unsigned int cpld_index, char *buf, size_t count);
extern ssize_t get_board_fpga_firmware_version(unsigned int cpld_index, char *buf, size_t count);
extern ssize_t get_board_fpga_board_version(unsigned int cpld_index, char *buf, size_t count);
extern ssize_t get_board_fpga_test_reg(unsigned int cpld_index, char *buf, size_t count);
extern int set_board_fpga_test_reg(unsigned int cpld_index, unsigned int value);extern ssize_t get_switch_board_cpld_alias(unsigned int cpld_index, char *buf, size_t count);
extern ssize_t get_switch_board_cpld_type(unsigned int cpld_index, char *buf, size_t count);
extern ssize_t get_switch_board_cpld_firmware_version(unsigned int cpld_index, char *buf, size_t count);
extern ssize_t get_switch_board_cpld_board_version(unsigned int cpld_index, char *buf, size_t count);
extern ssize_t get_switch_board_cpld_test_reg(unsigned int cpld_index, char *buf, size_t count);
extern ssize_t set_switch_board_cpld_test_reg(unsigned int cpld_index, unsigned int value);//QSFP
extern int get_main_eth_number(void);
extern ssize_t get_main_transceiver_power_on_status(char *buf, size_t count);
extern int set_main_transceiver_power_on_status(int status);
extern ssize_t get_main_eth_power_on_status(unsigned int eth_index, char *buf, size_t count);
extern int set_main_eth_power_on_status(unsigned int eth_index, int status);
extern ssize_t get_main_eth_tx_fault_status(unsigned int eth_index, char *buf, size_t count);
extern ssize_t get_main_eth_tx_disable_status(unsigned int eth_index, char *buf, size_t count);
extern int set_main_eth_tx_disable_status(unsigned int eth_index, int status);
extern ssize_t get_main_eth_present_status(unsigned int eth_index, char *buf, size_t count);
extern ssize_t get_main_eth_rx_los_status(unsigned int eth_index, char *buf, size_t count);
extern ssize_t get_main_eth_reset_status(unsigned int eth_index, char *buf, size_t count);
extern int set_main_eth_reset_status(unsigned int eth_index, int status);
extern ssize_t get_main_eth_low_power_mode_status(unsigned int eth_index, char *buf, size_t count);
extern ssize_t get_main_eth_interrupt_status(unsigned int eth_index, char *buf, size_t count);
extern int get_main_eth_eeprom_size(unsigned int eth_index);
extern ssize_t read_main_eth_eeprom_data(unsigned int eth_index, char *buf, loff_t offset, size_t count);
extern ssize_t write_main_eth_eeprom_data(unsigned int eth_index, char *buf, loff_t offset, size_t count);//sysled
extern int set_sysled_state(int status,char *names);
extern ssize_t get_sysled_state(char *buf, size_t count,char *names);//watchdog
extern ssize_t get_main_watchdog_identify(char *buf, size_t count);
extern ssize_t get_main_watchdog_state(char *buf, size_t count);
extern ssize_t get_main_watchdog_timeleft(char *buf, size_t count);
extern ssize_t get_main_watchdog_timeout(char *buf, size_t count);
extern int set_main_watchdog_timeout(int value);
extern ssize_t get_main_watchdog_enable_status(char *buf, size_t count);
extern int set_main_watchdog_enable_status(int value);#endif
cpld_hq.c
// cpld_hq.c:         lpc访问COMe/Baseboard CPLD :                   CPLD ,  LED ,  WatchDog
// switchboard.c:    fpga下i2c访问Switch CPLD1,Switch CPLD2 :       CPLD,   FPGA ,  QSFP#include "common_hq.h"
#include <linux/kobject.h>
#define CPLD_DRIVER_NAME    "sys_cpld"
#define CPLD_DRIVER_VER     "0.0.1"
/*** CPLD register address for read and write.*/
/** Base CPLD:0xA100 ~ 0xA1DF* COMe CPLD:0xA1E0 ~ 0xA1FF* */
#define BASE_CPLD_ADDR      0xA100
#define COME_CPLD_ADDR      0xA1E0
#define VERSION_ADDR        0xA100#define BASE_PCB_VER_ADDR 0xA100
#define BASE_H_VER_ADDR     0xA101
#define BASE_M_VER_ADDR     0xA102
#define BASE_L_VER_ADDR     0xA103
#define BASE_SCRATCH_ADDR   0xA104#define COME_PCB_VER_ADDR 0xA1E0
#define COME_H_VER_ADDR     0xA1E1
#define COME_M_VER_ADDR     0xA1E2
#define COME_L_VER_ADDR     0xA1E3
#define COME_SCRATCH_ADDR   0xA1E4#define CPLD_REGISTER_SIZE    0xFF
#define CPLD_TOTAL_NUMBER   4/*watchdog*/
#define BASE_REG_ADDR_WD_EN         0xA190
#define BASE_REG_ADDR_WD_LTIME      0xA191
#define BASE_REG_ADDR_WD_HTIME      0xA192
#define BASE_REG_ADDR_WD_KICK       0xA193
#define BASE_REG_ADDR_WD_FOUN       0xA194
#define BASE_REG_ADDR_WD_STAE       0xA195  //status
#define BASE_REG_ADDR_WD_CLEAR      0xA196
#define BASE_REG_ADDR_WD_LTIMELEFT  0xA197
#define BASE_REG_ADDR_WD_HTIMELEFT  0xA198/*sysled*/
#define PSU_LED_ADDR     0xA140
#define SYS_LED_ADDR     0xA141
#define Alarm_LED_ADDR   0xA142
#define Fan_LED_ADDR     0xA143
#define BMC_LED_ADDR     0xA144enum
{DARK,GREEN,YELLOW,RED,BLUE,GREEN_LIGHT_FLASHING,YELLOW_LIGHT_FLASHING,RED_LIGHT_FLASHING,BLUE_LIGHT_FLASHING
};int set_bit_value(int value,int bit,int status);
int get_bit_value(int value,int bit);/******************************************************watchdog*******************************************************************/
ssize_t get_main_watchdog_identify(char *buf, size_t count)
{return sprintf(buf,"CPU_wdt\n");
}
EXPORT_SYMBOL(get_main_watchdog_identify);ssize_t get_main_watchdog_state(char *buf, size_t count)
{int data=inb(BASE_REG_ADDR_WD_EN);// printk(KERN_INFO "Baseboard CPLD addr:%.2x ,value: %.2x \n",BASE_REG_ADDR_WD_EN,inb(BASE_REG_ADDR_WD_EN));data = get_bit_value(data,0);data=sprintf(buf,"%x\n",data);  //转为16进制return data;
}
EXPORT_SYMBOL(get_main_watchdog_state);ssize_t get_main_watchdog_timeleft(char *buf, size_t count)
{int data_ligh = inb(BASE_REG_ADDR_WD_HTIMELEFT);// printk(KERN_INFO "Baseboard CPLD addr BASE_REG_ADDR_WD_HTIME :%.2x,value: %.2x \n",BASE_REG_ADDR_WD_HTIMELEFT,data_ligh);int data_low = inb(BASE_REG_ADDR_WD_LTIMELEFT);// printk(KERN_INFO "Baseboard CPLD addr BASE_REG_ADDR_WD_LTIME:%.2x,value: %.2x \n",BASE_REG_ADDR_WD_LTIMELEFT,data_low);int data=(data_ligh << 8 )+data_low;// printk(KERN_INFO "data :%.2x \n",data);data=data/1000;data=sprintf(buf,"%d\n",data);return data;
}
EXPORT_SYMBOL(get_main_watchdog_timeleft);ssize_t get_main_watchdog_timeout(char *buf, size_t count)
{int data_ligh = inb(BASE_REG_ADDR_WD_HTIME);// printk(KERN_INFO "Baseboard CPLD addr BASE_REG_ADDR_WD_HTIME :%.2x,value: %.2x \n",BASE_REG_ADDR_WD_HTIME,data_ligh);int data_low = inb(BASE_REG_ADDR_WD_LTIME);// printk(KERN_INFO "Baseboard CPLD addr BASE_REG_ADDR_WD_LTIME:%.2x,value: %.2x \n",BASE_REG_ADDR_WD_LTIME,data_low);int data=(data_ligh << 8 )+data_low;    //拼接// printk(KERN_INFO "data :%.2x \n",data);data=data/1000;   //毫秒变成秒data=sprintf(buf,"%d\n",data);return data;
}
EXPORT_SYMBOL(get_main_watchdog_timeout);int set_main_watchdog_timeout(int value)
{int value_ms = value * 1000 ;  //秒变成毫秒outb(value_ms&0xff ,BASE_REG_ADDR_WD_LTIME);  //outb写,取低八位outb((value_ms>>8)&0xff ,BASE_REG_ADDR_WD_HTIME);return;
}
EXPORT_SYMBOL(set_main_watchdog_timeout);static void feed_watchdog(void)
{int addr,value;addr = BASE_REG_ADDR_WD_KICK;value = inb(addr);  // 读value = set_bit_value(value,0,0);  // 设 0x7cvalue = set_bit_value(value,1,0);value = set_bit_value(value,2,1);value = set_bit_value(value,3,1);value = set_bit_value(value,4,1);value = set_bit_value(value,5,1);value = set_bit_value(value,6,1);value = set_bit_value(value,7,0);outb(value,addr);  // 写
}ssize_t get_main_watchdog_enable_status(char *buf, size_t count)
{int addr,value;addr = BASE_REG_ADDR_WD_EN;value=inb(addr);value = get_bit_value(value,0);   //看最后一位return sprintf(buf,"%02X\n", value);
}
EXPORT_SYMBOL(get_main_watchdog_enable_status);int set_main_watchdog_enable_status(int status)
{int addr,value;addr = BASE_REG_ADDR_WD_EN;value = inb(addr);switch(status){case 0:value = set_bit_value(value,0,0);outb(value,addr);break;case 1:value = set_bit_value(value,0,1);outb(value,addr);feed_watchdog();break;default:return -ENOSYS;}return status;
}
EXPORT_SYMBOL(set_main_watchdog_enable_status);/******************************************************************************new enable node***********************************/
ssize_t get_watchdog_enable_status(struct device *dev, struct device_attribute *attr, char *buf)
{size_t count=0;return get_main_watchdog_enable_status(buf, count);
}
static ssize_t set_watchdog_enable_status(struct device *dev, struct device_attribute *attr, const char *buf, size_t size)
{int value,rc = 0;rc = kstrtoint(buf,10,&value);if (rc != 0) {return size;}set_main_watchdog_enable_status(value);return size;
}
static struct device_attribute watchdog_enable_attr = __ATTR(enable, S_IRUGO | S_IWUSR,get_watchdog_enable_status,set_watchdog_enable_status);/****************************************************************************new timeout node*******************************/
ssize_t get_watchdog_timeout(struct device *dev, struct device_attribute *attr, char *buf)
{return get_main_watchdog_timeout(buf,NULL);
}
static ssize_t set_watchdog_timeout(struct device *dev, struct device_attribute *attr, const char *buf, size_t size)
{int value,rc = 0;rc = kstrtoint(buf,10,&value);if (rc != 0) {return size;}set_main_watchdog_timeout(value);return size;
}
static struct device_attribute watchdog_timeout_attr = __ATTR(timeout, S_IRUGO | S_IWUSR,get_watchdog_timeout,set_watchdog_timeout);/******************************************************************************new feed node*******************************/
static ssize_t hq_set_watchdog_feed(struct device *dev, struct device_attribute *attr, const char *buf, size_t size)
{int data,rc = 0;rc = kstrtoint(buf,16,&data);if (rc != 0) {return size;}// printk(KERN_INFO "Baseboard CPLD addr BASE_REG_ADDR_WD_KICK :%.2x,value: %.2x \n",BASE_REG_ADDR_WD_KICK,data);if(data==0x7c){outb(data,BASE_REG_ADDR_WD_KICK);// printk(KERN_INFO "Baseboard CPLD feed dog getreg value : %.2x \n",inb(BASE_REG_ADDR_WD_KICK));}else{return -EINVAL;}return size;
}
static struct device_attribute watchdog_feed_attt = __ATTR(feed, S_IRUGO | S_IWUSR, NULL, hq_set_watchdog_feed);/************************************************************************new strategy node*******************************/
ssize_t hq_get_watchdog_strategy(struct device *dev, struct device_attribute *attr, char *buf)
{return sprintf(buf,"%0.2x\n",inb(BASE_REG_ADDR_WD_FOUN));
}
static ssize_t hq_set_watchdog_strategy(struct device *dev, struct device_attribute *attr, const char *buf, size_t size)
{int data,rc = 0;rc = kstrtoint(buf,16,&data);if (rc != 0) {return size;}if((data==0x01) || (data ==0x02)){outb(data,BASE_REG_ADDR_WD_FOUN);// printk(KERN_INFO " hq_set_watchdog_strategy addr value : %.2x \n",inb(BASE_REG_ADDR_WD_FOUN));}else{return -EINVAL;}return size;
}
static struct device_attribute watchdog_strategy_attr = __ATTR(strategy, S_IRUGO | S_IWUSR,hq_get_watchdog_strategy ,hq_set_watchdog_strategy);/********************************************************************new timeout_counts node*******************************/
ssize_t hq_get_watchdog_timeout_times(struct device *dev, struct device_attribute *attr, char *buf)
{return sprintf(buf,"%d\n",inb(BASE_REG_ADDR_WD_STAE));
}
static struct device_attribute watchdog_timeout_counts_attr = __ATTR(timeout_counts, S_IWUSR|S_IRUGO,hq_get_watchdog_timeout_times, NULL);/********************************************************************new timeout_reset node*******************************/
static ssize_t hq_set_watchdog_timeout_reset(struct device *dev, struct device_attribute *attr, const char *buf, size_t size)
{int data,rc = 0;rc = kstrtoint(buf,16,&data);if (rc != 0) {return size;}if(data==1){outb(data,BASE_REG_ADDR_WD_KICK);}else{return -EINVAL;}return size;
}
static struct device_attribute watchdog_timeout_reset_attr = __ATTR(timeout_reset, S_IRUGO | S_IWUSR,NULL ,hq_set_watchdog_timeout_reset);static struct attribute *watchdog_dir_attrs[] = {&watchdog_enable_attr.attr,&watchdog_timeout_attr.attr,&watchdog_feed_attt.attr,&watchdog_strategy_attr.attr,&watchdog_timeout_counts_attr.attr,&watchdog_timeout_reset_attr.attr,NULL
};static struct attribute_group watchdog_attr_group = {   // 在下面cpld_hq_drv_probe函数里: kobject_create_and_add, sysfs_create_group.attrs = watchdog_dir_attrs,
};
/******************************************************watchdog end*********************************************************************************//******************************************************sysled begain*******************************************************************************/
int set_sysled_state(int status,char *names)
{int addr,value;if(strcmp(names,"PSU")==0){addr=PSU_LED_ADDR;}else if(strcmp(names,"SYS")==0){addr=SYS_LED_ADDR;}else if(strcmp(names,"Alarm")==0){addr=Alarm_LED_ADDR;}else if(strcmp(names,"Fan")==0){addr=Fan_LED_ADDR;}else if(strcmp(names,"BMC")==0){addr=BMC_LED_ADDR;}else{return -ENOSYS;}value=inb(addr);switch(status){case DARK:value=set_bit_value(value,6,1);value=set_bit_value(value,0,1);value=set_bit_value(value,1,0);outb(value,addr);// printk(KERN_INFO "Baseboard CPLD addr:%.2x ,value: %.2x \n",addr,inb(addr));break;case GREEN:value=set_bit_value(value,6,1);value=set_bit_value(value,4,0);value=set_bit_value(value,5,0);value=set_bit_value(value,1,0);value=set_bit_value(value,0,0);outb(value,addr);// printk(KERN_INFO "Baseboard CPLD addr:%.2x ,value: %.2x \n",addr,inb(addr));break;case YELLOW:value=set_bit_value(value,6,1);value=set_bit_value(value,4,1);value=set_bit_value(value,5,0);value=set_bit_value(value,1,0);value=set_bit_value(value,0,0);outb(value,addr);// printk(KERN_INFO "Baseboard CPLD addr:%.2x ,value: %.2x \n",addr,inb(addr));break; case RED:return -ENOSYS;case BLUE:return -ENOSYS;case GREEN_LIGHT_FLASHING:value=set_bit_value(value,6,1);value=set_bit_value(value,4,0);value=set_bit_value(value,5,0);value=set_bit_value(value,1,1);value=set_bit_value(value,0,0);outb(value,addr);// printk(KERN_INFO "Baseboard CPLD addr:%.2x ,value: %.2x \n",addr,inb(addr));break;case YELLOW_LIGHT_FLASHING:value=set_bit_value(value,6,1);value=set_bit_value(value,4,1);value=set_bit_value(value,5,0);value=set_bit_value(value,1,1);value=set_bit_value(value,0,0);outb(value,addr);// printk(KERN_INFO "Baseboard CPLD addr:%.2x ,value: %.2x \n",addr,inb(addr));break;case RED_LIGHT_FLASHING:return -ENOSYS;case BLUE_LIGHT_FLASHING:return -ENOSYS;default:return -ENOSYS;}return 1;
}
EXPORT_SYMBOL(set_sysled_state);ssize_t get_sysled_state(char *buf, size_t count,char *names)
{int addr,value;int len=-1;if(strcmp(names,"PSU")==0){addr=PSU_LED_ADDR;}else if(strcmp(names,"SYS")==0){addr=SYS_LED_ADDR;}else if(strcmp(names,"Alarm")==0){addr=Alarm_LED_ADDR;}else if(strcmp(names,"Fan")==0){addr=Fan_LED_ADDR;}else if(strcmp(names,"BMC")==0){addr=BMC_LED_ADDR;}else{return -ENOSYS;}value=inb(addr);if(get_bit_value(value,0)==1 && get_bit_value(value,1)==0){len=sprintf(buf,"dark\n");return len;}else if(get_bit_value(value,0)==0 && get_bit_value(value,1)==0){//buf chang liang 常亮if(get_bit_value(value,4)==0 && get_bit_value(value,5)==0){len=sprintf(buf,"green\n");return len;}else if(get_bit_value(value,4)==1 && get_bit_value(value,5)==0){len=sprintf(buf,"yellow\n");return len;}else{;}}else if(get_bit_value(value,0)==0 && get_bit_value(value,1)==1){//buf 闪烁if(get_bit_value(value,4)==0 && get_bit_value(value,5)==0){len=sprintf(buf,"green light flashing\n");return len;}else if(get_bit_value(value,4)==1 && get_bit_value(value,5)==0){len=sprintf(buf,"yellow light flashing\n");return len;}else{;}}else{return -ENOSYS;}
}
EXPORT_SYMBOL(get_sysled_state);int get_bit_value(int value,int bit)
{if(value<0 || value>0xff || bit<0 || bit>7){return -1;}int data ;data=value >> bit & 0x01;    // 右移bit位并取最后一位return data;
}int set_bit_value(int value,int bit,int status)
{if(value<0 || value>0xff || bit<0 || bit>7|| status<0 || status>1){return -1;}else{if(status==0)  //将1111 1111第二位(从0开始即第三位)置为0{value=(~(1<<bit)) & value;      //0000 0100 (1<<2)     1111 1011 & 1111 1111  =  1111 1011 (&:有0为0)return value;}else if(status==1)  //将0001 0001第二位(从0开始即第三位)置为1{value = (1<<bit) | value;       //0000 0100 (1<<2)      0000 0100 | 0001 0001  =  0001 0101 (|:有1为1)return value;}else{;}}
}
/*****************************************************sysled end*************************************************************************************//***********************************************CPLD begain*******************************************************************************************/
int get_board_cpld_number(void)
{/* add vendor codes here */return CPLD_TOTAL_NUMBER;
}
EXPORT_SYMBOL(get_board_cpld_number);/** demo_get_main_board_cpld_alias - Used to identify the location of cpld,* @cpld_index: start with 1* @buf: Data receiving buffer* @count: length of buf** This function returns the length of the filled buffer,* if not support this attributes filled "NA" to buf,* otherwise it returns a negative value on failed.*/
ssize_t get_board_cpld_alias(unsigned int cpld_index, char *buf, size_t count)
{/* add vendor codes here */int len = -1 ;switch(cpld_index){case 1 :len=sprintf(buf,"Base board CPLD\n");break ;case 2 :len=sprintf(buf,"Come CPLD\n");break ;default:len = -1 ;break;}return len;
}
EXPORT_SYMBOL(get_board_cpld_alias);/** demo_get_main_board_cpld_type - Used to get cpld model name* @cpld_index: start with 1* @buf: Data receiving buffer* @count: length of buf** This function returns the length of the filled buffer,* if not support this attributes filled "NA" to buf,* otherwise it returns a negative value on failed.*/
ssize_t get_board_cpld_type(unsigned int cpld_index, char *buf, size_t count)
{/* add vendor codes here */int len = -1 ;switch(cpld_index){case 1 :len=sprintf(buf,"LCMXO3LF-4300C-5BG400C CPLD\n");break ;case 2 :len=sprintf(buf,"LCMXO3LF-2100C-5BG400C CPLD\n");break ;default:len = -1 ;break;}return len;
}
EXPORT_SYMBOL(get_board_cpld_type);/** demo_get_main_board_cpld_firmware_version - Used to get cpld firmware version,* @cpld_index: start with 1* @buf: Data receiving buffer* @count: length of buf** This function returns the length of the filled buffer,* if not support this attributes filled "NA" to buf,* otherwise it returns a negative value on failed.*/
ssize_t get_board_cpld_firmware_version(unsigned int cpld_index, char *buf, size_t count)
{/* add vendor codes here */int len = -1; switch(cpld_index){case 1:printk(KERN_INFO "BASE CPLD H version:0x%2.2x\n", inb(BASE_H_VER_ADDR));printk(KERN_INFO "BASE CPLD M version:0x%2.2x\n", inb(BASE_M_VER_ADDR));printk(KERN_INFO "BASE CPLD L version:0x%2.2x\n", inb(BASE_L_VER_ADDR)); len = sprintf(buf,"%x.%x.%x\n", inb(BASE_H_VER_ADDR),inb(BASE_M_VER_ADDR),inb(BASE_L_VER_ADDR));break;case 2:printk(KERN_INFO "COME CPLD H version:0x%2.2x\n", inb(COME_H_VER_ADDR));printk(KERN_INFO "COME CPLD M version:0x%2.2x\n", inb(COME_M_VER_ADDR));printk(KERN_INFO "COME CPLD L version:0x%2.2x\n", inb(COME_L_VER_ADDR));len = sprintf(buf,"%x.%x.%x\n", inb(COME_H_VER_ADDR),inb(COME_M_VER_ADDR),inb(COME_L_VER_ADDR));   break;default:len = -1;break;}return len;
}
EXPORT_SYMBOL(get_board_cpld_firmware_version);/** demo_get_main_board_cpld_board_version - Used to get cpld board version,* @cpld_index: start with 1* @buf: Data receiving buffer* @count: length of buf** This function returns the length of the filled buffer,* if not support this attributes filled "NA" to buf,* otherwise it returns a negative value on failed.*/
ssize_t get_board_cpld_board_version(unsigned int cpld_index, char *buf, size_t count)
{/* add vendor codes here */int len = -1; switch(cpld_index){case 1:len = sprintf(buf,"%02X\n", inb(BASE_PCB_VER_ADDR));break;case 2:len = sprintf(buf,"%02X\n", inb(COME_PCB_VER_ADDR));break;default:len = -1;break;}return len;
}
EXPORT_SYMBOL(get_board_cpld_board_version);/** demo_get_main_board_cpld_test_reg - Used to test cpld register read* filled the value to buf, value is hexadecimal, start with 0x* @cpld_index: start with 1* @buf: Data receiving buffer* @count: length of buf** This function returns the length of the filled buffer,* if not support this attributes filled "NA" to buf,* otherwise it returns a negative value on failed.*/
ssize_t get_board_cpld_test_reg(unsigned int cpld_index, char *buf, size_t count)
{/* add vendor codes here */int len = -1 ;switch(cpld_index){case 1 :len=sprintf(buf,"%02x\n",inb(BASE_SCRATCH_ADDR));break ;case 2 :len=sprintf(buf,"%02x\n",inb(COME_SCRATCH_ADDR));break ;default:len = -1 ;break;}return len;
}
EXPORT_SYMBOL(get_board_cpld_test_reg);/** demo_set_main_board_cpld_test_reg - Used to test cpld register write* @cpld_index: start with 1* @value: value write to cpld** This function returns 0 on success,* otherwise it returns a negative value on failed.*/
int set_board_cpld_test_reg(unsigned int cpld_index, unsigned int value)
{/* add vendor codes here */int ret = -1 ;switch(cpld_index){case 1 :outb(value,BASE_SCRATCH_ADDR);ret = 1;break ;case 2 :outb(value,COME_SCRATCH_ADDR);ret = 1;break ;default: ret = -1 ;break;}return ret;
}
EXPORT_SYMBOL(set_board_cpld_test_reg);
/********************************************************CPLD end***********************************************************************/struct cpld_hq_data {struct mutex       cpld_lock;uint16_t           read_addr;uint16_t           base_addr;
};struct cpld_hq_data *cpld_data;static ssize_t get_cpld_reg_address(struct device *dev, struct device_attribute *attr, char *buf)
{int len = 0;// CPLD register is one bytemutex_lock(&cpld_data->cpld_lock);len = sprintf(buf, "0x%2.2x\n",inb(cpld_data->read_addr));mutex_unlock(&cpld_data->cpld_lock);return len;
}/*** Store the register address* @param  buf     address wanted to be read value of* @return         number of bytes stored, or an error code*/
static ssize_t set_cpld_reg_address(struct device *dev, struct device_attribute *devattr,const char *buf, size_t count)
{uint32_t addr;char *last;mutex_lock(&cpld_data->cpld_lock);addr = (uint32_t)strtoul(buf, &last, 16);if (addr == 0 && buf == last) {return -EINVAL;}cpld_data->read_addr = cpld_data->base_addr + addr;mutex_unlock(&cpld_data->cpld_lock);return count;
}static DEVICE_ATTR( getreg, 0600, get_cpld_reg_address, set_cpld_reg_address);static ssize_t setreg_store(struct device *dev, struct device_attribute *devattr,const char *buf, size_t count)
{// CPLD register is one byteuint16_t addr;uint8_t value;char *tok;char clone[count+1];char *pclone = clone;char *last;strcpy(clone, buf);mutex_lock(&cpld_data->cpld_lock);tok = strsep((char**)&pclone, " ");if(tok == NULL){mutex_unlock(&cpld_data->cpld_lock);return -EINVAL;}addr = (uint16_t)strtoul(tok, &last,16);if(addr == 0 && tok == last){mutex_unlock(&cpld_data->cpld_lock);return -EINVAL;}tok = strsep((char**)&pclone, " ");if(tok == NULL){mutex_unlock(&cpld_data->cpld_lock);return -EINVAL;}value = (uint8_t)strtoul(tok, &last,16);if(value == 0 && tok == last){mutex_unlock(&cpld_data->cpld_lock);return -EINVAL;}outb(value, cpld_data->base_addr + addr);mutex_unlock(&cpld_data->cpld_lock);return count;
}
//static DEVICE_ATTR_WO(setreg);
static DEVICE_ATTR( setreg, 0200, NULL , setreg_store);
/*** Read all CPLD register in binary mode.* @return number of byte read.*/
static ssize_t dump_read(struct file *filp, struct kobject *kobj,struct bin_attribute *attr, char *buf,loff_t off, size_t count)
{unsigned long i = 0;ssize_t status;mutex_lock(&cpld_data->cpld_lock);begin:if(i < count){buf[i++] = inb(VERSION_ADDR + off);off++;msleep(1);goto begin;}status = count;exit:mutex_unlock(&cpld_data->cpld_lock);return status;
}static BIN_ATTR_RO(dump, CPLD_REGISTER_SIZE);static struct attribute *cpld_hq_attrs[] = {&dev_attr_getreg.attr,&dev_attr_setreg.attr,NULL,
};static struct bin_attribute *cpld_hq_bin_attrs[] = {&bin_attr_dump,NULL,
};static struct attribute_group cpld_hq_attrs_group = {.attrs = cpld_hq_attrs,.bin_attrs = cpld_hq_bin_attrs,
};static struct resource cpld_hq_resources[] = {{.start  = 0xA100,.end    = 0xA1FF,.flags  = IORESOURCE_IO,},
};static void cpld_hq_dev_release( struct device * dev)
{return;
}static struct platform_device cpld_hq_dev = {.name           = CPLD_DRIVER_NAME,.id             = -1,.num_resources  = ARRAY_SIZE(cpld_hq_resources),.resource       = cpld_hq_resources,.dev = {.release = cpld_hq_dev_release,}
};static int cpld_hq_drv_remove(struct platform_device *pdev)
{sysfs_remove_group(&pdev->dev.kobj, &cpld_hq_attrs_group);return 0;
}static struct kobject *watchdog = NULL;
static int cpld_hq_drv_probe(struct platform_device *pdev)
{struct resource *resource;int err = 0;cpld_data = devm_kzalloc(&pdev->dev, sizeof(struct cpld_hq_data), GFP_KERNEL);if(!cpld_data)return -ENOMEM;mutex_init(&cpld_data->cpld_lock);cpld_data ->read_addr = VERSION_ADDR;cpld_data ->base_addr = BASE_CPLD_ADDR;resource = platform_get_resource(pdev, IORESOURCE_IO, 0);if(unlikely(!resource)){printk(KERN_ERR "Specified Resource Not Available...\n");return -ENODEV;}err = sysfs_create_group(&pdev->dev.kobj, &cpld_hq_attrs_group);if(err) {printk(KERN_ERR "Cannot create sysfs for system CPLD\n");return err;}printk(KERN_INFO "CPLD Probe driver");printk(KERN_INFO "BASE CPLD Address:ox%2.2x\n", BASE_CPLD_ADDR);printk(KERN_INFO "COMe CPLD Address:ox%2.2x\n", COME_CPLD_ADDR);printk(KERN_INFO "BASE CPLD PCB version:0x%2.2x\n", inb(BASE_PCB_VER_ADDR));printk(KERN_INFO "BASE CPLD H version:0x%2.2x\n", inb(BASE_H_VER_ADDR));printk(KERN_INFO "BASE CPLD M version:0x%2.2x\n", inb(BASE_M_VER_ADDR));printk(KERN_INFO "BASE CPLD L version:0x%2.2x\n", inb(BASE_L_VER_ADDR));printk(KERN_INFO "COME CPLD PCB version:0x%2.2x\n", inb(COME_PCB_VER_ADDR));printk(KERN_INFO "COME CPLD H version:0x%2.2x\n", inb(COME_H_VER_ADDR));printk(KERN_INFO "COME CPLD M version:0x%2.2x\n", inb(COME_M_VER_ADDR));printk(KERN_INFO "COME CPLD L version:0x%2.2x\n", inb(COME_L_VER_ADDR));   printk(KERN_INFO "GPIO base address:0x%x\n", inl(0x48));//watchdogwatchdog = kobject_create_and_add("watchdog",&pdev->dev.kobj);if (!watchdog){return -ENOMEM;}if(sysfs_create_group(watchdog,&watchdog_attr_group)){printk(KERN_INFO"watchdog_attr_group failed\n");return -1;}/*int ret;ret=watchdog_root_create();if (ret < 0) {WDT_ERR("watchdog create error.\n");return ret;}*/return 0;}static struct platform_driver cpld_hq_drv = {.probe = cpld_hq_drv_probe,.remove = __exit_p(cpld_hq_drv_remove),.driver = {.name = CPLD_DRIVER_NAME,},
};static int __init cpld_hq_init(void)
{/*Register Platform device and Platform Driver*/platform_device_register(&cpld_hq_dev);platform_driver_register(&cpld_hq_drv);printk(KERN_INFO "%s: version %s loaded successfully\n", CPLD_DRIVER_NAME, CPLD_DRIVER_VER);return 0;
}static void __exit cpld_hq_exit(void)
{/*Unregister Platform device and Platform Driver*/platform_driver_unregister(&cpld_hq_drv);platform_device_unregister(&cpld_hq_dev);printk(KERN_INFO "%s: unloaded successfully\n", CPLD_DRIVER_NAME);
}module_init(cpld_hq_init);
module_exit(cpld_hq_exit);MODULE_AUTHOR("Huaqin Technology Co.,Ltd.");
MODULE_DESCRIPTION("Hua Qin Common CPLD");
MODULE_VERSION(CPLD_DRIVER_VER);
MODULE_LICENSE("GPL");
// i2c-ocores.c
struct ocores_i2c {int prescale; //属性
};static ssize_t i2c_clk_show(struct device *dev, struct device_attribute *attr, char *buf)
{struct ocores_i2c *i2c_test = dev_get_drvdata(dev);if(i2c_test->prescale==0xe0){return sprintf(buf,"100\n");}else if(i2c_test->prescale==0x71){return sprintf(buf,"200\n");}else if(i2c_test->prescale==0x36){return sprintf(buf,"400\n");}else{return sprintf(buf,"please echo 100/200/400 hz bus clk \n");}
}static ssize_t i2c_clk_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t size)
{ssize_t status;int value;struct ocores_i2c *i2c_test = dev_get_drvdata(dev);i2c_test->prescale=0xe6;u8 ctrl = oc_getreg(i2c_test, OCI2C_CONTROL);// printk(KERN_INFO "into set                            \n");status = kstrtoint(buf,10,&value);if(value==100){i2c_test->prescale=0xe0;// dev_info(dev, "----------------------------100-------------------------\n");}else if(value==200){i2c_test->prescale=0x71;// dev_info(dev, "----------------------------200-------------------------\n");}else if(value==400){i2c_test->prescale=0x36;// dev_info(dev, "----------------------------400-------------------------\n");}else{dev_info(dev, "This I2C bus frequency cannot be provided\n");return -EINVAL;}//printk(KERN_INFO "out   if   code                          \n");oc_setreg(i2c_test, OCI2C_PRELOW, i2c_test->prescale & 0xff);oc_setreg(i2c_test, OCI2C_PREHIGH, i2c_test->prescale >> 8);oc_setreg(i2c_test, OCI2C_CMD, OCI2C_CMD_IACK);  /* Init the device */oc_setreg(i2c_test, OCI2C_CONTROL, ctrl | OCI2C_CTRL_EN);u8 data = oc_getreg(i2c_test,OCI2C_PRELOW);printk(KERN_INFO "OCI2C_PRELOW:  %x\n",data);u8 data1 =oc_getreg(i2c_test,OCI2C_PREHIGH);printk(KERN_INFO "OCI2C_PREHIGH:  %x\n",data1);u8 data2 = oc_getreg(i2c_test,OCI2C_CMD);printk(KERN_INFO "OCI2C_CMD:  %x\n",data2);u8 data3 =oc_getreg(i2c_test,OCI2C_CONTROL);printk(KERN_INFO "OCI2C_CONTROL:  %x\n",data3);// dev_info(dev, "Address: %lx\n", i2c_test->base);// dev_info(dev, "Prescale: %d\n", i2c_test->prescale);// printk(KERN_INFO "                   end                          \n");return size;
}
struct device_attribute i2c_ocores_test = __ATTR(i2c_bus_freq, 0600, i2c_clk_show,i2c_clk_store);static struct attribute *i2c_ocores_dttrs[] = {&i2c_ocores_test.attr,NULL,
};static struct attribute_group ocores_attr_test = {  // ocores_attr_test 在ocores_i2c_probe函数里即845行添加节点.attrs = i2c_ocores_dttrs ,
};static void i2c_ocores_dev_release(struct device * dev)
{return;
}/******************create /sys/bus/platform/device/ocores-i2c-hq.1***********************/
static struct platform_device i2c_ocores_dev = {.name           = "ocores-i2c-hq",.id             = -1,.num_resources  = 0,.dev = {.release = i2c_ocores_dev_release,}
};static int ocores_i2c_probe(struct platform_device *pdev)
{struct ocores_i2c_platform_data *pdata;struct resource *res;struct ocores_i2c *i2c_test;int irq;int ret;int i;i2c_test = devm_kzalloc(&pdev->dev, sizeof(*i2c_test), GFP_KERNEL);if (!i2c_test)return -ENOMEM;dev_set_drvdata(&pdev->dev, i2c_test); //spin_lock_init(&i2c_test->process_lock);res = platform_get_resource(pdev, IORESOURCE_MEM, 0);if (res) {i2c_test->base = devm_ioremap_resource(&pdev->dev, res);printk(KERN_INFO "---------------------------------------------ocore Address-------------------------------: %lx\n", i2c_test->base);// dev_info(pdev,"ocore Address: %lx\n", i2c_test->base);if (IS_ERR(i2c_test->base))return PTR_ERR(i2c_test->base);/*******************************************create i2c_bus_freq****************************************/int err = 0;err = sysfs_create_group(&pdev->dev.kobj,&ocores_attr_test); if(err){printk(KERN_ERR "Cannot create sysfs for system I2C\n");return err;}return 0;err_clk:clk_disable_unprepare(i2c_test->clk);return ret;
}

script

s3ip_sysfs_tool.sh#! /bin/bash
s3ip_link_hq(){sudo rm -rf /usr/local/s3ip/sudo mkdir /usr/local/s3ipln -s /sys/bus/i2c/devices/i2c-0/0-0056/eeprom /usr/local/s3ip/syseeprommkdir /usr/local/s3ip/transceiverfor((i=1;i<=32;i++));domkdir /usr/local/s3ip/transceiver/eth$i# /sys_switch (s3ip_load.py和.json) 软连接到 /usr/local 再软连接到 /sys/s3ipln -s /sys/bus/i2c/devices/$((36+i))-0050/eeprom /usr/local/s3ip/transceiver/eth$i/eepromln -s /sys/s3ip/transceiver/eth$i/interrupt /usr/local/s3ip/transceiver/eth$i/interruptln -s /sys/s3ip/transceiver/eth$i/power_on /usr/local/s3ip/transceiver/eth$i/power_onln -s /sys/s3ip/transceiver/eth$i/reset /usr/local/s3ip/transceiver/eth$i/resetln -s /sys/s3ip/transceiver/eth$i/tx_disable /usr/local/s3ip/transceiver/eth$i/tx_disableln -s /sys/s3ip/transceiver/eth$i/low_power_mode /usr/local/s3ip/transceiver/eth$i/low_power_modeln -s /sys/s3ip/transceiver/eth$i/present /usr/local/s3ip/transceiver/eth$i/presentln -s /sys/s3ip/transceiver/eth$i/rx_los /usr/local/s3ip/transceiver/eth$i/rx_losln -s /sys/s3ip/transceiver/eth$i/tx_fault //usr/local/s3ip/transceiver/eth$i/tx_faultdone
}s3ip_start(){sudo insmod /lib/modules/s3ip/s3ip_sysfs.kosudo insmod /lib/modules/s3ip/syseeprom_device_driver.kosudo insmod /lib/modules/s3ip/fan_device_driver.kosudo insmod /lib/modules/s3ip/cpld_device_driver.kosudo insmod /lib/modules/s3ip/sysled_device_driver.kosudo insmod /lib/modules/s3ip/psu_device_driver.kosudo insmod /lib/modules/s3ip/transceiver_device_driver.kosudo insmod /lib/modules/s3ip/temp_sensor_device_driver.kosudo insmod /lib/modules/s3ip/vol_sensor_device_driver.kosudo insmod /lib/modules/s3ip/fpga_device_driver.kosudo insmod /lib/modules/s3ip/watchdog_device_driver.kosudo insmod /lib/modules/s3ip/curr_sensor_device_driver.kosudo insmod /lib/modules/s3ip/slot_device_driver.kos3ip_link_hqsudo rm -rf /sys_switchsudo /usr/bin/s3ip_load.pyecho "s3ip service start"
}
s3ip_stop(){sudo rmmod slot_device_driversudo rmmod curr_sensor_device_driversudo rmmod watchdog_device_driversudo rmmod fpga_device_driversudo rmmod vol_sensor_device_driversudo rmmod temp_sensor_device_driversudo rmmod transceiver_device_driversudo rmmod psu_device_driversudo rmmod sysled_device_driversudo rmmod cpld_device_driversudo rmmod fan_device_driversudo rmmod syseeprom_device_driversudo rmmod s3ip_sysfssudo rm -rf /sys_switchecho "s3ip service stop"}case "$1" instart)s3ip_start;;stop)s3ip_stop;;status)sudo tree -l /sys_switch;;restart)s3ip_stops3ip_start;;   *)echo "Usage: $0 {start|stop|status|restart}"exit 1
esac
exit 

【C3】cpu_wtd_sysfs相关推荐

  1. 5050: 【C3】【穷举】买零食

    题目描述 小Ho很喜欢在课间去小卖部买零食.然而不幸的是,这个学期他又有在一教的课,而一教的小卖部姐姐以冷若冰霜著称.第一次去一教小卖部买零食的时候,小Ho由于不懂事买了好一大堆东西,被小卖部姐姐给了 ...

  2. 【CS224W】(task3)NetworkX工具包实践(地铁系统 | 城市交通)

    note networkx中的节点可以为任意可哈希的对象,比如字符串.图像.XML对象,甚至另一个Graph.自定义的节点对象.通过这种方式可以自由灵活地构建:图为节点.文件为节点.函数为节点,等灵活 ...

  3. 【FPGA】Buffer专题介绍(一)

    目录 背景 BUFG BUFGCE BUFGCE_1 BUFGMUX and BUFGMUX_1 BUFGP BUFH BUFIO2 BUFIO2FB 背景 在数据手册 Spartan-6 Libra ...

  4. 掌握 Linux 调试技术【转】

    转自:https://www.ibm.com/developerworks/cn/linux/sdk/l-debug/index.html 您可以用各种方法来监控运行着的用户空间程序:可以为其运行调试 ...

  5. 【运筹学】单纯形法总结 ( 单纯形法原理 | 单纯形法流程 | 单纯形表 | 计算检验数 | 最优解判定 | 入基变量 | 出基变量 | 方程组同解变换 ) ★★★

    文章目录 一.单纯形法原理 二.单纯形法流程 三.单纯形法案例一 1.线性规划示例 2.转化标准形式 3.查找初始基可行解 4.初始基可行解的最优解判定 5.第一次迭代 : 入基与出基变量选择 6.第 ...

  6. 【数据挖掘】数据挖掘总结 ( K-Means 聚类算法 | 二维数据的 K-Means 聚类 ) ★

    文章目录 一. K-Means 聚类算法流程 二. 二维数据的 K-Means 聚类 1. 第一次迭代 2. 第二次迭代 参考博客 : [数据挖掘]聚类算法 简介 ( 基于划分的聚类方法 | 基于层次 ...

  7. 【数据挖掘】关联规则挖掘 Apriori 算法 ( Apriori 算法过程 | Apriori 算法示例 )

    文章目录 一. Apriori 算法过程 二. Apriori 算法示例 参考博客 : [数据挖掘]关联规则挖掘 Apriori 算法 ( 关联规则简介 | 数据集 与 事物 Transaction ...

  8. 【运筹学】线性规划 单纯形法 阶段总结 ( 初始基可行解 | 判定最优解 | 迭代 | 得到最优解 | 全流程详细解析 ) ★

    文章目录 一.线性规划示例 二.转化标准形式 三.查找初始基可行解 四.初始基可行解的最优解判定 五.第一次迭代 : 入基与出基变量选择 六.第一次迭代 : 方程组同解变换 七.第一次迭代 : 生成新 ...

  9. 【运筹学】线性规划数学模型 ( 单纯形法 | 第一次迭代 | 方程组同解变换 | 计算新单纯形表 | 计算检验数 | 入基变量选择 | 出基变量选择 )

    文章目录 一.初始基可行解后第一次迭代 二.迭代后新的单纯形表 三.方程组同解变换 四.生成新的单纯形表 五.解出基可行解 六.计算检验数 σj\sigma_jσj​ 并选择入基变量 七.计算 θ\t ...

最新文章

  1. RF MEMS开关时代将开启?
  2. redis配置文件redis.conf参数说明
  3. 升降压斩波电路matlab,升降压斩波电路matlab仿真.doc
  4. iphone android 开发指南 http://mobile.tutsplus.com
  5. android版本更新提示安装失败,android4.4.2系统更新后总是安装失败
  6. [ASP.net]TreeView(1)(一次性递归所有节点)
  7. Sqlite数据库相关
  8. 作为一个web开发人员,哪些技术细节是在发布站点前你需要考虑到的
  9. 英语中十二个月名称的由来
  10. linux sigprocmask函数理解
  11. java 数组合并_数组与链表
  12. mysql 5.6 没死_MySQL 5.6不删空用户的影响
  13. Dynamics 365-关于Solution的那些事(二)
  14. 分布式系统架构的基本原则和实践
  15. pythonpdf使用教程_Python基础学习教程:Python玩转PDF各种骚操作大全
  16. 关于jesd204B调试总结
  17. Phoenix踩坑填坑记录
  18. 最好的Linux文件管理器,适用于 Linux 用户的 10 款优秀且免费的文件管理器
  19. miniGUI-4.0.2 交叉编译
  20. 【linux系统(ubuntu16.04)】文件权限数字777,440含义解读(精华帖)

热门文章

  1. 天若有情天不老,人若有心人不走
  2. 怀念到哭泣、再美也伤
  3. python opencv 通过hsv阈值法扣取药盒 并矫正
  4. 2022-2028全球及中国食品加工用酶行业研究及十四五规划分析报告
  5. 203、商城业务-商品详情-环境搭建
  6. win7计算机窗口像xp,windows7界面突然变成xp老版本怎么回事?win7界面突然变成老版本的解决方法...
  7. 第一次有人把 5G 讲的这么简单明了
  8. 7-209 sdut-C语言实验-数位数7-210 sdut-C语言实验-小树快长高
  9. 恩智浦+飞思卡尔后你需要知道的十件事
  10. 基于C语言在8×8点阵实现9到0倒计时牌显示