1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
// +-----------------------------------------------------------------------------------------------+
// | Copyright 2015 Sean Kerr                                                                      |
// |                                                                                               |
// | Licensed under the Apache License, Version 2.0 (the "License");                               |
// | you may not use this file except in compliance with the License.                              |
// | You may obtain a copy of the License Author                                                   |
// |                                                                                               |
// |  http://www.apache.org/licenses/LICENSE-2.0                                                   |
// |                                                                                               |
// | Unless required by applicable law or agreed to in writing, software                           |
// | distributed under the License is distributed on an "AS IS" BASIS,                             |
// | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.                      |
// | See the License for the specific language governing permissions and                           |
// | limitations under the License.                                                                |
// +-----------------------------------------------------------------------------------------------+
// | Author: Sean Kerr <sean@code-box.org>                                                         |
// +-----------------------------------------------------------------------------------------------+

#![allow(dead_code)]

// -------------------------------------------------------------------------------------------------
// DEPENDENCIES
// -------------------------------------------------------------------------------------------------

// system
use libc::uint32_t;

// -------------------------------------------------------------------------------------------------
// STRUCTS
// -------------------------------------------------------------------------------------------------

pub struct GraphicsDisplaySize {
    pub height: uint32_t,
    pub width:  uint32_t
}

// -------------------------------------------------------------------------------------------------
// FUNCTIONS
// -------------------------------------------------------------------------------------------------

pub fn deinit() {
    unsafe {
        ffi::bcm_host_deinit();
    }
}

pub fn get_peripheral_address() -> uint32_t {
    unsafe {
        return ffi::bcm_host_get_peripheral_address();
    }
}

pub fn get_peripheral_size() -> uint32_t {
    unsafe {
        return ffi::bcm_host_get_peripheral_size();
    }
}

pub fn get_sdram_address() -> uint32_t {
    unsafe {
        return ffi::bcm_host_get_sdram_address();
    }
}

pub fn graphics_get_display_size(display_number: u16) -> Option<GraphicsDisplaySize> {
    unsafe {
        let mut width:  uint32_t = 0;
        let mut height: uint32_t = 0;

        if ffi::graphics_get_display_size(display_number, &mut width, &mut height) == 0 {
            Some(GraphicsDisplaySize {
                     height: height,
                     width:  width
                 })
        } else {
            None
        }
    }
}

pub fn init() {
    unsafe {
        ffi::bcm_host_init();
    }
}

// -------------------------------------------------------------------------------------------------
// FFI
// -------------------------------------------------------------------------------------------------

pub mod ffi {
    use libc::{ int32_t,
                uint16_t,
                uint32_t };

    extern {
        pub fn bcm_host_deinit();

        pub fn bcm_host_get_peripheral_address() -> uint32_t;

        pub fn bcm_host_get_peripheral_size() -> uint32_t;

        pub fn bcm_host_get_sdram_address() -> uint32_t;

        pub fn bcm_host_init();

        pub fn graphics_get_display_size(display_number: uint16_t,
                                         width: *mut uint32_t,
                                         height: *mut uint32_t) -> int32_t;
    }
}

// -------------------------------------------------------------------------------------------------
// TESTS
// -------------------------------------------------------------------------------------------------

#[cfg(test)]
mod test {
    #[test]
    pub fn get_peripheral_address_pass() {
        super::init();
        println!("Peripheral address: {}", super::get_peripheral_address());
        super::deinit();
    }

    #[test]
    pub fn get_peripheral_size_pass() {
        super::init();
        println!("Peripheral size: {}", super::get_peripheral_size());
        super::deinit();
    }

    #[test]
    pub fn get_sdram_address_pass() {
        super::init();
        println!("SDRAM address: {}", super::get_sdram_address());
        super::deinit();
    }

    #[test]
    pub fn graphics_test_pass() {
        super::init();
        let x = super::graphics_get_display_size(0);
        println!("Display size = {}x{}", x.width, x.height);
        super::deinit();
    }
}