Ktam3874/pitx software guide – Kontron KTAM3874-pITX User Manual
Page 37

KTD-S0057-I
Page 33 Linux® Programming Examples (DebianTM)
KTAM3874/pITX Software Guide
int main (int argc, char **argv)
{
int
fd;
void *map_base, *virt_addr;
unsigned long read_result, writeval;
off_t
target;
int access_type = 'd';
if (argc < 2)
{
fprintf (stderr, "\nUsage:\t%s {address} [type [data]]\n"
"\taddress : memory address to act upon\n"
"\ttype : access operation type : [b]yte, [w]ord, [d]word\n"
"\tdata : data to be written\n\n", argv[0]);
exit
(1);
}
target = strtoul (argv[1], NULL, 16);
if (argc > 2)
access_type = tolower (argv[2][0]);
if ((fd = open ("/dev/mem", O_RDWR | O_SYNC)) == -1) FATAL;
map_base = mmap (0, MAP_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, target & ~MAP_MASK);
if (map_base == (void *) -1) FATAL;
virt_addr = map_base + (target & MAP_MASK);
switch
(access_type)
{
case 'b': read_result = *((unsigned char *) virt_addr); break;
case 'w': read_result = *((unsigned short *) virt_addr); break;
case 'd': read_result = *((unsigned long *) virt_addr); break;
default : fprintf (stderr, "Illegal data type '%c'.\n", access_type); exit (2);
}
printf ("Value at address 0x%lX: 0x%lX\n", target, read_result);
fflush
(stdout);
if (argc > 3)
{
writeval = strtoul (argv[3], NULL, 16);
switch
(access_type)
{
case 'b': *((unsigned char *) virt_addr) = writeval;
read_result = *((unsigned char *) virt_addr);
break;
case 'w': *((unsigned short *) virt_addr) = writeval;
read_result = *((unsigned short *) virt_addr);
break;
case 'd': *((unsigned long *) virt_addr) = writeval;
read_result = *((unsigned long *) virt_addr);
break;
}
printf ("Written: 0x%lX - Readback: 0x%lX\n", writeval, read_result);
fflush
(stdout);
}
K