Browse Source

IPMC IPMB ok

zhangbo 5 years ago
parent
commit
7395ae73b9

BIN
app/UpdateFirmware/updateFW_app


BIN
app/bmc/bmc_app


+ 49 - 12
app/bmc/ipmb/IPMBIfc.c

@@ -29,6 +29,13 @@
 #include "com_IPMI_SDR.h"
 #include "com_IPMI_Storage.h"
 #include "SDR.h"
+#include <sys/syscall.h> /*此头必须带上*/
+
+pid_t gettid()
+{
+        return syscall(SYS_gettid); /*这才是内涵*/
+}
+
 
 //static int sendIPMBPkt(uint32_t ipmb_bus, uint8_t* i2c_send_buf, uint8_t size);
 static uint8_t ValidateIPMBChkSums ( uint8_t* Data, uint8_t Size);
@@ -39,7 +46,7 @@ static void* RecvIPMBPkt (void *pArg);
 int gFd_PrimaryIpmbIfcQ, gFd_PrimaryIpmbResQ;
 int gFd_SecondaryIpmbIfcQ, gFd_SecondaryIpmbResQ;
 int gFd_Primary,  gFd_Secondary;
-
+pthread_mutex_t primary_mutex, secondary_mutex;
 /*!
     \brief      IPMB Task. Generating primary_IPMB task and secondary_IPMB task in this task.
     \param:		0: primary ipmb, 1: secondary ipmb
@@ -57,6 +64,7 @@ void *IPMBIfcTask(void *Param)
     int 	fd_IpmbIfcQ, fd_IpmbResQ;
     uint8_t ipmbSelect = *(uint8_t*)Param;
     int RetVal;
+    pthread_mutex_t *pMutex;
     
     //printf("ipmbSelect: %d\n", ipmbSelect);
     //Primary IPMB
@@ -67,6 +75,7 @@ void *IPMBIfcTask(void *Param)
 		strcpy(IPMB_RES_Q, PRIMARY_IPMB_RES_Q);	
 		sprintf(dev_name, "/dev/i2c%d", g_BMCInfo.IpmiConfig.PrimaryIPMBBus);
 		OwnerAddr	=	g_BMCInfo.IpmiConfig.PrimaryIPMBAddr;
+        pMutex = &primary_mutex;
 	}
 	//Secondary IPMB
 	else if((ipmbSelect == 1) && g_BMCInfo.IpmiConfig.SecondaryIPMBSupport)
@@ -76,6 +85,7 @@ void *IPMBIfcTask(void *Param)
 		strcpy(IPMB_RES_Q, SECONDARY_IPMB_RES_Q);
 		sprintf(dev_name, "/dev/i2c%d", g_BMCInfo.IpmiConfig.SecondaryIPMBBus);
 		OwnerAddr	=	g_BMCInfo.IpmiConfig.SecondaryIPMBAddr;
+        pMutex = &secondary_mutex;
 	}
 	else
 	{
@@ -140,6 +150,8 @@ void *IPMBIfcTask(void *Param)
     	gFd_Secondary 	=	fd_IpmbDev;
     }
 
+    pthread_mutex_init(pMutex, NULL);
+
     /*Create a thread to recv IPMB Pkt */
 	gThreadIndex++;	
     if(0 != pthread_create(&gThreadIDs[gThreadIndex],NULL,RecvIPMBPkt,Param))
@@ -262,16 +274,27 @@ ProcessIPMBReq ( MsgPkt_T* pReq)
     /* Send the response */
 	if(pReq->Channel == PRIMARY_IPMB_CHANNEL)
 	{
-		RetVal = stm32_i2c_master_write(gFd_Primary, ResPkt.Data[0], &ResPkt.Data[1], ResPkt.Size);
+        pthread_mutex_lock(&primary_mutex);
+		RetVal = stm32_i2c_master_write(gFd_Primary, ResPkt.Data[0], &ResPkt.Data[1], ResPkt.Size-1);
+        pthread_mutex_unlock(&primary_mutex);
+        printf("PriTx: ");
 	}
 	else if(pReq->Channel == SECONDARY_IPMB_CHANNEL)
 	{
-		RetVal = stm32_i2c_master_write(gFd_Secondary, ResPkt.Data[0], &ResPkt.Data[1], ResPkt.Size);
+        pthread_mutex_lock(&secondary_mutex);
+		RetVal = stm32_i2c_master_write(gFd_Secondary, ResPkt.Data[0], &ResPkt.Data[1], ResPkt.Size-1);
+        pthread_mutex_unlock(&secondary_mutex);
+        printf("SecTx: ");
 	}
 	else
 	{
 		printf("IPMBIfc.c: IPMB channel error. %#x\r\n", pReq->Channel);
 	}
+
+    int i;
+    for(i=0;i<ResPkt.Size;i++)
+        printf("%#x ", ResPkt.Data[i]);
+    printf("\n");
 	
     if (0 != RetVal)
     {
@@ -372,9 +395,11 @@ static void* RecvIPMBPkt (void *Param)
     int IPMBSlaveFd;
     int retval;
     uint8_t ipmbSelect = *(uint8_t*)Param;
+    int i;
 
     prctl(PR_SET_NAME, __FUNCTION__, 0, 0, 0);
     int curThreadIndex = 0;
+    pthread_mutex_t *pMutex;
 
     memset(&IPMBReqPkt,0,sizeof(MsgPkt_T));
     if(0 == ipmbSelect)
@@ -383,6 +408,8 @@ static void* RecvIPMBPkt (void *Param)
         IPMBReqPkt.Data [0] = g_BMCInfo.IpmiConfig.PrimaryIPMBAddr;
         IPMBReqPkt.Channel = PRIMARY_IPMB_CHANNEL;
         IPMBSlaveFd = gFd_Primary;
+        pMutex = &primary_mutex;
+        printf("Primary: %p\n", RecvIPMBPkt);
     }
     else if(1 == ipmbSelect)
     {
@@ -390,17 +417,34 @@ static void* RecvIPMBPkt (void *Param)
         IPMBReqPkt.Data [0] = g_BMCInfo.IpmiConfig.SecondaryIPMBAddr;
         IPMBReqPkt.Channel = SECONDARY_IPMB_CHANNEL;
         IPMBSlaveFd = gFd_Secondary;
+        pMutex = &secondary_mutex;
+        printf("Secondary: %p\n", RecvIPMBPkt);
     }
 
+
+
     /* Loop forever */
     while (1)
     {
+        //printf("ppid: %d, pid: %d, tid: %d, i: %d, ipmbSelect: %d\n", getppid(), getpid(), gettid(), i++, ipmbSelect);
+        pthread_mutex_lock(pMutex);
+        pthread_mutex_unlock(pMutex);
         retval = stm32_i2c_slave_recv(IPMBSlaveFd, &IPMBReqPkt.Data[1]);
         if( retval > 5)
         {
             IPMBReqPkt.Param    = PARAM_REQUEST;
             IPMBReqPkt.Size     = retval + 1;       /* +1 to include BMC Slave address */
 
+            int cnt;
+            if(0 == ipmbSelect)
+                printf("\nPriRx: ");
+            else
+                printf("\nSecRx: ");
+
+            for(cnt=0;cnt < IPMBReqPkt.Size; cnt++)
+                printf("%#x ", IPMBReqPkt.Data[cnt]);
+            printf("\n");
+
             /* Post the IPMB Request message to IPMBIfc Queue */
             if(ipmbSelect == 0)
             {
@@ -416,17 +460,10 @@ static void* RecvIPMBPkt (void *Param)
                     printf ("IPMBIfc.c : Error posting message to IPMBIfc_Q\n");
                 }
             }
-        }
 
-        int cnt;
-        if(0 == ipmbSelect)
-        	printf("---> Primary IPMB Recv: ");
-        else
-        	printf("---> Secondary IPMB Recv: ");
+        }
 
-    	for(cnt=0;cnt < IPMBReqPkt.Size; cnt++)
-        	printf("%#x ", IPMBReqPkt.Data[cnt]);
-        printf("\n");
+       
 	}
     return (void*)-1;
 }

+ 74 - 15
app/bmc/main.c

@@ -9,7 +9,7 @@
 #include <sys/prctl.h>
 #include <semaphore.h>
 #include <pthread.h>
-
+#include <fcntl.h>
 
 #include "com_BmcType.h"
 #include "com_IPMIDefs.h"
@@ -28,6 +28,7 @@
 #include "CM_LIB.h"
 #include "stm32f429xx.h"
 #include "com_gpio.h"
+#include "hal_interface_api.h"
 
 
 /* gloabl varible */
@@ -35,7 +36,12 @@ BMCInfo_t 	g_BMCInfo;
 pthread_t 	gThreadIDs[256];
 uint8_t		gThreadIndex = 0;
 
+//void *test_thread(void *var);
+//uint8_t test_flag = 0;
+//pthread_mutex_t mutex;
+
 
+static int tmp_fd;
 void main(void)
 {
 	// printf("---> log1\n");
@@ -128,19 +134,20 @@ void main(void)
         printf("%s: Create LANIfcTask thread failed!\n", __FUNCTION__);
     }
 
-	// /* Create IPMB interface */
-	// uint8_t primaryIpmbSelect = 0;	//primary
-	// gThreadIndex++;
-	// if(0 != pthread_create(&gThreadIDs[gThreadIndex],NULL,IPMBIfcTask,&primaryIpmbSelect))
- //  {
- //      printf("%s: Create LANIfcTask thread failed!\n", __FUNCTION__);
- //  }
- //  uint8_t secondaryIpmbSelect = 1;	//secondary
- //  gThreadIndex++;
- //       if(0 != pthread_create(&gThreadIDs[gThreadIndex],NULL,IPMBIfcTask,&secondaryIpmbSelect))
- //  {
- //      printf("%s: Create LANIfcTask thread failed!\n", __FUNCTION__);
- //  }
+	/* Create IPMB interface */
+	uint8_t primaryIpmbSelect = 0;	//primary
+	gThreadIndex++;
+	if(0 != pthread_create(&gThreadIDs[gThreadIndex],NULL,IPMBIfcTask,&primaryIpmbSelect))
+  {
+      printf("%s: Create LANIfcTask thread failed!\n", __FUNCTION__);
+  }
+
+  uint8_t secondaryIpmbSelect = 1;	//secondary
+  gThreadIndex++;
+  if(0 != pthread_create(&gThreadIDs[gThreadIndex],NULL,IPMBIfcTask,&secondaryIpmbSelect))
+  {
+      printf("%s: Create LANIfcTask thread failed!\n", __FUNCTION__);
+  }
 
 
 	/* Create Update FPGA thread */
@@ -151,9 +158,61 @@ void main(void)
 
 	/* Create UDS interface */
 
+    // pthread_mutex_init(&mutex,NULL);
+    // tmp_fd = open("/dev/i2c2", O_RDWR);;
+    // uint8_t buf[7] = {0x20, 0xb8, 0x8, 0x20, 0x4, 0x1, 0xdb };
+    // gThreadIndex++;
+    // pthread_create(&gThreadIDs[gThreadIndex],NULL,test_thread,NULL);
 	while(1)
 	{
-		sleep(100);
+		// if(test_flag)
+		// {
+		// 	test_flag = 0;
+
+		// 	pthread_mutex_lock(&mutex);
+		// 	if(0 != stm32_i2c_master_write(tmp_fd, buf[0], &buf[1], 6))
+		// 	{
+		// 		printf("---> Send ipmb error!\n");
+		// 	}
+		// 	else
+		// 		printf("---> send ipmb ok\n");
+		// 	pthread_mutex_unlock(&mutex);
+		// }	
+		sleep(1);
 		//printf("Hello...\n");
 	}
 }
+
+// void *test_thread(void *var)
+// {
+// 	uint8_t len, i;
+// 	uint8_t recvBuf[100];
+// 	printf("---> test_thread start...\n");
+// 	stm32_i2c_set_addr(tmp_fd, 0x44);
+// 	uint8_t buf[7] = {0x20, 0xb8, 0x8, 0x20, 0x4, 0x1, 0xdb };
+// 	while(1)
+// 	{
+// 		pthread_mutex_lock(&mutex);
+// 		pthread_mutex_unlock(&mutex);
+// 		len = 0;
+//     	len = stm32_i2c_slave_recv(tmp_fd, recvBuf);
+//     	if(len > 0)
+//     	{
+// 	    	printf("Recv: ");
+// 	    	for(i=0;i<len; i++)
+// 	    		printf("%#x ", recvBuf[i]);
+// 	    	printf("\n");
+
+// 	    	test_flag = 1;
+// 	    	//sleep(1);
+// 	  //   	if(0 != stm32_i2c_master_write(tmp_fd, buf[0], &buf[1], 6))
+// 			// {
+// 			// 	printf("---> Send ipmb error!\n");
+// 			// }
+// 			// else
+// 			// 	printf("---> send ipmb ok\n");
+// 		}
+// 	}
+
+
+// }

+ 2 - 2
app/bmc/main.h

@@ -42,8 +42,8 @@
 //IPMB
 #define PRIMARY_IPMB_BUS			2	// /dev/i2c2
 #define SECONDARY_IPMB_BUS			1	// /dev/i2c1
-#define PRIMARY_IPMB_ADDR			0x20
-#define SECONDARY_IPMB_ADDR			0x20
+#define PRIMARY_IPMB_ADDR			0x44
+#define SECONDARY_IPMB_ADDR			0x44
 
 //RACK-ID
 #define RACKID0_PORT	GPIOI

+ 10 - 2
app/bmc/msghndlr/OemSMMCmds/OemSMMCmds.c

@@ -39,7 +39,11 @@ int  SMMExample_1h(uint8_t* pReq, uint8_t ReqLen,  uint8_t* pRes)
 {
 	*pRes= CC_NORMAL;
 	printf("SMMExample_1h\n" );
-	return 	1;
+	pRes[1] = 0x11;
+	pRes[2] = 0x12;
+	pRes[3] = 0x13;
+	pRes[4] = 0x14;
+	return 	5;
 }
 
 
@@ -47,7 +51,11 @@ int SMMExample_2h( uint8_t* pReq, uint8_t ReqLen,  uint8_t* pRes)
 {
 	*pRes= CC_NORMAL;
 	printf("SMMExample_2h\n" );
-	return 1;
+	pRes[1] = 0x21;
+	pRes[2] = 0x22;
+	pRes[3] = 0x23;
+	pRes[4] = 0x24;
+	return 5;
 
 }
 

+ 1 - 0
app/bmc/msghndlr/PDKCmds.c

@@ -79,6 +79,7 @@ const CmdHndlrMap_T	g_Oem_Config_CmdHndlr [] =
 /*Netfn - OEM cmd */
 const CmdHndlrMap_T	g_Oem_CmdHndlr [] =	//jimbo add
 {
+    { CMD_EXAMPLE_0h,     PRIV_USER,       SMMExample_0h,      0xff,     0xAAAA,    0xFFFF },
     { CMD_EXAMPLE_1h,     PRIV_USER,       SMMExample_1h,      0xff,     0xAAAA,	0xFFFF },
     { CMD_EXAMPLE_2h,     PRIV_USER,       SMMExample_2h,      0xff,     0xAAAA,	0xFFFF },
     { CMD_EXAMPLE_3h,     PRIV_USER,       SMMExample_3h,      0xff,     0xAAAA,	0xFFFF },

+ 3 - 3
app/bmc/msghndlr/Storage/SDRDevice/SDR.c

@@ -221,9 +221,9 @@ int GetSDR ( uint8_t* pReq, uint8_t ReqLen,  uint8_t* pRes)
 
     curchannel = pthread_getspecific(g_tls.CurChannel); 
     /* Check for Max Request Bytes */
-    if (((pGetSDRReq->Size > MAX_SDR_LEN) && \
-        ( g_BMCInfo.IpmiConfig.PrimaryIPMBSupport == 0x01 && PRIMARY_IPMB_CHANNEL == (*curchannel & 0xF)) 
-        || (g_BMCInfo.IpmiConfig.SecondaryIPMBSupport == 0x01 && SECONDARY_IPMB_CHANNEL == (*curchannel & 0xF)))\
+    if (((pGetSDRReq->Size > MAX_SDR_LEN) && 
+        (( g_BMCInfo.IpmiConfig.PrimaryIPMBSupport == 0x01 && PRIMARY_IPMB_CHANNEL == (*curchannel & 0xF)) 
+        || (g_BMCInfo.IpmiConfig.SecondaryIPMBSupport == 0x01 && SECONDARY_IPMB_CHANNEL == (*curchannel & 0xF))))
         || (pGetSDRReq->Size > SDRLen) || (pGetSDRReq->Offset > SDRLen) 
         || (pGetSDRReq->Size > (SDRLen-pGetSDRReq->Offset)))
     {

BIN
app/driver/I2C/i2c.ko


+ 51 - 34
app/driver/I2C/i2c_main.c

@@ -37,8 +37,10 @@
 static uint8_t i2c_rcv_buf[100];
 static uint8_t i2c_rcv_size;
 
-static DECLARE_WAIT_QUEUE_HEAD(wq);
-static volatile int ev_press = 0;
+static DECLARE_WAIT_QUEUE_HEAD(wq_1);
+static DECLARE_WAIT_QUEUE_HEAD(wq_2);
+static DECLARE_WAIT_QUEUE_HEAD(wq_3);
+static volatile int ev_press_1 = 0, ev_press_2 = 0, ev_press_3 = 0;
 
 
 struct i2c_device {
@@ -171,6 +173,7 @@ irqreturn_t i2cErrIRQHandler(int irqno, void *dev_id)
 		printk("i2c3 Error, restart...\n");
 		break;
 	default: 
+		printk("Unknow irqno! %#x\n", irqno);
 		return IRQ_HANDLED;
 	}
 
@@ -194,6 +197,8 @@ irqreturn_t i2cEvIRQHandler(int irqno, void *dev_id)
 	uint32_t sr1itflags;   
 	uint32_t itsources;    
 	uint32_t CurrentMode;  
+	wait_queue_head_t *pwq = NULL;
+	int *pev_press = NULL;
 
 //	memcpy(h12c, &I2cHandle, sizeof(I2C_HandleTypeDef));
 
@@ -201,12 +206,18 @@ irqreturn_t i2cEvIRQHandler(int irqno, void *dev_id)
 	{
 	case I2C1_EV_IRQn:
 		hi2c.Instance = I2C1;
+		pwq = &wq_1;
+		pev_press = &ev_press_1;
 		break;
 	case I2C2_EV_IRQn:
 		hi2c.Instance = I2C2;
+		pwq = &wq_2;
+		pev_press = &ev_press_2;
 		break;
 	case I2C3_EV_IRQn:
 		hi2c.Instance = I2C3;
+		pwq = &wq_3;
+		pev_press = &ev_press_3;
 		break;
 	default: 
 		return IRQ_HANDLED;
@@ -218,7 +229,7 @@ irqreturn_t i2cEvIRQHandler(int irqno, void *dev_id)
 	itsources   = READ_REG(hi2c.Instance->CR2);
 	CurrentMode = hi2c.Mode;
    
-   // printk("SR1: %#x, SR2: %#x, CR2: %#x\n", sr1itflags, sr2itflags, itsources);
+    //printk("SR1: %#x, SR2: %#x, CR2: %#x\n", sr1itflags, sr2itflags, itsources);
 	/* Slave mode selected */
 	/* ADDR set --------------------------------------------------------------*/
 	if(((sr1itflags & I2C_FLAG_ADDR) != RESET) && ((itsources & I2C_IT_EVT) != RESET))
@@ -234,28 +245,27 @@ irqreturn_t i2cEvIRQHandler(int irqno, void *dev_id)
 	/* STOPF set --------------------------------------------------------------*/
 	else if(((sr1itflags & I2C_FLAG_STOPF) != RESET) && ((itsources & I2C_IT_EVT) != RESET))
 	{
-		ev_press	= 1;
-		wake_up_interruptible(&wq);
-
 		/* Clear STOPF flag */
 		__HAL_I2C_CLEAR_STOPFLAG(&hi2c);
+
+		*pev_press	= 1;
+		wake_up_interruptible(pwq);		
+		//printk("irqno: %#x\n", irqno);
+
 	}
 	else
 	{
 		//clear all flags
+		//printk("---> Unknow irq\n");
 		hi2c.State	= HAL_I2C_STATE_READY;
-		__HAL_I2C_DISABLE(&hi2c);
-		__HAL_I2C_ENABLE(&hi2c);
+		//__HAL_I2C_DISABLE(&hi2c);
+		//__HAL_I2C_ENABLE(&hi2c);
 	}
 
+
 	return IRQ_HANDLED;
 }
 
-
-
-
-
-
 static int i2c_ioctl(struct inode *inode, struct file *filep, unsigned int cmd, unsigned long arg)
 {
 	uint32_t			pclk1 = 0;
@@ -264,6 +274,8 @@ static int i2c_ioctl(struct inode *inode, struct file *filep, unsigned int cmd,
 	int					imajor,iminor;
 	HAL_StatusTypeDef	retSta;
 	IRQn_Type			I2CxEvIRQn;
+	wait_queue_head_t *pwq = NULL;
+	int *pev_press = NULL;
 
 	imajor = MAJOR(inode->i_rdev);
 	iminor = MINOR(inode->i_rdev);
@@ -284,16 +296,22 @@ static int i2c_ioctl(struct inode *inode, struct file *filep, unsigned int cmd,
 	{
 		I2CxHandle.Instance = I2C1;
 		I2CxEvIRQn	=	I2C1_EV_IRQn;
+		pwq = &wq_1;
+		pev_press = &ev_press_1;
 	}
 	else if(iminor == 1)
 	{
 		I2CxHandle.Instance = I2C2;
 		I2CxEvIRQn	=	I2C2_EV_IRQn;
+		pwq = &wq_2;
+		pev_press = &ev_press_2;
 	}
 	else if(iminor == 2)
 	{
 		I2CxHandle.Instance = I2C3;
 		I2CxEvIRQn	=	I2C3_EV_IRQn;
+		pwq = &wq_3;
+		pev_press = &ev_press_3;
 	}
 	else
 	{
@@ -307,7 +325,6 @@ static int i2c_ioctl(struct inode *inode, struct file *filep, unsigned int cmd,
 		/* Get PCLK1 frequency */
 		pclk1 = HAL_RCC_GetPCLK1Freq();
 		__HAL_I2C_DISABLE(&I2CxHandle);
-		HAL_NVIC_DisableIRQ(I2CxEvIRQn);
 
 		if(i2c_arg.ClockSpeed <= 100000)
 			I2CxHandle.Instance->CCR = I2C_SPEED_STANDARD(pclk1, i2c_arg.ClockSpeed) & 0x7fff;
@@ -315,8 +332,6 @@ static int i2c_ioctl(struct inode *inode, struct file *filep, unsigned int cmd,
 			I2CxHandle.Instance->CCR = I2C_SPEED_FAST(pclk1, i2c_arg.ClockSpeed, I2C_DUTYCYCLE_16_9) | 0x8000;
 
 		__HAL_I2C_ENABLE(&I2CxHandle);
-		HAL_NVIC_EnableIRQ(I2CxEvIRQn);
-		//HAL_I2C_EnableListen_IT(&I2CxHandle);
 		break;
 	
 	case GET_I2C_SPEED:
@@ -332,14 +347,11 @@ static int i2c_ioctl(struct inode *inode, struct file *filep, unsigned int cmd,
 	
 	case SET_I2C_ADDR:	//8bit
 		__HAL_I2C_DISABLE(&I2CxHandle);
-		HAL_NVIC_DisableIRQ(I2CxEvIRQn);
 		
 		/* Configure I2Cx: Own Address1 and addressing mode */
 		I2CxHandle.Instance->OAR1 = (I2C_ADDRESSINGMODE_7BIT | i2c_arg.OwnAddress1)&0xff;
 		
 		__HAL_I2C_ENABLE(&I2CxHandle);
-		HAL_NVIC_EnableIRQ(I2CxEvIRQn);
-		//HAL_I2C_EnableListen_IT(&I2CxHandle);
 		printk("OAR1: %#x\n", I2CxHandle.Instance->OAR1);
 		break;
 
@@ -350,9 +362,8 @@ static int i2c_ioctl(struct inode *inode, struct file *filep, unsigned int cmd,
 		break;
 
 	case I2C_MASTER_TRANSFER:
-		HAL_NVIC_DisableIRQ(I2CxEvIRQn);
-		
-		
+		__HAL_I2C_DISABLE_IT(&I2CxHandle, I2C_IT_EVT | I2C_IT_ERR);
+
 		I2CxHandle.State = HAL_I2C_STATE_READY;
 		I2CxHandle.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
 		retSta = HAL_I2C_Master_Transmit(&I2CxHandle, (uint16_t)i2c_arg.DevAddress, i2c_arg.buf, i2c_arg.Size, 100);	//timeout 1s
@@ -361,13 +372,11 @@ static int i2c_ioctl(struct inode *inode, struct file *filep, unsigned int cmd,
 			printk(KERN_ERR"I2C master tansfer error, minor = %d, Err = %#x\n", iminor, retSta);
 		}
 
-		HAL_NVIC_EnableIRQ(I2CxEvIRQn);
-		//HAL_I2C_EnableListen_IT(&I2CxHandle);
+		__HAL_I2C_ENABLE_IT(&I2CxHandle, I2C_IT_EVT | I2C_IT_ERR);
 		break;
 
 	case I2C_MASTER_RECEIVE:
-		HAL_NVIC_DisableIRQ(I2CxEvIRQn);
-
+		__HAL_I2C_DISABLE_IT(&I2CxHandle, I2C_IT_EVT | I2C_IT_ERR);
 		I2CxHandle.State = HAL_I2C_STATE_READY;
 		I2CxHandle.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
 		retSta = HAL_I2C_Master_Receive(&I2CxHandle, (uint16_t) i2c_arg.DevAddress, i2c_arg.buf, i2c_arg.Size, 100);	//timeout 1s
@@ -378,17 +387,25 @@ static int i2c_ioctl(struct inode *inode, struct file *filep, unsigned int cmd,
 		if(copy_to_user((void*)arg, &i2c_arg, sizeof(i2c_arg_t)))
 			return -EFAULT;
 		
-		HAL_NVIC_EnableIRQ(I2CxEvIRQn);
-		//HAL_I2C_EnableListen_IT(&I2CxHandle);
+		__HAL_I2C_ENABLE_IT(&I2CxHandle, I2C_IT_EVT | I2C_IT_ERR);
 		break;
 	
 	case I2C_SLAVE_RECEIVE_IT:
 		I2CxHandle.State = HAL_I2C_STATE_READY;
 		HAL_I2C_EnableListen_IT(&I2CxHandle);
-		wait_event_interruptible(wq, ev_press);
-		ev_press = 0;
-		memcpy(i2c_arg.buf, i2c_rcv_buf, i2c_rcv_size);	
-		i2c_arg.Size	= i2c_rcv_size;
+		if(0 == wait_event_interruptible_timeout(*pwq, *pev_press, 3*HZ))	//3s
+		{
+			i2c_arg.Size	= 0;
+		}
+		else
+		{
+			*pev_press = 0;
+			memcpy(i2c_arg.buf, i2c_rcv_buf, i2c_rcv_size);	
+			i2c_arg.Size	= i2c_rcv_size;
+		}
+		
+		//printk("SR1: %#x, SR2: %#x, CR1: %#x, CR2: %#x\n", I2CxHandle.Instance->SR1, 
+		//	I2CxHandle.Instance->SR2, I2CxHandle.Instance->CR1, I2CxHandle.Instance->CR2);
 
 		if(copy_to_user((void*)arg, &i2c_arg, sizeof(i2c_arg_t)))
 			return -EFAULT;
@@ -450,12 +467,12 @@ void i2c_hw_init(void)
 	
 	//config I2C controller
 	I2cHandle.Init.AddressingMode  = I2C_ADDRESSINGMODE_7BIT;
-	I2cHandle.Init.ClockSpeed      = 200000;
+	I2cHandle.Init.ClockSpeed      = 100000;
 	I2cHandle.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;
 	I2cHandle.Init.DutyCycle       = I2C_DUTYCYCLE_16_9;
 	I2cHandle.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;
 	I2cHandle.Init.NoStretchMode   = I2C_NOSTRETCH_DISABLE;
-	I2cHandle.Init.OwnAddress1     = 0x40;	//default address
+	I2cHandle.Init.OwnAddress1     = 0x22;	//default address
 	I2cHandle.Init.OwnAddress2     = 0xFE;
 	I2cHandle.State				   = HAL_I2C_STATE_READY;
 

BIN
app/ipmitool-1.8.18/ipmitool


BIN
app/test_app/test_app


+ 5 - 5
local/rc

@@ -11,7 +11,7 @@ ifconfig lo 127.0.0.1
 ################### install module #####################
 #insmod /usr/bin/test_module.ko
 insmod /usr/bin/gpio.ko 
-#insmod /usr/bin/i2c.ko
+insmod /usr/bin/i2c.ko
 #insmod /usr/bin/fmc.ko
 insmod /usr/bin/platform.ko
 #insmod /usr/bin/adc.ko
@@ -21,9 +21,9 @@ insmod /usr/bin/platform.ko
 #################### create node ########################
 #mknod /dev/test_module c 99 0
 mknod /dev/platform c 100 0
-#mknod /dev/i2c1 c 101 0
-#mknod /dev/i2c2 c 101 1
-#mknod /dev/i2c3 c 101 2
+mknod /dev/i2c1 c 101 0
+mknod /dev/i2c2 c 101 1
+mknod /dev/i2c3 c 101 2
 #mknod /dev/fmc_cpld c 102 0
 mknod /dev/gpio c 103 0 
 #mknod /dev/adc1 c 105 0
@@ -37,4 +37,4 @@ mknod /dev/gpio c 103 0
 /usr/bin/bmc_app & 
 #sleep 3
 #/usr/bin/test_app 
-/usr/bin/goahead-3.6.5 -v --home /etc/goahead &
+#/usr/bin/goahead-3.6.5 -v --home /etc/goahead &