1.open()
头文件:
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
一个demo:
signed int vpu_socket;
vpu_socket = open("/dev/rkvdec", O_RDWR);//O_RDWR 以可读写方式打开文件
具体参考:http://blog.csdn.net/linux_loajie/article/details/43916677
2.mmap()
头文件:
#include <sys/mman.h>
#include <unistd.h>
void *mmap(void *start, size_t length, int prot, int flags, int fd, off_t offsize);
说明:
start通常为NULL;
length为文件的长度;
prot代表映射区域的保护方式;
flags会影响映射区域的各种特性;
fd为open()返回的文件描述词;
offsize为文件映射的偏移量;
具体参考:
http://c.biancheng.net/cpp/html/138.html
运行的时候出现segmentation fault
原因:prot设置为PROT_READ,后面又改动了虚拟地址中的值。
解决方法:prot设置为PROT_WRITE
一个demo:
unsigned char *io_base;
int real_len = SZ_64K;
io_base = mmap(NULL, real_len PROT_READ, MAP_SHARED, mfd, real_base);
3.write()
头文件:
#include <unistd.h>
一种为:ssize_twrite(int handle, void *buf, int nbyte);
该函数将从指定的文件handle 中读取指定大小count个字节到从buf开始的缓冲区中。
handle 是文件描述符
访问物理地址的方式如下:
//打开设备
int fd=open("/dev/mem",O_RDWR);//fd为文件描述符。/dev/mem是整个物理地址空间。
//通过mmap映射物理地址到user space的虚拟地址
unsigned char *vir_addr=mmap(NULL, MAP_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, physical_addr);//通过文件描述符和物理地址得到虚拟地址
//打印出错信息。如果mmap出错,那么vir_addr会返回(void *)-1;若正确则返回映射到的虚拟地址。
if (vir_addr== (void *)(-1)) {
fprintf(stderr, "mmap() failed: %s\n", strerror(errno));
exit(1);
}
在android8.0上mmap出现错误,要使用mmap64()