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:
CTCaer 2020-09-15 20:13:29 +03:00
parent 8f7bdd45b1
commit 8b837dd81b
2 changed files with 105 additions and 0 deletions

65
bdk/power/bm92t30_stub.c Normal file
View 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
View 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