Volatage Regulation : - 안정되고 적절한 전압 레벨 제공
Battery Management : - 충전 , 배터리 모니터링
Thermal Management : - 오버 히팅 방지를 위한 모니터 , 온도제어
Current Regulation : - 적절한 전원에서 동작하게끔 , 오버로드 피하기 위함
배터리 ID 체크
Power Long Key Detect : 오래 누르면 PMIC가 디텍팅함 => 인터럽트 유발,처리
ADC - 케이블 감지
Charging
LDO Regulators
PMIC 와치독, PMIC 리셋
와치독 - 시스템을 보호하는 드라이버 , 모니터링
리셋 - 콜드리셋:메모리와 관련된 페리페럴의 전원이 off되었다가 리셋 , 웜 리셋 : 보통 커널 크래시 유발 시 리셋
저 배터리 관리
https://elixir.bootlin.com/linux/v5.15.30/source/drivers/regulator/core.c
static int _regulator_do_enable(struct regulator_dev *rdev) // 외부에서 호출 x
{
int ret, delay;
...
} else if (rdev->desc->ops->enable) { // 함수포인트로 연결
ret = rdev->desc->ops->enable(rdev);
if (ret < 0)
return ret;
} else {
return -EINVAL;
}
https://elixir.bootlin.com/linux/v5.15.30/source/include/linux/regulator/driver.h
struct regulator_desc {
const char *name;
const char *supply_name;
...
int id;
unsigned int continuous_voltage_range:1;
unsigned n_voltages;
unsigned int n_current_limits;
const struct regulator_ops *ops; // 함수 포인터 테이블 , 함수 포인터를 통해 함수 펑션콜 이루어짐
int irq;
enum regulator_type type;
https://elixir.bootlin.com/linux/v5.15.30/source/drivers/regulator/max77802-regulator.c
/*
* LDOs 2, 4-19, 22-35
*/
static const struct regulator_ops max77802_ldo_ops_logic1 = {
.list_voltage = regulator_list_voltage_linear,
.map_voltage = regulator_map_voltage_linear ,
.is_enabled = regulator_is_enabled_regmap,
.enable = max77802_enable,
.disable = regulator_disable_regmap,
.get_voltage_sel = regulator_get_voltage_sel_regmap,
.set_voltage_sel = regulator_set_voltage_sel_regmap,
.set_voltage_time_sel = regulator_set_voltage_time_sel,
.set_suspend_disable = max77802_set_suspend_disable,
.set_suspend_mode = max77802_set_suspend_mode,
};
https://elixir.bootlin.com/linux/v5.15.30/source/drivers/regulator/qcom_rpm-regulator.c
static const struct regulator_ops uV_ops = {
.list_voltage = regulator_list_voltage_linear_range,
.set_voltage_sel = rpm_reg_set_uV_sel,
.get_voltage = rpm_reg_get_voltage,
.enable = rpm_reg_uV_enable, // 함수 호출
.disable = rpm_reg_uV_disable,
.is_enabled = rpm_reg_is_enabled,
.set_load = rpm_reg_set_load,
};
리눅스 커널과 Qualcomm Modem 인터페이스 예시
https://elixir.bootlin.com/linux/v5.15.30/source/drivers/soc/qcom/smsm.c
/*
* This driver implements the Qualcomm Shared Memory State Machine, a mechanism
* for communicating single bit state information to remote processors.
*/
static irqreturn_t smsm_intr(int irq, void *data)
{
struct smsm_entry *entry = data;
unsigned i;
int irq_pin;
u32 changed;
u32 val;
val = readl(entry->remote_state);
changed = val ^ xchg(&entry->last_value, val);
두 개의 신호선(SDA, SCL)으로 다수의 I2C 통신을 지원하는 디바이스와 데이터를 송/수신할 수 있는 통신방식
필립스에서 개발한 직렬 컴퓨터 버스이며 여러 개의 저속의 주변기기를 연결하기 위해 사용
- 인터럽트만큼이나 중요함
- SoC없체가 구현
SDA (Serial Data)
데이터의 직렬 전송
SCL (Serial CLock)
디바이스간 신호 동기화에 사용되는 클럭
SCL이 HIGH일 때 (SDA가 HIGH인 상황에서) 데이터가 유효하다.
SCL : 제어를 위한 시그널
SDA : 데이터 시그널
I2C 버스는 최대 112개의 디바이스를 I2C라인에 붙일 수 있다.
하지만 퍼포먼스 이슈가 발생할 수 있음
1980년대 중반에 모토롤라가 처음 개발한 동기 시리얼 통신 인터페이스
센서, 메모리(MMC, SD Card), 주변장치에 연결하는 데 사용되는 동기식 4선 직렬 링크
MOSI (Master Output, Slave Input):
마스터 디바이스에서 슬레이브 디바이스로 전달
MISO (Master Input, Slave Output):
슬레이드 디바이스에서 마스터 디바이스로 전달
SCLK (Serial Clock):
마스터에서 나가는 클럭 라인으로 마스터와 슬레이브간의 데이터 동기화
Chip Select (CS) Lines:
각 슬레이드 디바이스에 chip select line에 할당됨
많은 도움이 되었습니다, 감사합니다.