嵌入式爱好者

查看: 10196|回复: 2

下面是从网上找的mmap方式驱动LED代码,

[复制链接]

14

主题

35

帖子

185

积分

扫一扫,手机访问本帖
发表于 2012-12-3 14:49:17 | 显示全部楼层 |阅读模式
本帖最后由 starter 于 2012-12-3 15:39 编辑

其中地址+24是我改的,原文+8
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <unistd.h>
#include <errno.h>
#include <fcntl.h>
#include <sys/mman.h>
#define MAP_SIZE 4096UL
#define MAP_MASK (MAP_SIZE - 1)
int main(void) {
    int fd;
    void *map_base, *virt_addr;
    off_t target = 0x7F008800;        //GPKCON0 0x7F008800
    if((fd = open("/dev/mem", O_RDWR | O_SYNC)) == -1) {
        printf("/dev/mem could not be opened.\n");
        perror("open");
        exit(1);
    } else {
        printf("/dev/mem opened.\n");
    }
    /* Map one page */
    map_base = mmap(0, MAP_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, target & ~MAP_MASK);
    if(map_base == (void *) -1) {
        printf("Memory map failed.\n");
        perror("mmap");
    } else {
        printf("Memory mapped at address %p.\n", map_base);
    }
    virt_addr = map_base + (target & MAP_MASK);
    /* acess remapped region here */
    printf("Now try to change the value of the on-board DIP switche\n");
*(unsigned int *)virt_addr=0x11110000;//0x1111<<16;//éè???aê?3?×?ì?
        int ab=*(unsigned int *)virt_addr;
        //*(unsigned int *)(virt_addr+8)=0xffffffff;
        printf("ab=%x\n",ab);
    while(1){
        *(volatile unsigned int *)(virt_addr+0x24)=0x00;        
//printf("1value is 0x%x\n",*(unsigned int *)(virt_addr+0x24));
        //printf("2value is 0x%x\n",*(unsigned int *)virt_addr);
        //sleep(1);        
        *(volatile unsigned int *)(virt_addr+0x24)=0xff;
        //printf("3value is 0x%x\n",*(unsigned int *)(virt_addr+0x24));
        //printf("4value is 0x%x\n",*(unsigned int *)virt_addr);
        //sleep(1);        
    }

   /* we'll never get here in this example, but here's how the region is
     * unmapped. */
    if(munmap(map_base, MAP_SIZE) == -1) {
        printf("Memory unmap failed.\n");        
    }
    close(fd);
}
这个代码用4.3.2编译可以动作的,但是我把它mmap 以及驱动LED部分插到QtCreator程序中,编译也应当是4.3.2,运行就退出GUI,为何?
该会员没有填写今日想说内容.
回复

使用道具 举报

14

主题

35

帖子

185

积分

 楼主| 发表于 2012-12-3 15:00:35 | 显示全部楼层
下面把重点地方抽出来,几乎一样的
#define MAP_SIZE 4096UL
#define MAP_MASK (MAP_SIZE - 1)
    off_t target = 0x7F008800;        //GPKCON0 0x7F008800
    if((fd = open("/dev/mem", O_RDWR | O_SYNC)) == -1) {

    map_base = mmap(0, MAP_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, target & ~MAP_MASK);
    virt_addr = map_base + (target & MAP_MASK);
        *(unsigned int *)virt_addr=0x11110000;//0x1111<<16;//éè???aê?3?×?ì?
    while(1){
        *(volatile unsigned int *)(virt_addr+0x24)=0x00;       

        *(volatile unsigned int *)(virt_addr+0x24)=0xff;

    }
    close(fd);

}

          target= 0x7F008800;
                #define MAP_SIZE 4096UL
                #define MAP_MASK (MAP_SIZE - 1)
    fbb=open("/dev/mem",O_RDWR | O_SYNC);
    map_base =(long *)mmap(NULL,MAP_SIZE,PROT_READ|PROT_WRITE,MAP_SHARED,fbb,target & ~MAP_MASK);
    virt_addr = map_base + (target & MAP_MASK);
    s1=QString::number((unsigned int)virt_addr);
    //s1=QString::number(errno);
    //s1=QString::number(fbb);
    ui->lineEdit_3->setText( s1 );
                while(1)
        {
    *(volatile unsigned int *)(virt_addr+0x24)=0x00;
    *(volatile unsigned int *)(virt_addr+0x24)=0xff;

        }
该会员没有填写今日想说内容.
回复 支持 反对

使用道具 举报

14

主题

35

帖子

185

积分

 楼主| 发表于 2012-12-4 16:21:30 | 显示全部楼层
搞定了,char *指针和long *指针搞错了,地址错了.另外搞定了mmap控制SPI,效率真是高,本来write方式控制SPI,代码后有个IO翻转,44us后SPI才出数据,mmap映射后直接操作1us后SPI数据就出来了
该会员没有填写今日想说内容.
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋| 飞凌嵌入式 ( 冀ICP备12004394号-1 )

GMT+8, 2024-12-27 01:22

Powered by Discuz! X3.4

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表