post-custom-banner

파워 매니지먼트

  • 시스템이 소모하는 전반적인 전력이 최적화 되어서 실행되도록 하는 칩,디바이스 드라이버를 설계하는 방식

시스템 파워 매니지먼트

  • 전반적인 시스템이 최적화된 상태에서 실행될 수 있도록 하는 프로세스나 기술

디바이스 파워 매니지먼트

  • 각각의 디바이스들이 최적의 전류를 소모해서 고정될 수 있도록

PMIC (파워 매니지먼트 IC)

  • 측정 소모 전류
  • 전류가 깔리다가 올라감 => 정체가 무엇인가? => 디버깅 => PMIC API 파악

PMIC 주요 기능

Volatage Regulation : - 안정되고 적절한 전압 레벨 제공
Battery Management : - 충전 , 배터리 모니터링
Thermal Management : - 오버 히팅 방지를 위한 모니터 , 온도제어
Current Regulation : - 적절한 전원에서 동작하게끔 , 오버로드 피하기 위함
배터리 ID 체크
Power Long Key Detect : 오래 누르면 PMIC가 디텍팅함 => 인터럽트 유발,처리
ADC - 케이블 감지
Charging
LDO Regulators
PMIC 와치독, PMIC 리셋
와치독 - 시스템을 보호하는 드라이버 , 모니터링
리셋 - 콜드리셋:메모리와 관련된 페리페럴의 전원이 off되었다가 리셋 , 웜 리셋 : 보통 커널 크래시 유발 시 리셋
저 배터리 관리

리눅스 커널 레귤레이터 인터페이스

struct regulator_dev:

  • 전압/전류 레귤레이터 클래스 디바이스
  • 관련 디바이스 드라이버의 구조체 , 데이터 구조가 필드 멤버로 구성

struct regulator_desc

  • Static regulator descriptor

regulator_get(dev, id):

  • Returns a regulator handle

regulator_set_voltage(regulator, min_uV, max_uV):

  • Sets the voltage to a value within the specified range

regulator_enable(regulator):

  • Enables a regulator

regulator_disable(regulator):

  • Disables a regulator

regulator_put(dev, id):

  • Frees (with kfree) a regulator handle

regulator_get(dev, id):

  • lookup and obtain a reference to a regulator

레귤레이터 인터페이스

  • 코어 내부에 있는 레귤레이터 오퍼레이션을 함수포인터에 등록된 것들에 연결이 된다.

_regulator_do_enable()


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;
}

Descriptor of regulator


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;
    
  

struct regulator_ops *ops (CONFIG_REGULATOR_MAX77802)

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,
};

struct regulator_ops *ops (CONFIG_REGULATOR_QCOM_RPM)


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,
};

Modem IP

IP Intellectual Property

  • 재사용 가능하도록 기능을 모듈화해 설계한 Core Design
  • 모뎀도 포함

인터럽트 + Shared memory

리눅스 커널과 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);

I2C/SPI 페리페럴 인터페이스

I2C(Inter Intergrated Circuit) 통신이란?

두 개의 신호선(SDA, SCL)으로 다수의 I2C 통신을 지원하는 디바이스와 데이터를 송/수신할 수 있는 통신방식
필립스에서 개발한 직렬 컴퓨터 버스이며 여러 개의 저속의 주변기기를 연결하기 위해 사용

  • 인터럽트만큼이나 중요함
  • SoC없체가 구현

BCM 2711

  • 중심에 버스가 있음

I2C에 연결된 디바이스

  • I2C 컨트롤러(마스터) <=> I2C 디바이스(슬레이브)
  • 디바이스에는 센서, PMIC, 오디오 코덱 , 다양한 페리페럴 디바이스가 슬레이브로 사용될 수 있음

I2C 버스를 사용하는 페리페럴

2가지 신호

SDA (Serial Data)
데이터의 직렬 전송
SCL (Serial CLock)
디바이스간 신호 동기화에 사용되는 클럭

I2C 기본 동작 원리

  • SCL이 HIGH일 때 (SDA가 HIGH인 상황에서) 데이터가 유효하다.

  • SCL : 제어를 위한 시그널

  • SDA : 데이터 시그널

    I2C 버스는 최대 112개의 디바이스를 I2C라인에 붙일 수 있다.

  • 하지만 퍼포먼스 이슈가 발생할 수 있음

SPI Serial peripheral interface

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에 할당됨

post-custom-banner

1개의 댓글

comment-user-thumbnail
2023년 7월 31일

많은 도움이 되었습니다, 감사합니다.

답글 달기