微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > arm驱动linux设备地址映射到用户空间

arm驱动linux设备地址映射到用户空间

时间:11-19 来源:互联网 点击:

register_chrdev_region(devno, 1, "module");
}else{
result = alloc_chrdev_region(&devno, 0, 1, "module");
VirtualDisk_major = MAJOR(devno);
}
if(result < 0 ){
return result;
}
VirtualDiskp = kmalloc(sizeof(struct VirtualDisk), GFP_KERNEL);
if(!VirtualDiskp){
result = -ENOMEM;
goto fail_malloc;
}
memset(VirtualDiskp, 0, sizeof(struct VirtualDisk));
VirtualDisk_setup_cdev(VirtualDiskp, 0);
module_class = class_create(THIS_MODULE, "module_drv");
if (IS_ERR(module_class))
return PTR_ERR(module_class);
module_class_dev = class_device_create(module_class, NULL, MKDEV(VirtualDisk_major, 0), NULL, "module"); /* /dev/xyz */
if (IS_ERR(module_class_dev))
return PTR_ERR(module_class_dev);
return 0;
fail_malloc:
unregister_chrdev_region(devno, 1);
return result;

}
static void module_drv_exit(void)
{
cdev_del(&VirtualDiskp->cdev);
kfree(VirtualDiskp);
unregister_chrdev_region(MKDEV(VirtualDisk_major, 0), 1);
class_device_unregister(module_class_dev);
class_destroy(module_class);
}
module_init(module_drv_init);
module_exit(module_drv_exit);
MODULE_LICENSE("GPL");

实例三)b)与驱动对应的应用程序部分

#include
#include
#include
#include
#include
#include
int main(){
int fd;
char *start;
//char buf[100];
char *buf;
char *end;
char key_vals[20];
/*打开文件*/
printf("mypid is %d",getpid());
fd = open("/dev/module",O_RDWR);

buf = (char *)malloc(100);
memset(buf, 0, 100);
start=mmap(NULL,10,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0);
end = mmap(NULL, 20,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0);//addr为NULL,由系统分配
/* 读出数据 */
strcpy(buf,start);
sleep (1);
printf("buf 1 = %s\n",buf);
/* 写入数据 */
strcpy(start,"Buf Is Not Null!rgrgrfgfgfdg");
memset(buf, 0, 100);
strcpy(buf,start);
sleep (1);
printf("buf 2 = %s\n",buf);
/* 写入数据 */
strcpy(end,"is it reality! is not sure,are you ok, make sure ,you");
memset(buf, 0, 100);
strcpy(buf,start);
sleep (1);
printf("buf 3 = %s\n",buf);
printf("buf 3 = %s\n",end);

read(fd, key_vals, sizeof(key_vals));
printf("key_vals 3 = %s\n",key_vals);

// while(1);
munmap(start,10); /*解除映射*/
munmap(end,20); /*解除映射*/

free(buf);
close(fd);
return 0;
}

第三部分:struct stat 作用
1、stat,lstat,fstat1 函数都是获取文件(普通文件,目录,管道,socket,字符,块()的属性。函数原型#include
2、向stat,fstat1、lstat传入文件名字path、fd、path,获取文件对应属性buf。

int stat(const char *path, struct stat *buf); //文件路径或文件名
int fstat(int fd, struct stat *buf);//文件描述符
int lstat(const char *path, struct stat *buf);//连接文件

结构体二)struct stat结构

struct stat {
mode_t st_mode; //文件对应的模式,文件,目录等
ino_t st_ino; //inode节点号
dev_t st_dev; //设备号码
dev_t st_rdev; //特殊设备号码
nlink_t st_nlink; //文件的连接数
uid_t st_uid; //文件所有者
gid_t st_gid; //文件所有者对应的组
off_t st_size; //普通文件,对应的文件字节数(常用)
time_t st_atime; //文件最后被访问的时间
time_t st_mtime; //文件内容最后被修改的时间
time_t st_ctime; //文件状态改变时间
blksize_t st_blksize; //文件内容对应的块大小
blkcnt_t st_blocks; //文件内容对应的块数量
};

四、与mmap应用程序中“普通文件虚拟内存映射模板和实例

模板二)1、mmap()应用程序模板

int fd;
/*获得映射区域地址,赋值mapChar*/
fd = open("/tmp/test.txt",O_RDWR);
struct stat fileStat;
/* 获取文件的属性 */
if ((fstat(fd, &fileStat)) == -1) {
perror("fstat");
}
unsigned int fileBufferSize;
fileBufferSize = fileStat.st_size;/*mmap回写时,字节最大大小
为fileStat.st_size,所以定义字节大fileStat.st_size*/
mmap(NULL,fileBufferSize,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0);//获得映射区域地址
munmap(checkChar, fileBufferSize);

实例四)2、完整实例

#include
#include
#include
#include
#include
#include
#include
#include
#include
void printfMapChar(char *nameChar, char *mapChar){
printf("%s = %s\n\n", nameChar,mapChar);
}
void printfDivLine(char *desc){
printf("********%s*******\n", desc);
}
int main(){
int fd;
char *mapChar;
char *checkChar;//验证是否mapChar是映射地址
struct stat fileStat;
printf("mypid is %d\n",getpid());//输出本pid
/*获得映射区域地址,赋值mapChar*/
fd = open("/tmp/test.txt",O_RDWR);
/* 获取文件的属性 */
if ((fstat(fd, &fileStat)) == -1) {
perror("fstat");
}

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top