commit
252b9aa01c
|
@ -15,9 +15,10 @@
|
|||
#include "drv_fb.h"
|
||||
#include "mmu.h"
|
||||
|
||||
#define LCD_WIDTH (640)
|
||||
#define LCD_WIDTH (800)
|
||||
#define LCD_HEIGHT (480)
|
||||
#define LCD_DEPTH (32)
|
||||
#define LCD_BPP (32)
|
||||
|
||||
#define TAG_ALLOCATE_BUFFER 0x00040001
|
||||
#define TAG_SET_PHYS_WIDTH_HEIGHT 0x00048003
|
||||
|
@ -28,6 +29,39 @@
|
|||
#define TAG_SET_VIRT_OFFSET 0x00048009
|
||||
#define TAG_END 0x00000000
|
||||
|
||||
|
||||
enum {
|
||||
MBOX_TAG_FB_GET_GPIOVIRT = 0x00040010,
|
||||
MBOX_TAG_FB_ALLOCATE_BUFFER = 0x00040001,
|
||||
MBOX_TAG_FB_RELEASE_BUFFER = 0x00048001,
|
||||
MBOX_TAG_FB_BLANK_SCREEN = 0x00040002,
|
||||
MBOX_TAG_FB_GET_PHYS_WH = 0x00040003,
|
||||
MBOX_TAG_FB_TEST_PHYS_WH = 0x00044003,
|
||||
MBOX_TAG_FB_SET_PHYS_WH = 0x00048003,
|
||||
MBOX_TAG_FB_GET_VIRT_WH = 0x00040004,
|
||||
MBOX_TAG_FB_TEST_VIRT_WH = 0x00044004,
|
||||
MBOX_TAG_FB_SET_VIRT_WH = 0x00048004,
|
||||
MBOX_TAG_FB_GET_DEPTH = 0x00040005,
|
||||
MBOX_TAG_FB_TEST_DEPTH = 0x00044005,
|
||||
MBOX_TAG_FB_SET_DEPTH = 0x00048005,
|
||||
MBOX_TAG_FB_GET_PIXEL_ORDER = 0x00040006,
|
||||
MBOX_TAG_FB_TEST_PIXEL_ORDER = 0x00044006,
|
||||
MBOX_TAG_FB_SET_PIXEL_ORDER = 0x00048006,
|
||||
MBOX_TAG_FB_GET_ALPHA_MODE = 0x00040007,
|
||||
MBOX_TAG_FB_TEST_ALPHA_MODE = 0x00044007,
|
||||
MBOX_TAG_FB_SET_ALPHA_MODE = 0x00048007,
|
||||
MBOX_TAG_FB_GET_PITCH = 0x00040008,
|
||||
MBOX_TAG_FB_GET_VIRT_OFFSET = 0x00040009,
|
||||
MBOX_TAG_FB_TEST_VIRT_OFFSET = 0x00044009,
|
||||
MBOX_TAG_FB_SET_VIRT_OFFSET = 0x00048009,
|
||||
MBOX_TAG_FB_GET_OVERSCAN = 0x0004000a,
|
||||
MBOX_TAG_FB_TEST_OVERSCAN = 0x0004400a,
|
||||
MBOX_TAG_FB_SET_OVERSCAN = 0x0004800a,
|
||||
MBOX_TAG_FB_GET_PALETTE = 0x0004000b,
|
||||
MBOX_TAG_FB_TEST_PALETTE = 0x0004400b,
|
||||
MBOX_TAG_FB_SET_PALETTE = 0x0004800b,
|
||||
};
|
||||
|
||||
#define LCD_DEVICE(dev) (struct rt_hdmi_fb_device*)(dev)
|
||||
|
||||
static struct rt_hdmi_fb_device _hdmi;
|
||||
|
@ -75,7 +109,7 @@ rt_err_t hdmi_fb_control(rt_device_t dev, int cmd, void *args)
|
|||
info->bits_per_pixel= LCD_DEPTH;
|
||||
info->width = lcd->width;
|
||||
info->height = lcd->height;
|
||||
info->framebuffer = lcd->fb;//(rt_uint8_t *)lcd->fb;
|
||||
info->framebuffer = lcd->fb;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
@ -119,38 +153,122 @@ rt_err_t rt_hdmi_fb_device_init(struct rt_hdmi_fb_device *hdmi_fb, const char *n
|
|||
return RT_EOK;
|
||||
}
|
||||
|
||||
int hdmi_fb_init(void)
|
||||
rt_uint32_t bcm283x_mbox_fb_get_gpiovirt(void)
|
||||
{
|
||||
mbox[0] = 8*4; // length of the message
|
||||
mbox[1] = MBOX_REQUEST; // this is a request message
|
||||
|
||||
mbox[2] = MBOX_TAG_FB_GET_GPIOVIRT;
|
||||
mbox[3] = 4; // buffer size
|
||||
mbox[4] = 0; // len
|
||||
|
||||
mbox[5] = 0; // id
|
||||
mbox[6] = 0;
|
||||
|
||||
mbox[7] = MBOX_TAG_LAST;
|
||||
mbox_call(8, MMU_DISABLE);
|
||||
return (mbox[5] & 0x3fffffff);
|
||||
}
|
||||
|
||||
rt_uint32_t bcm283x_mbox_fb_get_pitch(void)
|
||||
{
|
||||
mbox[0] = 8*4; // length of the message
|
||||
mbox[1] = MBOX_REQUEST; // this is a request message
|
||||
|
||||
mbox[2] = MBOX_TAG_FB_GET_PITCH;
|
||||
mbox[3] = 4; // buffer size
|
||||
mbox[4] = 0; // len
|
||||
|
||||
mbox[5] = 0; // id
|
||||
mbox[6] = 0;
|
||||
|
||||
mbox[7] = MBOX_TAG_LAST;
|
||||
mbox_call(8, MMU_DISABLE);
|
||||
return mbox[5];
|
||||
}
|
||||
|
||||
void bcm283x_mbox_fb_set_porder(int rgb)
|
||||
{
|
||||
mbox[0] = 8*4; // length of the message
|
||||
mbox[1] = MBOX_REQUEST; // this is a request message
|
||||
|
||||
mbox[2] = MBOX_TAG_FB_SET_PIXEL_ORDER;
|
||||
mbox[3] = 4; // buffer size
|
||||
mbox[4] = 4; // len
|
||||
|
||||
mbox[5] = rgb; // id
|
||||
mbox[6] = 0;
|
||||
|
||||
mbox[7] = MBOX_TAG_LAST;
|
||||
mbox_call(8, MMU_DISABLE);
|
||||
}
|
||||
|
||||
void bcm283x_mbox_fb_setoffset(int xoffset, int yoffset)
|
||||
{
|
||||
mbox[0] = 8*4; // length of the message
|
||||
mbox[1] = MBOX_REQUEST; // this is a request message
|
||||
|
||||
mbox[2] = MBOX_TAG_FB_SET_VIRT_OFFSET;
|
||||
mbox[3] = 8; // buffer size
|
||||
mbox[4] = 8; // len
|
||||
|
||||
mbox[5] = xoffset; // id
|
||||
mbox[6] = yoffset;
|
||||
|
||||
mbox[7] = MBOX_TAG_LAST;
|
||||
mbox_call(8, MMU_DISABLE);
|
||||
}
|
||||
|
||||
|
||||
void bcm283x_mbox_fb_setalpha(int alpha)
|
||||
{
|
||||
|
||||
mbox[0] = 8*4; // length of the message
|
||||
mbox[1] = MBOX_REQUEST; // this is a request message
|
||||
|
||||
mbox[2] = MBOX_TAG_FB_SET_ALPHA_MODE;
|
||||
mbox[3] = 4; // buffer size
|
||||
mbox[4] = 4; // len
|
||||
|
||||
mbox[5] = alpha; // id
|
||||
mbox[6] = 0;
|
||||
|
||||
mbox[7] = MBOX_TAG_LAST;
|
||||
mbox_call(8, MMU_DISABLE);
|
||||
}
|
||||
|
||||
void *bcm283x_mbox_fb_alloc(int width, int height, int bpp, int nrender)
|
||||
{
|
||||
mbox[0] = 4 * 35;
|
||||
mbox[1] = MBOX_REQUEST;
|
||||
|
||||
mbox[2] = TAG_ALLOCATE_BUFFER;//get framebuffer, gets alignment on request
|
||||
mbox[3] = 8;
|
||||
mbox[4] = 0;
|
||||
mbox[5] = 4096; //FrameBufferInfo.pointer
|
||||
mbox[6] = 0; //FrameBufferInfo.size
|
||||
mbox[3] = 8; //size
|
||||
mbox[4] = 4; //len
|
||||
mbox[5] = 4096; //The design of MBOX driver forces us to give the virtual address 0x3C100000
|
||||
mbox[6] = 0; //FrameBufferInfo.size
|
||||
|
||||
mbox[7] = TAG_SET_PHYS_WIDTH_HEIGHT;
|
||||
mbox[8] = 8;
|
||||
mbox[9] = 0;
|
||||
mbox[10] = LCD_WIDTH;
|
||||
mbox[11] = LCD_HEIGHT;
|
||||
mbox[9] = 8;
|
||||
mbox[10] = width;
|
||||
mbox[11] = height;
|
||||
|
||||
mbox[12] = TAG_SET_VIRT_WIDTH_HEIGHT;
|
||||
mbox[13] = 8;
|
||||
mbox[14] = 0;
|
||||
mbox[15] = LCD_WIDTH;
|
||||
mbox[16] = LCD_HEIGHT;
|
||||
mbox[14] = 8;
|
||||
mbox[15] = width;
|
||||
mbox[16] = height * nrender;
|
||||
|
||||
mbox[17] = TAG_SET_DEPTH;
|
||||
mbox[18] = 4;
|
||||
mbox[19] = 0;
|
||||
mbox[20] = 16; //FrameBufferInfo.depth RGB 565
|
||||
mbox[19] = 4;
|
||||
mbox[20] = bpp;
|
||||
|
||||
mbox[21] = TAG_SET_PIXEL_ORDER;
|
||||
mbox[22] = 4;
|
||||
mbox[23] = 0;
|
||||
mbox[24] = 1; //RGB, not BGR preferably
|
||||
mbox[24] = 0; //RGB, not BGR preferably
|
||||
|
||||
mbox[25] = TAG_GET_PITCH;
|
||||
mbox[26] = 4;
|
||||
|
@ -167,17 +285,25 @@ int hdmi_fb_init(void)
|
|||
|
||||
mbox_call(MBOX_CH_PROP, MMU_DISABLE);
|
||||
|
||||
_hdmi.fb = (rt_uint8_t *)(uintptr_t)(mbox[5] & 0x3FFFFFFF);
|
||||
return (void *)((rt_uint64_t)(mbox[5] & 0x3fffffff));
|
||||
}
|
||||
|
||||
int hdmi_fb_init(void)
|
||||
{
|
||||
_hdmi.fb = (rt_uint8_t *)bcm283x_mbox_fb_alloc(LCD_WIDTH, LCD_HEIGHT, LCD_BPP, 1);
|
||||
bcm283x_mbox_fb_setoffset(0, 0);
|
||||
bcm283x_mbox_fb_set_porder(0);
|
||||
_hdmi.width = LCD_WIDTH;
|
||||
_hdmi.height = LCD_HEIGHT;
|
||||
_hdmi.depth = LCD_DEPTH;
|
||||
_hdmi.pitch = 0;
|
||||
_hdmi.pixel_format = RTGRAPHIC_PIXEL_FORMAT_RGB888;
|
||||
|
||||
armv8_map((unsigned long)_hdmi.fb, (unsigned long)_hdmi.fb, 0x200000, MEM_ATTR_MEMORY);
|
||||
armv8_map((unsigned long)_hdmi.fb, (unsigned long)_hdmi.fb, 0x200000, MEM_ATTR_IO);
|
||||
|
||||
rt_kprintf("_hdmi.fb is %p\n", _hdmi.fb);
|
||||
rt_hw_dcache_invalidate_range((unsigned long)_hdmi.fb,LCD_WIDTH * LCD_HEIGHT * 3);
|
||||
|
||||
//rt_kprintf("_hdmi.fb is %p\n", _hdmi.fb);
|
||||
rt_hdmi_fb_device_init(&_hdmi, "lcd");
|
||||
|
||||
return 0;
|
||||
|
|
|
@ -47,3 +47,404 @@ int mbox_call(unsigned char ch, int mmu_enable)
|
|||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int bcm283x_mbox_hardware_get_model(void)
|
||||
{
|
||||
mbox[0] = 8*4; // length of the message
|
||||
mbox[1] = MBOX_REQUEST; // this is a request message
|
||||
|
||||
mbox[2] = MBOX_TAG_HARDWARE_GET_MODEL;
|
||||
mbox[3] = 4; // buffer size
|
||||
mbox[4] = 0; // len
|
||||
|
||||
mbox[5] = 0;
|
||||
mbox[6] = 0;
|
||||
|
||||
mbox[7] = MBOX_TAG_LAST;
|
||||
mbox_call(8, MMU_DISABLE);
|
||||
|
||||
return mbox[5];
|
||||
}
|
||||
|
||||
int bcm283x_mbox_hardware_get_revison(void)
|
||||
{
|
||||
mbox[0] = 8*4; // length of the message
|
||||
mbox[1] = MBOX_REQUEST; // this is a request message
|
||||
|
||||
mbox[2] = MBOX_TAG_HARDWARE_GET_REV;
|
||||
mbox[3] = 4; // buffer size
|
||||
mbox[4] = 0; // len
|
||||
|
||||
mbox[5] = 0;
|
||||
mbox[6] = 0;
|
||||
|
||||
mbox[7] = MBOX_TAG_LAST;
|
||||
mbox_call(8, MMU_DISABLE);
|
||||
|
||||
return mbox[5];
|
||||
}
|
||||
|
||||
int bcm283x_mbox_hardware_get_mac_address(uint8_t * mac)
|
||||
{
|
||||
mbox[0] = 8*4; // length of the message
|
||||
mbox[1] = MBOX_REQUEST; // this is a request message
|
||||
|
||||
mbox[2] = MBOX_TAG_HARDWARE_GET_MAC_ADDRESS;
|
||||
mbox[3] = 6; // buffer size
|
||||
mbox[4] = 0; // len
|
||||
|
||||
mbox[5] = 0;
|
||||
mbox[6] = 0;
|
||||
|
||||
mbox[7] = MBOX_TAG_LAST;
|
||||
mbox_call(8, MMU_DISABLE);
|
||||
|
||||
char * mac_str = (char *)&mbox[5];
|
||||
mac[0] = mac_str[0];
|
||||
mac[1] = mac_str[1];
|
||||
mac[2] = mac_str[2];
|
||||
mac[3] = mac_str[3];
|
||||
mac[4] = mac_str[4];
|
||||
mac[5] = mac_str[5];
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
int bcm283x_mbox_hardware_get_serial(rt_uint64_t* sn)
|
||||
{
|
||||
mbox[0] = 8*4; // length of the message
|
||||
mbox[1] = MBOX_REQUEST; // this is a request message
|
||||
|
||||
mbox[2] = MBOX_TAG_HARDWARE_GET_SERIAL;
|
||||
mbox[3] = 8; // buffer size
|
||||
mbox[4] = 0; // len
|
||||
|
||||
mbox[5] = 0;
|
||||
mbox[6] = 0;
|
||||
|
||||
mbox[7] = MBOX_TAG_LAST;
|
||||
mbox_call(8, MMU_DISABLE);
|
||||
|
||||
sn = (rt_uint64_t *)&mbox[5];
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int bcm283x_mbox_hardware_get_arm_memory(rt_uint32_t * base, rt_uint32_t * size)
|
||||
{
|
||||
mbox[0] = 8*4; // length of the message
|
||||
mbox[1] = MBOX_REQUEST; // this is a request message
|
||||
|
||||
mbox[2] = MBOX_TAG_HARDWARE_GET_ARM_MEMORY;
|
||||
mbox[3] = 8; // buffer size
|
||||
mbox[4] = 0; // len
|
||||
|
||||
mbox[5] = 0;
|
||||
mbox[6] = 0;
|
||||
|
||||
mbox[7] = MBOX_TAG_LAST;
|
||||
mbox_call(8, MMU_DISABLE);
|
||||
|
||||
*base = mbox[5];
|
||||
*size = mbox[6];
|
||||
|
||||
return 0;
|
||||
|
||||
}
|
||||
|
||||
int bcm283x_mbox_hardware_get_vc_memory(rt_uint32_t * base, rt_uint32_t * size)
|
||||
{
|
||||
mbox[0] = 8*4; // length of the message
|
||||
mbox[1] = MBOX_REQUEST; // this is a request message
|
||||
|
||||
mbox[2] = MBOX_TAG_HARDWARE_GET_VC_MEMORY;
|
||||
mbox[3] = 8; // buffer size
|
||||
mbox[4] = 0; // len
|
||||
|
||||
mbox[5] = 0;
|
||||
mbox[6] = 0;
|
||||
|
||||
mbox[7] = MBOX_TAG_LAST;
|
||||
mbox_call(8, MMU_DISABLE);
|
||||
|
||||
*base = mbox[5];
|
||||
*size = mbox[6];
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int bcm283x_mbox_clock_get_turbo(void)
|
||||
{
|
||||
mbox[0] = 8*4; // length of the message
|
||||
mbox[1] = MBOX_REQUEST; // this is a request message
|
||||
|
||||
mbox[2] = MBOX_TAG_CLOCK_GET_TURBO;
|
||||
mbox[3] = 8; // buffer size
|
||||
mbox[4] = 4; // len
|
||||
|
||||
mbox[5] = 0; // id
|
||||
mbox[6] = 0; // val
|
||||
|
||||
mbox[7] = MBOX_TAG_LAST;
|
||||
mbox_call(8, MMU_DISABLE);
|
||||
|
||||
if(mbox[5] != 0)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
|
||||
return mbox[6];
|
||||
}
|
||||
|
||||
int bcm283x_mbox_clock_set_turbo(int level)
|
||||
{
|
||||
mbox[0] = 8*4; // length of the message
|
||||
mbox[1] = MBOX_REQUEST; // this is a request message
|
||||
|
||||
mbox[2] = MBOX_TAG_CLOCK_SET_TURBO;
|
||||
mbox[3] = 8; // buffer size
|
||||
mbox[4] = 8; // len
|
||||
|
||||
mbox[5] = 0; // id
|
||||
mbox[6] = level ? 1 : 0;
|
||||
|
||||
mbox[7] = MBOX_TAG_LAST;
|
||||
mbox_call(8, MMU_DISABLE);
|
||||
|
||||
if(mbox[5] != 0)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
|
||||
return mbox[6];
|
||||
}
|
||||
|
||||
int bcm283x_mbox_clock_get_state(int id)
|
||||
{
|
||||
mbox[0] = 8*4; // length of the message
|
||||
mbox[1] = MBOX_REQUEST; // this is a request message
|
||||
|
||||
mbox[2] = MBOX_TAG_CLOCK_GET_STATE;
|
||||
mbox[3] = 8; // buffer size
|
||||
mbox[4] = 4; // len
|
||||
|
||||
mbox[5] = id; // id
|
||||
mbox[6] = 0;
|
||||
|
||||
mbox[7] = MBOX_TAG_LAST;
|
||||
mbox_call(8, MMU_DISABLE);
|
||||
|
||||
if(mbox[5] != id)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
|
||||
return (mbox[6] & 0x3);
|
||||
}
|
||||
|
||||
int bcm283x_mbox_clock_set_state(int id, int state)
|
||||
{
|
||||
mbox[0] = 8*4; // length of the message
|
||||
mbox[1] = MBOX_REQUEST; // this is a request message
|
||||
|
||||
mbox[2] = MBOX_TAG_CLOCK_SET_STATE;
|
||||
mbox[3] = 8; // buffer size
|
||||
mbox[4] = 8; // len
|
||||
|
||||
mbox[5] = id; // id
|
||||
mbox[6] = state & 0x3;
|
||||
|
||||
mbox[7] = MBOX_TAG_LAST;
|
||||
mbox_call(8, MMU_DISABLE);
|
||||
|
||||
if(mbox[5] != id)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
|
||||
return (mbox[6] & 0x3);
|
||||
}
|
||||
|
||||
int bcm283x_mbox_clock_get_rate(int id)
|
||||
{
|
||||
mbox[0] = 8*4; // length of the message
|
||||
mbox[1] = MBOX_REQUEST; // this is a request message
|
||||
|
||||
mbox[2] = MBOX_TAG_CLOCK_GET_RATE;
|
||||
mbox[3] = 8; // buffer size
|
||||
mbox[4] = 4; // len
|
||||
|
||||
mbox[5] = id; // id
|
||||
mbox[6] = 0;
|
||||
|
||||
mbox[7] = MBOX_TAG_LAST;
|
||||
mbox_call(8, MMU_DISABLE);
|
||||
|
||||
if(mbox[5] != id)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
|
||||
return mbox[6];
|
||||
}
|
||||
|
||||
int bcm283x_mbox_clock_set_rate(int id, int rate)
|
||||
{
|
||||
mbox[0] = 8*4; // length of the message
|
||||
mbox[1] = MBOX_REQUEST; // this is a request message
|
||||
|
||||
mbox[2] = MBOX_TAG_CLOCK_SET_RATE;
|
||||
mbox[3] = 8; // buffer size
|
||||
mbox[4] = 8; // len
|
||||
|
||||
mbox[5] = id; // id
|
||||
mbox[6] = rate;
|
||||
|
||||
mbox[7] = MBOX_TAG_LAST;
|
||||
mbox_call(8, MMU_DISABLE);
|
||||
|
||||
if(mbox[5] != id)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
|
||||
return mbox[6];
|
||||
}
|
||||
|
||||
int bcm283x_mbox_clock_get_max_rate(int id)
|
||||
{
|
||||
mbox[0] = 8*4; // length of the message
|
||||
mbox[1] = MBOX_REQUEST; // this is a request message
|
||||
|
||||
mbox[2] = MBOX_TAG_CLOCK_GET_MAX_RATE;
|
||||
mbox[3] = 8; // buffer size
|
||||
mbox[4] = 4; // len
|
||||
|
||||
mbox[5] = id; // id
|
||||
mbox[6] = 0;
|
||||
|
||||
mbox[7] = MBOX_TAG_LAST;
|
||||
mbox_call(8, MMU_DISABLE);
|
||||
|
||||
if(mbox[5] != id)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
|
||||
return mbox[6];
|
||||
}
|
||||
|
||||
int bcm283x_mbox_clock_get_min_rate(int id)
|
||||
{
|
||||
mbox[0] = 8*4; // length of the message
|
||||
mbox[1] = MBOX_REQUEST; // this is a request message
|
||||
|
||||
mbox[2] = MBOX_TAG_CLOCK_GET_MIN_RATE;
|
||||
mbox[3] = 8; // buffer size
|
||||
mbox[4] = 4; // len
|
||||
|
||||
mbox[5] = id; // id
|
||||
mbox[6] = 0;
|
||||
|
||||
mbox[7] = MBOX_TAG_LAST;
|
||||
mbox_call(8, MMU_DISABLE);
|
||||
|
||||
if(mbox[5] != id)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
|
||||
return mbox[6];
|
||||
}
|
||||
|
||||
int bcm283x_mbox_power_get_state(int id)
|
||||
{
|
||||
mbox[0] = 8*4; // length of the message
|
||||
mbox[1] = MBOX_REQUEST; // this is a request message
|
||||
|
||||
mbox[2] = MBOX_TAG_POWER_GET_STATE;
|
||||
mbox[3] = 8; // buffer size
|
||||
mbox[4] = 4; // len
|
||||
|
||||
mbox[5] = id; // id
|
||||
mbox[6] = 0;
|
||||
|
||||
mbox[7] = MBOX_TAG_LAST;
|
||||
mbox_call(8, MMU_DISABLE);
|
||||
|
||||
if(mbox[5] != id)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
|
||||
return (mbox[6] & 0x3);
|
||||
}
|
||||
|
||||
int bcm283x_mbox_power_set_state(int id, int state)
|
||||
{
|
||||
mbox[0] = 8*4; // length of the message
|
||||
mbox[1] = MBOX_REQUEST; // this is a request message
|
||||
|
||||
mbox[2] = MBOX_TAG_POWER_SET_STATE;
|
||||
mbox[3] = 8; // buffer size
|
||||
mbox[4] = 8; // len
|
||||
|
||||
mbox[5] = id; // id
|
||||
mbox[6] = state & 0x3;
|
||||
|
||||
mbox[7] = MBOX_TAG_LAST;
|
||||
mbox_call(8, MMU_DISABLE);
|
||||
|
||||
if(mbox[5] != id)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
|
||||
return (mbox[6] & 0x3);
|
||||
}
|
||||
|
||||
int bcm283x_mbox_temp_get(void)
|
||||
{
|
||||
mbox[0] = 8*4; // length of the message
|
||||
mbox[1] = MBOX_REQUEST; // this is a request message
|
||||
|
||||
mbox[2] = MBOX_TAG_TEMP_GET;
|
||||
mbox[3] = 8; // buffer size
|
||||
mbox[4] = 4; // len
|
||||
|
||||
mbox[5] = 0; //id
|
||||
mbox[6] = 0;
|
||||
|
||||
mbox[7] = MBOX_TAG_LAST;
|
||||
mbox_call(8, MMU_DISABLE);
|
||||
|
||||
if(mbox[5] != 0)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
|
||||
return mbox[6];
|
||||
}
|
||||
|
||||
int bcm283x_mbox_temp_get_max(void)
|
||||
{
|
||||
mbox[0] = 8*4; // length of the message
|
||||
mbox[1] = MBOX_REQUEST; // this is a request message
|
||||
|
||||
mbox[2] = MBOX_TAG_TEMP_GET_MAX;
|
||||
mbox[3] = 8; // buffer size
|
||||
mbox[4] = 4; // len
|
||||
|
||||
mbox[5] = 0; // id
|
||||
mbox[6] = 0;
|
||||
|
||||
mbox[7] = MBOX_TAG_LAST;
|
||||
mbox_call(8, MMU_DISABLE);
|
||||
|
||||
if(mbox[5] != 0)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
|
||||
return mbox[6];
|
||||
}
|
||||
|
|
|
@ -12,7 +12,7 @@
|
|||
#ifndef __MBOX_H__
|
||||
#define __MBOX_H__
|
||||
|
||||
|
||||
#include <rtthread.h>
|
||||
/* a properly aligned buffer */
|
||||
extern volatile unsigned int* mbox;
|
||||
|
||||
|
@ -56,7 +56,69 @@ extern volatile unsigned int* mbox;
|
|||
#define MMU_ENABLE 1
|
||||
#define MMU_DISABLE 0
|
||||
|
||||
/*
|
||||
* raspi hardware info
|
||||
*/
|
||||
enum {
|
||||
MBOX_TAG_HARDWARE_GET_MODEL = 0x00010001,
|
||||
MBOX_TAG_HARDWARE_GET_REV = 0x00010002,
|
||||
MBOX_TAG_HARDWARE_GET_MAC_ADDRESS = 0x00010003,
|
||||
MBOX_TAG_HARDWARE_GET_SERIAL = 0x00010004,
|
||||
MBOX_TAG_HARDWARE_GET_ARM_MEMORY = 0x00010005,
|
||||
MBOX_TAG_HARDWARE_GET_VC_MEMORY = 0x00010006,
|
||||
MBOX_TAG_HARDWARE_GET_CLOCKS = 0x00010007,
|
||||
};
|
||||
|
||||
/*
|
||||
* raspi clock
|
||||
*/
|
||||
enum {
|
||||
MBOX_TAG_CLOCK_GET_TURBO = 0x00030009,
|
||||
MBOX_TAG_CLOCK_SET_TURBO = 0x00038009,
|
||||
MBOX_TAG_CLOCK_GET_STATE = 0x00030001,
|
||||
MBOX_TAG_CLOCK_SET_STATE = 0x00038001,
|
||||
MBOX_TAG_CLOCK_GET_RATE = 0x00030002,
|
||||
MBOX_TAG_CLOCK_SET_RATE = 0x00038002,
|
||||
MBOX_TAG_CLOCK_GET_MAX_RATE = 0x00030004,
|
||||
MBOX_TAG_CLOCK_GET_MIN_RATE = 0x00030007,
|
||||
};
|
||||
|
||||
/*
|
||||
* raspi power
|
||||
*/
|
||||
enum {
|
||||
MBOX_TAG_POWER_GET_STATE = 0x00020001,
|
||||
MBOX_TAG_POWER_SET_STATE = 0x00028001,
|
||||
};
|
||||
|
||||
/*
|
||||
* raspi temperature
|
||||
*/
|
||||
enum {
|
||||
MBOX_TAG_TEMP_GET = 0x00030006,
|
||||
MBOX_TAG_TEMP_GET_MAX = 0x0003000A,
|
||||
};
|
||||
|
||||
#define MBOX_ADDR 0xc00000
|
||||
|
||||
int mbox_call(unsigned char ch, int mmu_enable);
|
||||
int bcm283x_mbox_hardware_get_model(void);
|
||||
int bcm283x_mbox_hardware_get_revison(void);
|
||||
int bcm283x_mbox_hardware_get_mac_address(uint8_t * mac);
|
||||
int bcm283x_mbox_hardware_get_serial(rt_uint64_t* sn);
|
||||
int bcm283x_mbox_hardware_get_arm_memory(rt_uint32_t * base, rt_uint32_t * size);
|
||||
int bcm283x_mbox_hardware_get_vc_memory(rt_uint32_t * base, rt_uint32_t * size);
|
||||
int bcm283x_mbox_clock_get_turbo(void);
|
||||
int bcm283x_mbox_clock_set_turbo(int level);
|
||||
int bcm283x_mbox_clock_get_state(int id);
|
||||
int bcm283x_mbox_clock_set_state(int id, int state);
|
||||
int bcm283x_mbox_clock_get_rate(int id);
|
||||
int bcm283x_mbox_clock_set_rate(int id, int rate);
|
||||
int bcm283x_mbox_clock_get_max_rate(int id);
|
||||
int bcm283x_mbox_clock_get_min_rate(int id);
|
||||
int bcm283x_mbox_power_get_state(int id);
|
||||
int bcm283x_mbox_power_set_state(int id, int state);
|
||||
int bcm283x_mbox_temp_get(void);
|
||||
int bcm283x_mbox_temp_get_max(void);
|
||||
|
||||
#endif
|
||||
|
|
Loading…
Reference in New Issue