Linux API/linux2018. 4. 23. 13:46

잘은 모르겠지만.. PC에서 쓰이는 PWRBTN  같은 전원관련 스위치들은

PMIC를 통해 인터럽트를 발생시킨다고 하는데..

GPIO를 통한 인터럽트인지 I2C(혹은 SMBUS)를 통해 통보받은걸 인터럽트로 넘겨주는건진 모르겠다.


2.7.15 Power Control Signals

i.MX6 Qseven PMIC SOM supports two power control signals PWGIN and PWRBTN# on Qseven Edge connector.

PWGIN input from Qseven Edge connector is the active high signal which is used to enable the power of i.MX6

Qseven PMIC SOM. For more details on PWRGIN signal usage, refer section 3.1.2.

i.MX6 Qseven PMIC SOM supports PWRBTN# input from Qseven Edge connector which is the active low signal and

connected to i.MX6 CPU’s ONOFF pin. This pin can be used to On/Off the i.MX6 CPU by connecting push button in

the carrier board. When the board power is On, a button press between 750ms to 5s will send an interrupt to core to

request software to bring down the i.MX6 safely (if software supports). Otherwise, button press greater than 5s

results in a direct hardware power down which is applicable when software is unable to power Off the device. When

the i.MX6 CPU power supply is Off, a button press greater in duration than 750ms asserts an output signal to request

power from a power IC to power up the i.MX6 CPU. 

[링크 : http://www1.futureelectronics.com/doc/IWAVE%20SYSTEMS%20TECHNOLOGIES/G15MDataSheet.pdf]


 +static irqreturn_t pb_isr(int irq, void *dev_id)

+{

+ int ret;

+ int state;

+

+ ret = intel_soc_pmic_readb(DC_TI_SIRQ_REG);

+ if (ret < 0) {

+ pr_err("[%s] power button SIRQ REG read fail %d\n",

+ pb_input->name, ret);

+ return IRQ_NONE;

+ }

+

+ state = ret & SIRQ_PWRBTN_REL;

+

+ if (force_trigger && state) {

+ /* If we lost the press interrupt when short pressing

+ * power button to wake up board from S3, simulate one.

+ */

+ input_event(pb_input, EV_KEY, KEY_POWER, 1);

+ input_sync(pb_input);

+ input_event(pb_input, EV_KEY, KEY_POWER, 0);

+ input_sync(pb_input);

+ } else {

+ input_event(pb_input, EV_KEY, KEY_POWER, !state);

+ input_sync(pb_input);

+ pr_info("[%s] power button %s\n", pb_input->name,

+ state ? "released" : "pressed");

+ }

+

+ if (force_trigger)

+ force_trigger = 0;

+

+ return IRQ_HANDLED;

+}

+

+static int pb_probe(struct platform_device *pdev)

+{

+ int ret;

+

+ pwrbtn_irq = platform_get_irq(pdev, 0);

+ if (pwrbtn_irq < 0) {

+ dev_err(&pdev->dev,

+ "get irq fail: irq1:%d\n", pwrbtn_irq);

+ return -EINVAL;

+ }

+ pb_input = input_allocate_device();

+ if (!pb_input) {

+ dev_err(&pdev->dev, "failed to allocate input device\n");

+ return -ENOMEM;

+ }

+ pb_input->name = pdev->name;

+ pb_input->phys = "power-button/input0";

+ pb_input->id.bustype = BUS_HOST;

+ pb_input->dev.parent = &pdev->dev;

+ input_set_capability(pb_input, EV_KEY, KEY_POWER);

+ ret = input_register_device(pb_input);

+ if (ret) {

+ dev_err(&pdev->dev,

+ "failed to register input device:%d\n", ret);

+ input_free_device(pb_input);

+ return ret;

+ }

+

+ ret = request_threaded_irq(pwrbtn_irq, NULL, pb_isr,

+ IRQF_NO_SUSPEND, DRIVER_NAME, pdev);

+ if (ret) {

+ dev_err(&pdev->dev,

+ "[request irq fail0]irq:%d err:%d\n", pwrbtn_irq, ret);

+ input_unregister_device(pb_input);

+ return ret;

+ }

+

+ return 0;

+}

[링크 : https://github.com/.../uefi/cht-m1stable/patches/PWRBTN-add-driver-for-TI-PMIC.patch]


> +int intel_soc_pmic_set_pdata(const char *name, void *data, int len)

> +{

> + struct cell_dev_pdata *pdata;

> +

> + pdata = kzalloc(sizeof(*pdata), GFP_KERNEL);

> + if (!pdata) {

> + pr_err("intel_pmic: can't set pdata!\n");

> + return -ENOMEM;

> + }

> +

> + pdata->name = name;

> + pdata->data = data;

> + pdata->len = len;

> +

> + list_add_tail(&pdata->list, &pdata_list);

> +

> + return 0;

> +}

> +EXPORT_SYMBOL(intel_soc_pmic_set_pdata); 

[링크 : https://patchwork.kernel.org/patch/4227571/]



+

근데... 정기적으로 읽긴 그런 애매한 녀석이고..

이걸 인터럽트로 어떻게 던지지?



[링크 : https://www.intel.com/.../datasheets/7-series-chipset-pch-datasheet.pdf]

'Linux API > linux' 카테고리의 다른 글

fopen64  (0) 2019.06.24
ubuntu iio rotate key 찾기 또 실패  (0) 2019.05.27
linux kernel governor 관련 코드  (0) 2018.04.17
linux shared memory 관련  (0) 2016.12.22
linux ipc  (0) 2016.12.20
Posted by 구차니
Linux API/linux2018. 4. 17. 14:39

odroid에서 가버너 정책에 따라 cpu 갯수와 속도가 달라져서

어떤식으로 구현되는지 한번 찾아보는 중


해당 내용은 linux kernel 의 device driver 부분에 구현되어있다.(drivers/cpufreq/) 


## drivers/cpufreq/cpufreq_hotplug.c

해당 파일은 크게 두부분으로 나뉘어있다. sysfs 를 구성하는 파일에 대한 내용을 구현한 부분과 governor 의 hotplug 정책에 맞게 cpu load를 계산해서 cpu 를 끄고 켜는 부분이다. 

[링크 : http://pinocc.tistory.com/47]

[링크 : https://www.kernel.org/doc/Documentation/cpu-freq/governors.txt]

[링크 : http://blog.dasomoli.org/472/] 위에꺼 번역?


[링크 : http://com.odroid.com/sigong/nf_board/nboard_view.php?brd_id=odroidc2&bid=7596]


+

cpu_up()

cpu_disable()


[링크 : https://android.googlesource.com/.../android-mediatek-sprout-3.4-kitkat-mr2/drivers/cpufreq]

[링크 : https://www.kernel.org/doc/html/v4.13/core-api/cpu_hotplug.html]

[링크 : https://www.kernel.org/doc/ols/2004/ols2004v2-pages-181-194.pdf]



+

[링크 : https://github.com/hardkernel/linux/blob/odroid-3.8.y/drivers/cpufreq/exynos4x12-cpufreq.c]

[링크 : https://github.com/hardkernel/linux/blob/odroid-3.8.y/drivers/cpufreq/exynos4x12-dvfs-hotplug.c]

'Linux API > linux' 카테고리의 다른 글

ubuntu iio rotate key 찾기 또 실패  (0) 2019.05.27
전원버튼 IRQ 발생 관련  (0) 2018.04.23
linux shared memory 관련  (0) 2016.12.22
linux ipc  (0) 2016.12.20
pthread detach while  (0) 2016.12.20
Posted by 구차니
Linux API/linux2016. 12. 22. 14:41
shm으로 시작하는걸 찾으니 아래와 같이 나오는데

shm_open같은 shm_으로 시작하는 애들은 정체가...

POSIX 관련인가.. shm은 리눅스 쪽?

$ man -k shm

shm_open (3)         - Create/open or unlink POSIX shared memory objects

shm_overview (7)     - Overview of POSIX shared memory

shm_unlink (3)       - Create/open or unlink POSIX shared memory objects

shmat (2)            - shared memory operations

shmctl (2)           - shared memory control

shmdt (2)            - shared memory operations

shmget (2)           - allocates a shared memory segment

shmop (2)            - shared memory operations 


#include <sys/ipc.h>

#include <sys/shm.h>


int shmget(key_t key, size_t size, int shmflg);

shmflg = IPC_CREAT | IPC_EXCL;


void *shmat(int shmid, const void *shmaddr, int shmflg);

int shmdt(const void *shmaddr);


int shmctl(int shmid, int cmd, struct shmid_ds *buf);


#include <sys/types.h>

#include <sys/shm.h>


void *shmat(int shmid, const void *shmaddr, int shmflg);

int shmdt(const void *shmaddr);


다시 보니.. shm은 SystemV 계열

shm_ 은 POSIX 계열 인듯?

[링크 : http://stackoverflow.com/questions/4582968/system-v-ipc-vs-posix-ipc]

'Linux API > linux' 카테고리의 다른 글

전원버튼 IRQ 발생 관련  (0) 2018.04.23
linux kernel governor 관련 코드  (0) 2018.04.17
linux ipc  (0) 2016.12.20
pthread detach while  (0) 2016.12.20
fd <-> fp 변환  (0) 2016.10.07
Posted by 구차니
Linux API/linux2016. 12. 20. 21:10

머라도 하나씩 직접해보자 ㅜㅜ


[링크 : http://www.joinc.co.kr/w/Site/system_programing/Book_LSP/ch08_IPC]

'Linux API > linux' 카테고리의 다른 글

linux kernel governor 관련 코드  (0) 2018.04.17
linux shared memory 관련  (0) 2016.12.22
pthread detach while  (0) 2016.12.20
fd <-> fp 변환  (0) 2016.10.07
shared memory - linux/IPC  (0) 2016.06.28
Posted by 구차니
Linux API/linux2016. 12. 20. 20:58

쓰레드 보다보니

공부는 해냐하는데 끄응 ㅜㅜ


암튼 쓰레드를 분리하면 자식 스레드가 종료시 자원을 반납하지만

분리할 쓰레드가 무한루프 돌면

메모리 누수로 이어지는 듯


프로세스는 종료되었고 그럼 프로세스로서 cpu를 할당받진 않을테나

해당 쓰레드가 공유하던 메모리만 붕 떠버리려나?


[링크 : http://www.joinc.co.kr/w/Site/system_programing/Book_LSP/ch07_Thread]

[링크 : http://stackoverflow.com/.../how-can-i-kill-a-pthread-that-is-in-an-infinite-loop-from-outside-that-loop]

[링크 : http://stackoverflow.com/questions/25655706/how-to-terminate-or-stop-a-detached-thread-in-c]

'Linux API > linux' 카테고리의 다른 글

linux shared memory 관련  (0) 2016.12.22
linux ipc  (0) 2016.12.20
fd <-> fp 변환  (0) 2016.10.07
shared memory - linux/IPC  (0) 2016.06.28
메시지 큐 - ipc  (0) 2016.06.28
Posted by 구차니
Linux API/linux2016. 10. 7. 16:59

int fileno(FILE *stream);

FILE *fdopen(int fd, const char *mode);


[링크 : http://stackoverflow.com/.../how-can-i-convert-a-file-pointer-file-fp-to-a-file-descriptor-int-fd]

[링크 : http://stackoverflow.com/.../how-to-get-a-file-pointer-from-a-file-descriptor]

[링크 : https://linux.die.net/man/3/fileno]

[링크 : https://linux.die.net/man/3/fdopen]

'Linux API > linux' 카테고리의 다른 글

linux ipc  (0) 2016.12.20
pthread detach while  (0) 2016.12.20
shared memory - linux/IPC  (0) 2016.06.28
메시지 큐 - ipc  (0) 2016.06.28
pthread mutex shm_open  (0) 2016.06.27
Posted by 구차니
Linux API/linux2016. 6. 28. 15:56

System V와 POSIX 차이

[링크 : http://stackcanary.com/?p=59]


System V

[링크 : http://linux.die.net/man/2/shmget]

[링크 : http://linux.die.net/man/2/shmat] attach

[링크 : http://linux.die.net/man/2/shmdt] detach

[링크 : http://linux.die.net/man/2/shmctl]


POSIX


System V shared memory (shmget(2), shmop(2), etc.) is an older shared memory API. POSIX shared memory provides a simpler, and better designed interface; on the other hand POSIX shared memory is somewhat less widely available (especially on older systems) than System V shared memory.

[링크 : http://linux.die.net/man/7/shm_overview]

    [링크 : http://linux.die.net/man/3/shm_open]

    [링크 : http://linux.die.net/man/2/ftruncate]

    [링크 : http://linux.die.net/man/2/mmap]

'Linux API > linux' 카테고리의 다른 글

pthread detach while  (0) 2016.12.20
fd <-> fp 변환  (0) 2016.10.07
메시지 큐 - ipc  (0) 2016.06.28
pthread mutex shm_open  (0) 2016.06.27
리눅스 동적 라이브러리(*.so) 사용하기  (0) 2016.04.04
Posted by 구차니
Linux API/linux2016. 6. 28. 15:31


#include <sys/types.h>

#include <sys/ipc.h>

#include <sys/msg.h>


struct msgbuf {

    long mtype;       /* message type, must be > 0 */

    char mtext[1];    /* message data */

};


int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);

ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg);

int msgget(key_t key, int msgflg);

[링크 : http://linux.die.net/man/2/msgsnd]

[링크 : http://linux.die.net/man/2/msgget]



[링크 : http://www.joinc.co.kr/w/Site/system_programing/Book_LSP/ch08_IPC]

[링크 : http://www.joinc.co.kr/w/Site/system_programing/IPC/MessageQueue]

'Linux API > linux' 카테고리의 다른 글

fd <-> fp 변환  (0) 2016.10.07
shared memory - linux/IPC  (0) 2016.06.28
pthread mutex shm_open  (0) 2016.06.27
리눅스 동적 라이브러리(*.so) 사용하기  (0) 2016.04.04
리눅스 커널 모듈 관련 문서  (0) 2015.11.06
Posted by 구차니
Linux API/linux2016. 6. 27. 20:51

pthread_mutexattr_destroy, pthread_mutexattr_init - destroy and initialize the mutex attributes object

[링크 : http://linux.die.net/man/3/pthread_mutexattr_init]


mutex 속성을 설정하여 프로세스간 mutex로도 사용이 가능

ret = pthread_mutexattr_setpshared(&mtx_attr, PTHREAD_PROCESS_SHARED);

[링크 : https://kldp.org/node/107186]

[링크 : http://stackoverflow.com/questions/4252005/what-is-the-attribute-of-a-pthread-mutex]


[링크 : http://mintnlatte.tistory.com/357] mmap


결론은.. 공유 메모리를 통해 mutex 키를 공유하여

다른 프로세스들과도 mutex가 가능하다?

'Linux API > linux' 카테고리의 다른 글

shared memory - linux/IPC  (0) 2016.06.28
메시지 큐 - ipc  (0) 2016.06.28
리눅스 동적 라이브러리(*.so) 사용하기  (0) 2016.04.04
리눅스 커널 모듈 관련 문서  (0) 2015.11.06
readl(), writel()  (0) 2015.11.06
Posted by 구차니
Linux API/linux2016. 4. 4. 09:21

어떻게 보면 당연한..(?)

함수 포인터


#include <stdio.h>

#include <dlfcn.h>

#include "ctest.h"


int main(int argc, char **argv) 

{

   void *lib_handle;

   double (*fn)(int *);

   int x;

   char *error;


   lib_handle = dlopen("/opt/lib/libctest.so", RTLD_LAZY);

   if (!lib_handle) 

   {

      fprintf(stderr, "%s\n", dlerror());

      exit(1);

   }


   fn = dlsym(lib_handle, "ctest1");

   if ((error = dlerror()) != NULL)  

   {

      fprintf(stderr, "%s\n", error);

      exit(1);

   }


   (*fn)(&x);

   printf("Valx=%d\n",x);


   dlclose(lib_handle);

   return 0;

[링크 : http://www.yolinux.com/TUTORIALS/LibraryArchives-StaticAndDynamic.html]


[링크 : http://linux.die.net/man/3/dlopen]

[링크 : http://linux.die.net/man/3/dlsym]

'Linux API > linux' 카테고리의 다른 글

메시지 큐 - ipc  (0) 2016.06.28
pthread mutex shm_open  (0) 2016.06.27
리눅스 커널 모듈 관련 문서  (0) 2015.11.06
readl(), writel()  (0) 2015.11.06
리눅스 모듈 프로그래밍 관련  (0) 2015.10.30
Posted by 구차니