linux下虚拟lcd屏幕总线错误,mmap - 为什么BBB的LCD寄存器上的mmap()会导致总线错误? - 堆栈内存溢出...

我试图在Beagle Bone Black上访问AM335X的LCD控制器。 我使用Linux debian。 下面是代码。如果我注释LCD代码部分中的“ reg_value = * reg_data”行,程序将正确执行,并且我可以看到LED闪烁。 我不确定为什么不能通过mmap()访问LCD寄存器,但是却可以通过mmap()访问GPIO寄存器。 有人可以指出这里出了什么问题吗?

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define LCD_BASE 0x4830E000

#define LCD_TOP 0x4830F000

#define LCD_SIZE (LCD_TOP - LCD_BASE)

#define PID 0

#define GPIO1_START_ADDR 0x4804C000

#define GPIO1_END_ADDR 0x4804E000

#define GPIO1_SIZE (GPIO1_END_ADDR - GPIO1_START_ADDR)

#define GPIO_SETDATAOUT 0x194

#define GPIO_CLEARDATAOUT 0x190

#define USR3 (1<<24)

void main()

{

// LCD Code Area...........................

int state;

int mem, loop_i;

volatile void* lcd_mem_addr;

volatile unsigned int *reg_data;

volatile unsigned int reg_value;

if ((mem = open ("/dev/mem", O_RDWR)) < 0)

{

printf("Cannot open /dev/mem\n");

return 1;

}

lcd_mem_addr = mmap(0, LCD_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, mem, LCD_BASE);

printf("\n Lets read LCD Controller PID register first");

reg_data = lcd_mem_addr + PID;// lcd_register_offset[loop_i]);

printf("\n Address is %x ", (lcd_mem_addr + PID));

sleep(1);

reg_value = *reg_data;

printf("\n Set Value in LCD from reg = %x", reg_value);

close(mem);

munmap(lcd_mem_addr, 0x0100);

//..................LCD Code Ends

//..................GPIO Code starts

volatile void *gpio_addr;

volatile unsigned int *gpio_setdataout_addr;

volatile unsigned int *gpio_cleardataout_addr;

int fd = open("/dev/mem", O_RDWR);

gpio_addr = mmap(0, GPIO1_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, GPIO1_START_ADDR);

gpio_setdataout_addr = gpio_addr + GPIO_SETDATAOUT;

gpio_cleardataout_addr = gpio_addr + GPIO_CLEARDATAOUT;

while(1)

{

sleep(2);

*gpio_setdataout_addr = USR3;

reg_value = *gpio_setdataout_addr;

printf("\n Set Value from reg = %x", reg_value);

sleep(2);

*gpio_cleardataout_addr = USR3;

reg_value = *gpio_setdataout_addr;

printf("\n Clear Value from reg = %x", reg_value);

}//while

}//main

有人可以指出这里出了什么问题吗?

上述代码在运行时的输出为

root @ beaglebone:/ home / mYprojects / LCD / userspace#./LCD_3.o

让我们先读取LCD控制器PID寄存器总线错误root @ beaglebone:/ home / mYprojects / LCD / userspace#

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值