-
Notifications
You must be signed in to change notification settings - Fork 4
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
verify mini_b9s_installer in arm9 memory before memcpy
safer unsafe mode
- Loading branch information
zoogie
authored and
zoogie
committed
Apr 30, 2020
1 parent
5608f0e
commit f5d20a9
Showing
4 changed files
with
163 additions
and
2 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,113 @@ | ||
#include "i2c.h" | ||
|
||
//----------------------------------------------------------------------------- | ||
|
||
static const struct { u8 bus_id, reg_addr; } dev_data[] = { | ||
{0, 0x4A}, {0, 0x7A}, {0, 0x78}, | ||
{1, 0x4A}, {1, 0x78}, {1, 0x2C}, | ||
{1, 0x2E}, {1, 0x40}, {1, 0x44}, | ||
{2, 0xD6}, {2, 0xD0}, {2, 0xD2}, | ||
{2, 0xA4}, {2, 0x9A}, {2, 0xA0}, | ||
}; | ||
|
||
static inline u8 i2cGetDeviceBusId(u8 device_id) | ||
{ | ||
return dev_data[device_id].bus_id; | ||
} | ||
|
||
static inline u8 i2cGetDeviceRegAddr(u8 device_id) | ||
{ | ||
return dev_data[device_id].reg_addr; | ||
} | ||
|
||
//----------------------------------------------------------------------------- | ||
|
||
static vu8 *reg_data_addrs[] = { | ||
(vu8 *)(I2C1_REG_OFF + I2C_REG_DATA), | ||
(vu8 *)(I2C2_REG_OFF + I2C_REG_DATA), | ||
(vu8 *)(I2C3_REG_OFF + I2C_REG_DATA), | ||
}; | ||
|
||
static inline vu8 *i2cGetDataReg(u8 bus_id) | ||
{ | ||
return reg_data_addrs[bus_id]; | ||
} | ||
|
||
//----------------------------------------------------------------------------- | ||
|
||
static vu8 *reg_cnt_addrs[] = { | ||
(vu8 *)(I2C1_REG_OFF + I2C_REG_CNT), | ||
(vu8 *)(I2C2_REG_OFF + I2C_REG_CNT), | ||
(vu8 *)(I2C3_REG_OFF + I2C_REG_CNT), | ||
}; | ||
|
||
static inline vu8 *i2cGetCntReg(u8 bus_id) | ||
{ | ||
return reg_cnt_addrs[bus_id]; | ||
} | ||
|
||
//----------------------------------------------------------------------------- | ||
|
||
static inline void i2cWaitBusy(u8 bus_id) | ||
{ | ||
while (*i2cGetCntReg(bus_id) & 0x80); | ||
} | ||
|
||
static inline bool i2cGetResult(u8 bus_id) | ||
{ | ||
i2cWaitBusy(bus_id); | ||
|
||
return (*i2cGetCntReg(bus_id) >> 4) & 1; | ||
} | ||
|
||
static void i2cStop(u8 bus_id, u8 arg0) | ||
{ | ||
*i2cGetCntReg(bus_id) = (arg0 << 5) | 0xC0; | ||
i2cWaitBusy(bus_id); | ||
*i2cGetCntReg(bus_id) = 0xC5; | ||
} | ||
|
||
//----------------------------------------------------------------------------- | ||
|
||
static bool i2cSelectDevice(u8 bus_id, u8 dev_reg) | ||
{ | ||
i2cWaitBusy(bus_id); | ||
*i2cGetDataReg(bus_id) = dev_reg; | ||
*i2cGetCntReg(bus_id) = 0xC2; | ||
|
||
return i2cGetResult(bus_id); | ||
} | ||
|
||
static bool i2cSelectRegister(u8 bus_id, u8 reg) | ||
{ | ||
i2cWaitBusy(bus_id); | ||
*i2cGetDataReg(bus_id) = reg; | ||
*i2cGetCntReg(bus_id) = 0xC0; | ||
|
||
return i2cGetResult(bus_id); | ||
} | ||
|
||
//----------------------------------------------------------------------------- | ||
|
||
bool i2cWriteRegister(u8 dev_id, u8 reg, u8 data) | ||
{ | ||
u8 bus_id = i2cGetDeviceBusId(dev_id), | ||
dev_addr = i2cGetDeviceRegAddr(dev_id); | ||
|
||
for(u32 i = 0; i < 8; i++) | ||
{ | ||
if(i2cSelectDevice(bus_id, dev_addr) && i2cSelectRegister(bus_id, reg)) | ||
{ | ||
i2cWaitBusy(bus_id); | ||
*i2cGetDataReg(bus_id) = data; | ||
*i2cGetCntReg(bus_id) = 0xC1; | ||
i2cStop(bus_id, 0); | ||
|
||
if(i2cGetResult(bus_id)) return true; | ||
} | ||
*i2cGetCntReg(bus_id) = 0xC5; | ||
i2cWaitBusy(bus_id); | ||
} | ||
|
||
return false; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,18 @@ | ||
#pragma once | ||
|
||
#include "types.h" | ||
|
||
#define I2C1_REG_OFF 0x10161000 | ||
#define I2C2_REG_OFF 0x10144000 | ||
#define I2C3_REG_OFF 0x10148000 | ||
|
||
#define I2C_REG_DATA 0 | ||
#define I2C_REG_CNT 1 | ||
#define I2C_REG_CNTEX 2 | ||
#define I2C_REG_SCL 4 | ||
|
||
#define I2C_DEV_MCU 3 | ||
#define I2C_DEV_GYRO 10 | ||
#define I2C_DEV_IR 13 | ||
|
||
bool i2cWriteRegister(u8 dev_id, u8 reg, u8 data); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters