资源简介
海思平台代码读取某个GPIO口的值,方便用户在官方SDK去掉API读值的情况下使用
代码片段和文件信息
#include
#include
#include
#include
#include
#include
typedef struct tag_MMAP_Node
{
unsigned int Start_P;
unsigned int Start_V;
unsigned int length;
unsigned int refcount;
struct tag_MMAP_Node * next;
}TMMAP_Node_t;
TMMAP_Node_t * pTMMAPNode = NULL;
#define PAGE_SIZE 0x1000
#define PAGE_SIZE_MASK 0xfffff000
static int fd = -1;
static const char dev[]=“/dev/mem“;
#define ASC2NUM(ch) (ch - ‘0‘)
#define HEXASC2NUM(ch) (ch - ‘A‘ + 10)
#define DEFAULT_MD_LEN 128
void * memmap(unsigned int phy_addr unsigned int size)
{
unsigned int phy_addr_in_page;
unsigned int page_diff;
unsigned int size_in_page;
TMMAP_Node_t * pTmp;
TMMAP_Node_t * pNew;
void *addr=NULL;
if(size == 0)
{
printf(“memmap():size can‘t be zero!\n“);
return NULL;
}
/* check if the physical memory space have been mmaped */
pTmp = pTMMAPNode;
while(pTmp != NULL)
{
if( (phy_addr >= pTmp->Start_P) &&
( (phy_addr + size) <= (pTmp->Start_P + pTmp->length) ) )
{
pTmp->refcount++; /* referrence count increase by 1 */
return (void *)(pTmp->Start_V + phy_addr - pTmp->Start_P);
}
pTmp = pTmp->next;
}
/* not mmaped yet */
if(fd < 0)
{
/* dev not opened yet so open it */
fd = open (dev O_RDWR | O_SYNC);
if (fd < 0)
{
printf(“memmap():open %s error!\n“ dev);
return NULL;
}
}
/* addr align in page_size(4K) */
phy_addr_in_page = phy_addr & PAGE_SIZE_MASK;
page_diff = phy_addr - phy_addr_in_page;
/* size in page_size */
size_in_page =((size + page_diff - 1) & PAGE_SIZE_MASK) + PAGE_SIZE;
addr = mmap ((void *)0 size_in_page PROT_READ|PROT_WRITE MAP_SHARED fd phy_addr_in_page);
if (addr == MAP_FAILED)
{
printf(“memmap():mmap @ 0x%x error!\n“ phy_addr_in_page);
return NULL;
}
/* add this mmap to MMAP Node */
pNew = (TMMAP_Node_t *)malloc(sizeof(TMMAP_Node_t));
if(NULL == pNew)
{
printf(“memmap():malloc new node failed!\n“);
return NULL;
}
pNew->Start_P = phy_addr_in_page;
pNew->Start_V = (unsigned int)addr;
pNew->length = size_in_page;
pNew->refcount = 1;
pNew->next = NULL;
if(pTMMAPNode == NULL)
{
pTMMAPNode = pNew;
}
else
{
pTmp = pTMMAPNode;
while(pTmp
相关资源
- 语音识别LD3320开发资料包含51代码
- DIR2病毒源代码(汇编语言编写)
- VC仿Windows记事本源代码
- 代码绘制的爱心表白
- CRichEditView显示行号的代码
- STM8S代码例程
- Word插入代码显示行号并高亮着色显示
- 破解source insight4.00.0096
- 蓝牙源代码应用于LINUX
- 简单好用的Nhibernate代码自动生成工具
- KUKA 编程案例讲解.ppt
- bp神经网络源代码,可直接运行
- 随机森林R语言代码
- 计算机图形学 边填充算法实现代码
- 直流无刷电机方波驱动 stm32 例程代码
- 仿知乎界面小程序源代码
- 贪吃蛇源代码.fla
- 周立功开发板ProASIC3实验-syn_FIFO代码
- IMX385驱动代码.zip
- dotnet 写字板 实验 源代码 不好请要不
- 图像二维小波变换的实现源代码
- 八三编码器设计 VHDL代码 简单,包附
- linux应用层的华容道游戏源代码
- 交通咨询模拟系统完整代码
- http请求状态代码
- 数值分析所有实验代码
- 网上拍卖系统完整源代码
- 音乐代码转换软件 单片机编程时用
- CSMA/CD等动画演示加源代码
- silicon lab公司的收音IC SI47XX全套开发工
评论
共有 条评论