mirror of
https://github.com/CTCaer/hekate
synced 2024-12-22 03:11:16 +00:00
bm92t30 Add USB-PD driver stub
TODO: This driver is a stub and relies on incorrect I2C requests. The I2C driver needs to be updated with proper multi-xfer support. For now it replies its whole register range, according to request size. That's because the IC does not support the classic single transfer request-response style.
This commit is contained in:
parent
8f7bdd45b1
commit
8b837dd81b
2 changed files with 105 additions and 0 deletions
65
bdk/power/bm92t30_stub.c
Normal file
65
bdk/power/bm92t30_stub.c
Normal file
|
@ -0,0 +1,65 @@
|
|||
/*
|
||||
* USB-PD driver for Nintendo Switch's TI BM92T30
|
||||
*
|
||||
* Copyright (c) 2020 CTCaer
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms and conditions of the GNU General Public License,
|
||||
* version 2, as published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||
* more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/*
|
||||
* TODO:
|
||||
* This driver is a stub and relies on incorrect I2C requests.
|
||||
* The I2C driver needs to be updated with proper multi-xfer support.
|
||||
*
|
||||
* For now it replies its whole register range, according to request
|
||||
* size. That's because the IC does not support the classic single
|
||||
* transfer request-response style.
|
||||
*/
|
||||
|
||||
#include <string.h>
|
||||
|
||||
#include "bm92t30_stub.h"
|
||||
#include <soc/i2c.h>
|
||||
#include <utils/util.h>
|
||||
|
||||
#define STATUS1_INSERT 0x80
|
||||
|
||||
typedef struct _pdo_t{
|
||||
u32 amp:10;
|
||||
u32 volt:10;
|
||||
u32 info:10;
|
||||
u32 type:2;
|
||||
} pdo_t;
|
||||
|
||||
void bm92t30_get_charger_type(bool *inserted, usb_pd_objects_t *usb_pd)
|
||||
{
|
||||
u8 buf[32];
|
||||
pdo_t pdos[7];
|
||||
i2c_recv_buf_big(buf, 32, I2C_1, BM92T30_I2C_ADDR, 0);
|
||||
|
||||
if (inserted)
|
||||
*inserted = buf[6] & STATUS1_INSERT ? true : false;
|
||||
memcpy(pdos, &buf[17], 15); // We can only get max 4 objects.
|
||||
|
||||
if (usb_pd)
|
||||
{
|
||||
memset(usb_pd, 0, sizeof(usb_pd_objects_t));
|
||||
usb_pd->pdo_no = MIN(buf[16] / sizeof(pdo_t), 4); // We can only get max 4 objects.
|
||||
|
||||
for (u32 i = 0; i < usb_pd->pdo_no; i++)
|
||||
{
|
||||
usb_pd->pdos[i].amperage = pdos[i].amp * 10;
|
||||
usb_pd->pdos[i].voltage = (pdos[i].volt * 50) / 1000;
|
||||
}
|
||||
}
|
||||
}
|
40
bdk/power/bm92t30_stub.h
Normal file
40
bdk/power/bm92t30_stub.h
Normal file
|
@ -0,0 +1,40 @@
|
|||
/*
|
||||
* USB-PD driver for Nintendo Switch's TI BM92T30
|
||||
*
|
||||
* Copyright (c) 2020 CTCaer
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms and conditions of the GNU General Public License,
|
||||
* version 2, as published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||
* more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef __BM92T30_H_
|
||||
#define __BM92T30_H_
|
||||
|
||||
#include <utils/types.h>
|
||||
|
||||
#define BM92T30_I2C_ADDR 0x18
|
||||
|
||||
typedef struct _usb_pd_object_t
|
||||
{
|
||||
u32 amperage;
|
||||
u32 voltage;
|
||||
} usb_pd_object_t;
|
||||
|
||||
typedef struct _usb_pd_objects_t
|
||||
{
|
||||
u32 pdo_no;
|
||||
usb_pd_object_t pdos[7];
|
||||
} usb_pd_objects_t;
|
||||
|
||||
void bm92t30_get_charger_type(bool *inserted, usb_pd_objects_t *usb_pd);
|
||||
|
||||
#endif
|
Loading…
Reference in a new issue