Re: [beagleboard] Crashing accessing mmap location

2015-05-21 Thread liyaoshi
You can try only map 4Bytes


2015-05-22 3:13 GMT+08:00 Jacek Radzikowski jacek.radzikow...@gmail.com:

 Clocks for some of the GPIO modules are not enabled by default, and
 accessing them will cause BUS error. The easiest workaround is to
 export one pin from each of the modules using /sys interface:
 https://groups.google.com/d/msg/beagleboard/OYFp4EXawiI/Mq6s3sg14HoJ
 Here is a short script which does the job:
 https://github.com/piranha32/IOoo/blob/master/tools/bbb_enable_gpio.sh

 Regards,
 j.


 On Thu, May 21, 2015 at 2:59 PM,  ja...@dfsoftware.com wrote:
  I've been working to get the access to the GPIO registers to replace the
  existing sys access we are using now. However, I'm crashing accessing
 both
  GPIO 2 and 3 (1 and 2 appear fine). I'm sure I'm just doing something
  stupid. Here is some basic setup:
 
  __off_t MUX_OFFSET[] = {
  0x44E07000, // GPIO 0
  0x4804C000, // GPIO 1
  0x481AC000, // GPIO 2
  0x481AE000  // GPIO 3
  };
 
  struct MUX_LAYOUT
  {
  uint8_t *gpio_addr;
  uint32_t *gpio_oe_addr;
  uint32_t *gpio_setdataout_addr;
  uint32_t *gpio_cleardataout_addr;
  uint32_t *gpio_dataout_addr;
  uint32_t *gpio_datain_addr;
  };
 
  MUX_LAYOUT MUXes[4];
 
  #define GPIO_MEM_LENGTH 0xfff
  #define GPIO_OE 0x134
  #define GPIO_SETDATAOUT 0x194
  #define GPIO_CLEARDATAOUT 0x190
  #define GPIO_DATAOUT 0x13C
  #define GPIO_DATAIN 0x138
 
  Then here is example code that will always crash on accessing GPIO 2:
 
  fd = open(/dev/mem, O_RDWR);
 
  for( size_t gpio = 0; gpio  4; ++gpio)
  {
  MUX_LAYOUT mux = MUXes[gpio];
 
  mux.gpio_addr = (uint8_t*)mmap(0, GPIO_MEM_LENGTH, PROT_READ |
  PROT_WRITE, MAP_SHARED, fd, MUX_OFFSET[gpio]);
 
  if(mux.gpio_addr == MAP_FAILED)
  {
  throw MSC_EXCEPTION(Unable to map texpr PIO);
  }
 
  mux.gpio_oe_addr   = (uint32_t *)(mux.gpio_addr + GPIO_OE);
  mux.gpio_setdataout_addr   = (uint32_t *)(mux.gpio_addr +
  GPIO_SETDATAOUT);
  mux.gpio_cleardataout_addr = (uint32_t *)(mux.gpio_addr +
  GPIO_CLEARDATAOUT);
  mux.gpio_dataout_addr  = (uint32_t *)(mux.gpio_addr +
 GPIO_DATAOUT);
  mux.gpio_datain_addr   = (uint32_t *)(mux.gpio_addr +
 GPIO_DATAIN);
 
  // Crashes here when gpio == 2
  uint32_t temp = *mux.gpio_datain_addr;
  }
 
  In this case I'm crashing dereferencing gpio_datain_addr, but it will
 crash
  accessing any of the pointers created when setting up GPIO 2 and 3. Any
  thoughts? I'm running a relatively current debian build.
 
  Thanks for the help,
 
  Jared
 
  --
  For more options, visit http://beagleboard.org/discuss
  ---
  You received this message because you are subscribed to the Google Groups
  BeagleBoard group.
  To unsubscribe from this group and stop receiving emails from it, send an
  email to beagleboard+unsubscr...@googlegroups.com.
  For more options, visit https://groups.google.com/d/optout.



 --
 Given a choice between two theories, take the one which is funnier

 --
 For more options, visit http://beagleboard.org/discuss
 ---
 You received this message because you are subscribed to the Google Groups
 BeagleBoard group.
 To unsubscribe from this group and stop receiving emails from it, send an
 email to beagleboard+unsubscr...@googlegroups.com.
 For more options, visit https://groups.google.com/d/optout.


-- 
For more options, visit http://beagleboard.org/discuss
--- 
You received this message because you are subscribed to the Google Groups 
BeagleBoard group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to beagleboard+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.


Re: [beagleboard] Crashing accessing mmap location

2015-05-21 Thread Jacek Radzikowski
Clocks for some of the GPIO modules are not enabled by default, and
accessing them will cause BUS error. The easiest workaround is to
export one pin from each of the modules using /sys interface:
https://groups.google.com/d/msg/beagleboard/OYFp4EXawiI/Mq6s3sg14HoJ
Here is a short script which does the job:
https://github.com/piranha32/IOoo/blob/master/tools/bbb_enable_gpio.sh

Regards,
j.


On Thu, May 21, 2015 at 2:59 PM,  ja...@dfsoftware.com wrote:
 I've been working to get the access to the GPIO registers to replace the
 existing sys access we are using now. However, I'm crashing accessing both
 GPIO 2 and 3 (1 and 2 appear fine). I'm sure I'm just doing something
 stupid. Here is some basic setup:

 __off_t MUX_OFFSET[] = {
 0x44E07000, // GPIO 0
 0x4804C000, // GPIO 1
 0x481AC000, // GPIO 2
 0x481AE000  // GPIO 3
 };

 struct MUX_LAYOUT
 {
 uint8_t *gpio_addr;
 uint32_t *gpio_oe_addr;
 uint32_t *gpio_setdataout_addr;
 uint32_t *gpio_cleardataout_addr;
 uint32_t *gpio_dataout_addr;
 uint32_t *gpio_datain_addr;
 };

 MUX_LAYOUT MUXes[4];

 #define GPIO_MEM_LENGTH 0xfff
 #define GPIO_OE 0x134
 #define GPIO_SETDATAOUT 0x194
 #define GPIO_CLEARDATAOUT 0x190
 #define GPIO_DATAOUT 0x13C
 #define GPIO_DATAIN 0x138

 Then here is example code that will always crash on accessing GPIO 2:

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

 for( size_t gpio = 0; gpio  4; ++gpio)
 {
 MUX_LAYOUT mux = MUXes[gpio];

 mux.gpio_addr = (uint8_t*)mmap(0, GPIO_MEM_LENGTH, PROT_READ |
 PROT_WRITE, MAP_SHARED, fd, MUX_OFFSET[gpio]);

 if(mux.gpio_addr == MAP_FAILED)
 {
 throw MSC_EXCEPTION(Unable to map texpr PIO);
 }

 mux.gpio_oe_addr   = (uint32_t *)(mux.gpio_addr + GPIO_OE);
 mux.gpio_setdataout_addr   = (uint32_t *)(mux.gpio_addr +
 GPIO_SETDATAOUT);
 mux.gpio_cleardataout_addr = (uint32_t *)(mux.gpio_addr +
 GPIO_CLEARDATAOUT);
 mux.gpio_dataout_addr  = (uint32_t *)(mux.gpio_addr + GPIO_DATAOUT);
 mux.gpio_datain_addr   = (uint32_t *)(mux.gpio_addr + GPIO_DATAIN);

 // Crashes here when gpio == 2
 uint32_t temp = *mux.gpio_datain_addr;
 }

 In this case I'm crashing dereferencing gpio_datain_addr, but it will crash
 accessing any of the pointers created when setting up GPIO 2 and 3. Any
 thoughts? I'm running a relatively current debian build.

 Thanks for the help,

 Jared

 --
 For more options, visit http://beagleboard.org/discuss
 ---
 You received this message because you are subscribed to the Google Groups
 BeagleBoard group.
 To unsubscribe from this group and stop receiving emails from it, send an
 email to beagleboard+unsubscr...@googlegroups.com.
 For more options, visit https://groups.google.com/d/optout.



-- 
Given a choice between two theories, take the one which is funnier

-- 
For more options, visit http://beagleboard.org/discuss
--- 
You received this message because you are subscribed to the Google Groups 
BeagleBoard group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to beagleboard+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.