我试图在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#