Initializing UART driver causes execution to freeze. #121
-
| My setup for this is slightly different from the one shown, but only slightly. I'm using  Now after introducing  For example, in the  fn flush(&self) {
    // Execution doesn't enter the loop because on checking the FR, it freezes
    while self.registers.FR.matches_all(FR::BUSY::SET) {
      cpu::nop();
    }
  }Similarly, if I comment everything else out from the  self.registers.CR.set(0);
// this also causes execution to freezeI'm able to write to the same memory location with  // this works
unsafe { core::ptr::write_volatile(0x3F20_1030 as *mut usize, (0b1 << 31)); }I'm now out of ideas on what to try, I've tried looking at the disassembly with  Here is my repository if that helps. Right now I've modified the  | 
Beta Was this translation helpful? Give feedback.
Replies: 3 comments 11 replies
-
| The GitHub actions CI has tests for the UART output as provided by QEMU, and it seems that still works, so I assume it must be something local on your setup. Unsure when I will find time to look at it, but I’ll try to check it when I can. | 
Beta Was this translation helpful? Give feedback.
-
| A little update which doesn't really help a great deal but still something to consider maybe.   pub fn init(&mut self) {
    // self.flush();
    unsafe {
      let fr = read_volatile(0x3f20_1018 as *mut u32);
      while (fr & (0b1<<3 as u32)) != 0 {
        cpu::nop();
      }
    }
    // self.registers.CR.set(0);
    unsafe { write_volatile(0x3f20_1030 as *mut u32, 0 as u32) };
    // self.registers.ICR.write(ICR::ALL::CLEAR);
    unsafe { write_volatile(0x3f20_1044 as *mut u32, 0 as u32) };
    // Set the baud rate, 8N1 and FIFO enabled.
    unsafe {
      // self.registers.IBRD.write(IBRD::BAUD_DIVINT.val(3));
      write_volatile(0x3f20_1024 as *mut u32, (
        read_volatile(0x3f20_1024 as *mut u32) & 0b1111111111111111
      ));
      
      // self.registers.FBRD.write(FBRD::BAUD_DIVFRAC.val(16));
      write_volatile(0x3f20_1028 as *mut u32, (
        read_volatile(0x3f20_1028 as *mut u32) & 0b111111
      ));
      
      // self.registers.LCR_H.write(LCR_H::WLEN::EightBit + LCR_H::FEN::FifosEnabled); 
      write_volatile(0x3f20_102c as *mut u32, (
        (read_volatile(0x3f20_102c as *mut u32) & 0b11<<5)
        +
        (read_volatile(0x3f20_102c as *mut u32) & 0b1<<4)
      ));
    }
    
    // Turn the UART on.
    // self.registers.CR.write(CR::UARTEN::Enabled + CR::TXE::Enabled + CR::RXE::Enabled);
    unsafe {
      write_volatile(0x3f20_1030 as *mut u32, (
        (0b1<<9 + 0b1<<8 + 0b1) as u32
      ));
    }
  }This doesn't cause any issues as such which I suppose is expected. But I still don't know if this is right since this might not be doing the exact same things as  | 
Beta Was this translation helpful? Give feedback.
-
| The problem was being caused by a few misplaced  | 
Beta Was this translation helpful? Give feedback.
The problem was being caused by a few misplaced
#[cfg(feature = "...")]