sram pool

//public.h

#ifndef _PUBLIC_H_
#define _PUBLIC_H_


#define DEBUG
#define LOG
#define X86

#ifndef X86
 #define Print printk
#else
 #define Print  printf
#endif


#ifndef DEBUG
 #define DebugPrint(fmt,args...) 
#else
 #define DebugPrint(fmt,args...) Print("/n %s" fmt "","---DEBUG INFO---",##args)
#endif

#ifndef LOG
 #define LogPrint(fmt,args...) 
#else
 #define LogPrint(fmt,args...) Print("/n %s" fmt "","---LOG INFO---",##args)
#endif
#ifdef X86
 #define Kmalloc(a,b)   malloc(a)
#else
 #define Kmalloc(a,b)   kmalloc(a,b)
#endif


/*define var*/
#define ture      1 
#define false  0
#define null  0
#define null  0

 


/*typedef var*/
typedef unsigned char   UINT8;
typedef unsigned short  UINT16;
typedef unsigned int      UINT32;
typedef unsigned long    UINT64;

typedef signed char  INT8;
typedef signed short  INT16;
typedef signed int      INT32;
typedef signed long    INT64;


typedef unsigned char  BOOL;
typedef unsigned char  byte;

 


/* public struct*/
typedef struct _BMHDTV_DEVICE_
{
    //struct pci_dev device;
    unsigned long       SramSpacePhyBase;
    unsigned long       SramSpaceVirtBase;
    unsigned long       SramSpaceSize;
    unsigned long       RegPhyBase;
    unsigned long       RagVirtBase;
    unsigned long       RegSize;
    int                     DeviceIrq;
} BMHDTV_DEVICE;


BMHDTV_DEVICE gBMHDTVdevice;

 


#endif

 

 

//SramPool.h

#ifndef _SRAM_POOL_H_
#define _SRAM_POOL_H_
#include "public.h"

 

#define MPEG2_BUFFER_BASE  54*1024*1024  //54M
#define MPEG2_BUFFER_SIZE  2*1024*1024   // 2m


#define DATA_BUFFER_BASE  58*1024*1024  //58M
#define DATA_BUFFER_SIZE  4*1024*1024   // 4M


#define SRAM_BUFFER_HEADER 5

/**************************************************************
A Node struct...return DATA addr;

--------------------------------------------------------------
|SpaceTable   | NodeTable  |  buffer size          |   DATA (size)                |
|  index          |    index      |           (len)         |                                    |
---------------------------------------------------------------
0                    8                 16                          32

***************************************************************/


typedef struct _DATA_BUFFER_{
 UINT32 bpStartPos;
 UINT32 blen;

}DATA_BUFFER,*PDATA_BUFFER;

 


typedef struct _NODE_TABLE_{

 unsigned long  StarAddr;
 BOOL isUsed;

}NODE_TABLE,*PNODE_TABLE;

 

 

typedef struct _SPACE_TABLE_
{
 UINT32   NodeSizeByte;
 UINT32   MaxNodeNumber;
 UINT32   NodeUsedNumber;

 NODE_TABLE  *pNodeTable;

}SPACE_TABLE,*PSPACE_TABLE;

 

 

typedef struct _POOL_TABLE_{
 UINT32   TableNum;
 SPACE_TABLE  *pSpaceTable;


}POOLTABLE,*PPOOL_TABLE;


typedef struct _CONFIG_INFO_{
 UINT8  NumberOfSpace;
 UINT16  *pNodeSizeArry;
 UINT16  *pNodeNumberArry;

}CONFIG_INFO,*PCONFIG_INFO;

 


POOLTABLE *gpPoolTable;

 

BOOL InitDevice();

BOOL ConfigSramPool(CONFIG_INFO mConfigInfomation);

BOOL InitSramPool(void);

void  *RequstBuffer(int mlen);

BOOL FreeBuffer(void *mPoint);

void ShowThePoolStruct();

 

#define GetSramBuffer(len,type) (type *)RequstBuffer(len)
#define FreeSramBuffer(point)  FreeBuffer((void *)point)

 

#endif

 

//SramPool.c

 

#include <string.h>
#include <stdio.h>
#include <stdlib.h>

#include "SramPool.h"

 


BOOL InitDevice()
{

#ifdef DEBUG
    unsigned char * StartAddr = NULL;  
    int i, p = 0;
#endif

 unsigned long nSramSize = DATA_BUFFER_SIZE;

 LogPrint("Init Device....");

 gBMHDTVdevice.RagVirtBase=-1;
 gBMHDTVdevice.RegPhyBase=-1;
 gBMHDTVdevice.RegSize=-1;
 gBMHDTVdevice.SramSpaceVirtBase=-1;
 gBMHDTVdevice.DeviceIrq=-1;
 gBMHDTVdevice.SramSpaceVirtBase=-1;
 gBMHDTVdevice.SramSpacePhyBase=DATA_BUFFER_BASE;
 gBMHDTVdevice.SramSpaceSize = DATA_BUFFER_SIZE;

#ifndef X86
 gBMHDTVdevice.SramSpaceVirtBase=(unsigned long) ioremap_nocache(gBMHDTVdevice.SramSpacePhyBase, nSramSize);
#else
 gBMHDTVdevice.SramSpaceVirtBase=(unsigned long) malloc(4*1024*1024);
 memset((UINT8 *)gBMHDTVdevice.SramSpaceVirtBase,0,4*1024*1024);
#endif

 if(gBMHDTVdevice.SramSpaceVirtBase == (-1))
  {
   LogPrint("Device Init Failt.../n");
   return false;
  }

#ifndef DEBUG

 DebugPrint("Testing.......");

 StartAddr= (unsigned char *) gBMHDTVdevice.SramSpaceVirtBase;
     for (i = 0; i < nSramSize; i += 4)
     {
         *(StartAddr + i) = 'a';
         *(StartAddr + i + 1) = 'b';
         *(StartAddr + i + 2) = 'c';
         *(StartAddr + i + 3) = 'd';
     }
    for (p = 10   ; p > 0   ; p--)
     {
     #ifndef X86
         printk("%c  ", *(StartAddr + nSramSize - p));  
 #else
         printf("%c  ", *(StartAddr + nSramSize - p));  
 #endif
     }
 
#endif

 LogPrint("Device Init OK.../n");


 return ture;

}

 

 


BOOL ConfigSramPool(CONFIG_INFO mConfigInfomation)
{
 UINT32  nSpaceNumber=0;
 SPACE_TABLE *npSpaceTable=null;
 NODE_TABLE *npNodeTable=null;
 int    nSpaceCount,i;
 UINT32  nNodeNumber;
 UINT32  nTotalLens=0;;

 LogPrint("--->Config The Sram Pool...");


 gpPoolTable=(POOLTABLE *) Kmalloc(sizeof(POOLTABLE), GFP_KERNEL);
 if(gpPoolTable==null)
  {
   LogPrint("Pool Table Init Fault...");
   return false;
  }

 
 gpPoolTable->TableNum=mConfigInfomation.NumberOfSpace;
 nSpaceNumber=mConfigInfomation.NumberOfSpace;
 gpPoolTable->pSpaceTable=(SPACE_TABLE *)Kmalloc(sizeof(SPACE_TABLE)*nSpaceNumber,GPF_KERNEL);
 npSpaceTable=gpPoolTable->pSpaceTable;

 if(npSpaceTable==null)
  {
   LogPrint("Space Table Init Fault...");
   return false;
  }
 
 for(i=0;i<nSpaceNumber;i++)
  {
   npSpaceTable[i].NodeSizeByte=mConfigInfomation.pNodeSizeArry[i]+SRAM_BUFFER_HEADER;
   npSpaceTable[i].MaxNodeNumber=mConfigInfomation.pNodeNumberArry[i];
   npSpaceTable[i].NodeUsedNumber=0;
   nNodeNumber=mConfigInfomation.pNodeNumberArry[i];
   npSpaceTable[i].pNodeTable=(NODE_TABLE *)Kmalloc(sizeof(NODE_TABLE)*nNodeNumber,GPF_KERNEL);
   npNodeTable=npSpaceTable[i].pNodeTable;

   if(npNodeTable==null)
    {
     LogPrint("Node Table %d Init Fault...",i);
     return false;
    }
   nTotalLens=nTotalLens+npSpaceTable[i].NodeSizeByte*npSpaceTable[i].MaxNodeNumber;
   
  }

 if(nTotalLens>=DATA_BUFFER_SIZE)
  {
   Print("/n/ntotal lens:%ld/n/n",nTotalLens);
   LogPrint("Not ength monenry to save the buffer.../n/n");
   return false;
  }

 LogPrint("<----Config The Sram Pool End...");
 return ture;


}


BOOL InitSramPool(void)
{
 int i,j,k;
 UINT8 nTableNum;
 SPACE_TABLE *npSpaceTable=null;
 NODE_TABLE *npNodeTable=null;
 UINT32 nNodeNumber;
 UINT32 nNodeSize;

 UINT8  *npMem;
 UINT8   *npPoolBase;
 UINT16  ntmp;


 LogPrint("---->Init Sram Pool....");

 npPoolBase=(UINT8 *)gBMHDTVdevice.SramSpaceVirtBase;
 npMem=npPoolBase;

 nTableNum=gpPoolTable->TableNum;
 npSpaceTable=gpPoolTable->pSpaceTable;

 if(npMem==null)
  {
   LogPrint("Base Ram is null....");
   return false;
  }


/*************************************************************
--------------------------------------------------------------
|SpaceTable   | NodeTable  |  buffer size          |   DATA (size)                |
|  index          |    index      |           (len)         |                                    |
---------------------------------------------------------------
0                    8                 16                          32
**************************************************************/
 for(i=0;i<nTableNum;i++)
  {
  // LogPrint("Init Space Table....");
   npNodeTable=npSpaceTable[i].pNodeTable;
   nNodeNumber=npSpaceTable[i].MaxNodeNumber;
   nNodeSize=npSpaceTable[i].NodeSizeByte;
   npSpaceTable[i].NodeUsedNumber=0;

  // LogPrint("npSpaceTable[%d]:MaxNodeNumber  %d,NodeSizeByte %d",i,nNodeNumber,nNodeSize);

   for(j=0;j<nNodeNumber;j++)
    {
     npNodeTable[j].isUsed=false;
     *npMem=i;
     *(npMem+1)=j>>8;
     *(npMem+2)=j&0xff;
     *(npMem+3)=nNodeSize>>8;
     *(npMem+4)=nNodeSize&0xff;
     ntmp=*(npMem+3);
     ntmp=(ntmp<<8)|(*(npMem+4));
     npNodeTable[j].StarAddr=(unsigned long)(npMem+5);
     npMem+=nNodeSize;
    }
   

  }

 LogPrint("<----Init Sram Pool....");
 
 return ture;


}

 

 

void  *RequstBuffer(int mlen)
{
 int i=0;
 int j=0;
 UINT8 nTableNum;
 SPACE_TABLE *npSpaceTable=null;
 NODE_TABLE *npNodeTable=null;
 UINT32 nNodeNumber;
 UINT32 nNodeSize;

 void   *npReqMem=null;
 UINT8   *npPoolBase;
 UINT16  ntmp;

 nTableNum=gpPoolTable->TableNum;
 npSpaceTable=gpPoolTable->pSpaceTable;

 while(i<nTableNum)
  {
   if((npSpaceTable[i].NodeSizeByte>=mlen+SRAM_BUFFER_HEADER)&&
    (npSpaceTable[i].MaxNodeNumber>npSpaceTable[i].NodeUsedNumber))
    {
     npNodeTable=npSpaceTable[i].pNodeTable;
     nNodeNumber=npSpaceTable[i].MaxNodeNumber;
     nNodeSize=npSpaceTable[i].NodeSizeByte;


     
     while(npNodeTable[j].isUsed==ture)
       j++;
     npReqMem=(void *)npNodeTable[j].StarAddr;
     npNodeTable[j].isUsed=ture;
     npSpaceTable[i].NodeUsedNumber++;
     break;
    }
   i++;
  }

 if(npReqMem == 0)
  Print("The Requst Buffer addr is null/n/n");

 return npReqMem;

}

 

BOOL FreeBuffer(void *mPoint)
{
 UINT8 *nPointer;
 UINT8 nSpaceIndex;
 UINT16 nNodeIndex;

 if(mPoint==null)
  return false;

 nPointer = (UINT8 *)mPoint;
 nSpaceIndex=*(nPointer-5);
 nNodeIndex=(*(nPointer-4)<<8)|(*(nPointer-3));
 if(gpPoolTable->pSpaceTable[nSpaceIndex].pNodeTable[nNodeIndex].isUsed==ture)
  {
   gpPoolTable->pSpaceTable[nSpaceIndex].pNodeTable[nNodeIndex].isUsed=false;
   gpPoolTable->pSpaceTable[nSpaceIndex].NodeUsedNumber--;

   return ture;
  }
 else
  {
   return false;
  }

}

 


void ShowThePoolStruct()
{
 int i,j,k;
 UINT32 nSpaceNum;
 UINT32 nMaxNodeNum;

 UINT8 *npMem=null;

 nSpaceNum=gpPoolTable->TableNum;


 Print("/n/n=====================Pool State===========================/n/n");
 Print("Space Num:/t");
 for(i=0;i<nSpaceNum;i++)
  Print("%d/t",i);
 Print("/n");
 Print("Space Len:/t");
 for(i=0;i<nSpaceNum;i++)
  Print("%d/t",gpPoolTable->pSpaceTable[i].NodeSizeByte); 
 Print("/n");
 Print("Node Num:/t");
 for(i=0;i<nSpaceNum;i++)
  Print("%d/t",gpPoolTable->pSpaceTable[i].MaxNodeNumber); 
 Print("/n");
 Print("Node Used:/t"); 
 for(i=0;i<nSpaceNum;i++)
  Print("%d/t",gpPoolTable->pSpaceTable[i].NodeUsedNumber);  

 Print("/n/n=====================Pool State END========================/n/n");


#if 0
 for(i=0;i<nSpaceNum;i++)
  {
   LogPrint("index SpaceNum:%d",i);
   LogPrint("MaxNodeNumber:%d",gpPoolTable->pSpaceTable[i].MaxNodeNumber);
   LogPrint("NodeSizeByte:%d",gpPoolTable->pSpaceTable[i].NodeSizeByte);
   LogPrint("NodeUsedNumber:%d",gpPoolTable->pSpaceTable[i].NodeUsedNumber);
   nMaxNodeNum=gpPoolTable->pSpaceTable[i].MaxNodeNumber;
   for(j=0;j<nMaxNodeNum;j++)
    {
     LogPrint("index Node:%d",j);
     LogPrint("StarAddr:%x",gpPoolTable->pSpaceTable[i].pNodeTable[j].StarAddr);
     LogPrint("isUsed:%x",gpPoolTable->pSpaceTable[i].pNodeTable[j].isUsed);

     npMem=(UINT8 *)(gpPoolTable->pSpaceTable[i].pNodeTable[j].StarAddr-SRAM_BUFFER_HEADER);
     #ifdef DEBUG
     for(k=0;k<gpPoolTable->pSpaceTable[i].NodeSizeByte;k++)
      {
      if(k%16==0)
       Print("/n");
      Print("%x ",*(npMem+k));
      }
     #endif

 


    }
   
   LogPrint("+++++++++++++++++++++++++++++++++++++++++++++++++++++++");
  }


#endif

}

 


#ifdef X86

#define NumberOfBufferSizes 9
#define BufferSizesArry     {  16,   48,   64,  288, 512, 1320, 1400, 1480, 1580}
#define NumberOfBuffersArry { 8,  4,  7,  4,  2,   6,  400,  300,    500}

static UINT16 gBufferSizes[NumberOfBufferSizes]    = BufferSizesArry;
static UINT16 gBufferNumbers[NumberOfBufferSizes]  = NumberOfBuffersArry;

 


typedef struct _TEST_NODE_
{
 UINT8  testData;
 UINT32 testUdata;
 int   testInt;
 int  testData2;
 struct _TEST_NODE_ *pTestNodeNext;;
}TESTNODE,*PTESTNODE;

 

int main()
{
 CONFIG_INFO nConfigInfomation={0};
 UINT8 *nTest[13];
 int i,j;
 TESTNODE *pTest=null;
 TESTNODE *pt=null,*header=null;

 

 nConfigInfomation.NumberOfSpace=NumberOfBufferSizes;
 nConfigInfomation.pNodeNumberArry=gBufferNumbers;
 nConfigInfomation.pNodeSizeArry=gBufferSizes;

 InitDevice();
 
 if(!ConfigSramPool(nConfigInfomation))
  return 0;

 InitSramPool();


/*
 for(i=0;i<13;i++)
  nTest[i]=GetSramBuffer(1400, UINT8);


 for(i=0;i<9;i++)
  for(j=0;j<1400;j++)
   nTest[i][j]=j;

 ShowThePoolStruct();


 for(i=0;i<13;i++)
  FreeSramBuffer(nTest[i]);


 ShowThePoolStruct();
*/

 pTest=GetSramBuffer(sizeof(TESTNODE), TESTNODE);
 pt=pTest->pTestNodeNext;
 header=pTest;
 for(i=0;i<1500;i++)
  {
   pt=GetSramBuffer(sizeof(TESTNODE), TESTNODE);
   if(pt!=null)
    {
     pt->testData=1;
     pt->testUdata=0x11223344;
     pt->testInt=0x55667788;
     pt->pTestNodeNext=null;
     pTest->pTestNodeNext=pt;
     pTest=pt;
    }
  }

 ShowThePoolStruct();


   pt=header;
   while(pt->pTestNodeNext!=null)
    {
     pt=pt->pTestNodeNext;
     FreeSramBuffer(pt);
    }
 ShowThePoolStruct();


 
 return 0;
}

#endif

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值