2013-02-11 2 views
1

У меня есть плата beagleboard-xm rev C. TRM процессора. Я вижу несколько примеров настройки пэдов в сети. вот один из примеров:Конфигурация пэда от mmap

int fd = open("/dev/mem", O_RDWR | O_SYNC); 
if (fd < 0) { 
    printf("Could not open memory\n"); 
    exit(1); 
} 

// Pad configuration 
volatile ulong *pinconf; 
pinconf = (ulong*) mmap(NULL, 0x10000, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0x48000000); 
if (pinconf == MAP_FAILED) { 
    printf("Pinconf Mapping failed\n"); 
    close(fd); 
    exit(1); 
} 
// configure expansion header 
pinconf[0x2174/4] = 0x001A001A; // 
close(fd); 

Мой вопрос заключается в том, что какова цель деления 0x2174 на 4?

Я вижу, что 0x2174 представляет собой контакт, который я хотел бы настроить (CONTROL_PADCONF_UART2_CTS[15:0]) на http://www.ti.com/lit/ug/spruf98x/spruf98x.pdf страница778. Я вижу, что это 32-битный регистр. Но я не могу получить функциональность 0x2174 на 4 пункта ниже 16 бит этого регистра?

ответ

3

Это потому, что указатель имеет тип «ulong», который на этой платформе кажется 4 байта. Предполагая, что адрес регистра для pinconf равен 0x12174, вы должны разделить смещение на 0x10000 на 4, чтобы получить правильный индекс для массива ulongs (и, следовательно, правильный адрес байта).

2

Адрес арифметическим в C работает таким образом, что адрес pinconf[n] является адресом pinconf плюс п умножается на sizeof(ulong). Поэтому, когда sizeof(ulong) равно 4, вы разделите исходное смещение целевого слова на 4, чтобы получить индекс слова в массиве pinconf.

Смежные вопросы