2022-08-23

[개발노트] stm32mp1 Distro recipe usb0 g_ether 설정 막기.

stm32mp1 distro는 이더넷 가젯이 기본으로 설정되어있다.
usb0로 잡히며, 192.168.7.1 로 설정되고, pc측으로 dhcp ip를 준다
이것은 systemd 의 서비스로 설정되어있고,
usb0 이 잡힐때, 스크립트를 실행하여 수행된다.

g_serial을 우리는 사용해야하는데, 위의 g_ether가 설정되면, 
g_serial관련 커널설정을 하더라도, /dev 안에 ttyGS0가 생성되지 않는다.
g_ether를 사용하지않으면 ttyGS0가 생성되더라. (이유는.....???)

또한 g_ether 커널옵션을 다 끄더라도, disto의 recipe는 남아있다.
이것이 뭐가 문제냐면,

usb modem을 host로 붙이는데, g_ether가 없으므로, 이 모뎀이 usb0로 잡히게 된다.
usb0로 잡히므로 위의 systemd에 의해 ip를 192.168.7.1로 설정해버린다.
그리하여 usb0는 모뎀인데, ip설정은 g_ether대로 설정이 되버리는 상황 발생.

그래서 systemd의 서비스까지 없애줘야한다.

통으로 막으면 흔적이 없어지므로 스크립트만 막는다. 위치는.
 Distribution-Package/openstlinux-5.10-dunfell-mp1-21-11-17/layers/meta-st/meta-st-openstlinux/recipes-bsp/tools/usbotg-gadget-config.bb
1. systemd끄고,
SYSTEMD_AUTO_ENABLE_${PN} = "disable"
2. 네트워크 설정 설치 막고.
#install -m 0644 ${WORKDIR}/53-usb-otg.network ${D}${systemd_unitdir}/network
3. 스크립트 설치 막고.
#install -m 0755 ${WORKDIR}/stm32_usbotg_eth_config.sh ${D}${sysconfdir}/init.d/

# Copyright (C) 2018, STMicroelectronics - All Rights Reserved
# Released under the MIT license (see COPYING.MIT for the terms)

DESCRIPTION = "The goal is to enable USB gadget configuration"

LICENSE = "MIT"
LIC_FILES_CHKSUM = "file://${COREBASE}/meta/files/common-licenses/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302"

PV = "1.0"

SRC_URI = " file://usbotg-config.service \
    file://stm32_usbotg_eth_config.sh \
    file://53-usb-otg.network \
    "

S = "${WORKDIR}/git"

inherit systemd update-rc.d

SYSTEMD_PACKAGES += "${PN}"
SYSTEMD_SERVICE_${PN} = "usbotg-config.service"
#SYSTEMD_AUTO_ENABLE_${PN} = "enable" c.h.jung
SYSTEMD_AUTO_ENABLE_${PN} = "disable"

do_install() {
    if ${@bb.utils.contains('DISTRO_FEATURES','systemd','true','false',d)}; then
        install -d ${D}${systemd_unitdir}/system ${D}${base_sbindir} ${D}${systemd_unitdir}/network
        install -m 0644 ${WORKDIR}/usbotg-config.service ${D}${systemd_unitdir}/system
        install -m 0755 ${WORKDIR}/stm32_usbotg_eth_config.sh ${D}${base_sbindir}
        #install -m 0644 ${WORKDIR}/53-usb-otg.network ${D}${systemd_unitdir}/network
    fi

    install -d ${D}${sysconfdir}/init.d
    #install -m 0755 ${WORKDIR}/stm32_usbotg_eth_config.sh ${D}${sysconfdir}/init.d/

}

INITSCRIPT_NAME = "stm32_usbotg_eth_config.sh"
INITSCRIPT_PARAMS = "start 22 5 3 ."

FILES_${PN} += "${systemd_unitdir}/network"

그러면, 모뎀ip잘되고, g_ether막히고. 잘됨.


2022-08-19

[개발노트]USB OTG ID 핀 상태 읽기 (0번비트임)

#include <stdio.h>
#include <sys/mman.h>
#include <fcntl.h>

int main(void)
{
        int fd = open("/dev/mem", O_RDWR);
        void* ptr = mmap(NULL, 4096, PROT_READ,
                 MAP_SHARED, fd, 0x49000000);
        close(fd);

        if(ptr == MAP_FAILED)
        {
                printf("mmap failed\n");
                return -1;
        }
        volatile unsigned* GINTSTS = (unsigned*)(ptr + 0x14);

        printf("%08X \n",*GINTSTS);

        munmap(ptr, 4096);

        return 0;
}

2022-08-15

[개발환경] WSL2 gui 환경설정과 접속.

sudo apt install -y xrdp
sudo apt install -y xfce4
gdm3선택
sudo apt install -y xfce4-goodies

sudo cp /etc/xrdp/xrdp.ini /etc/xrdp/xrdp.ini.bak

sudo sed -i 's/3389/3390/g' /etc/xrdp/xrdp.ini
sudo sed -i 's/max_bpp=32/#max_bpp=32\nmax_bpp=128/g' /etc/xrdp/xrdp.ini
sudo sed -i 's/xserverbpp=24/#xserverbpp=24\nxserverbpp=128/g' /etc/xrdp/xrdp.ini
echo xfce4-session > ~/.xsession
sudo vi /etc/xrdp/startwm.sh
#test -x /etc/X11/Xsession && exec /etc/X11/Xsession
#exec /bin/sh /etc/X11/Xsession
#xfce
startxfce4

윈도우 원격데스크탑.
localhost:3390

인터넷브라우져가 없으므로
sudo apt install firefox


2022-08-04

[개발노트] 커널패치 만들어서 배포판에 넣어보기.

devtool modify linux-stm32mp 로 workspace에 소스빼기.
이때 생성된 커널소스는 모든 fragmemt와 patch가 적용된 최종 원본이다.
이 원본을 손대어 수정할 것이다.

일단 원본커널dir의 이름을 a로 바꾼다.
cp linux-stm32mp a

원본소스를 b로 바꾼후. 그안의 소스수정하자.
mv linux-stm32mp b

b/drivers/gpio/gpio-74x164.c 를 열어서 수정함.
174라인쯤에 
of_property_read_u8_array(spi->dev.of_node, "registers-default",
                    chip->buffer, chip->registers);
추가함.
u-boot의 74x164소스는 디바이스트리의 기본값(registers-default)를 읽어서 초기값으로 사용하는데. 이후 커널의 74x164소스는 그게 없음, 그래서 초기값이 0으로 들어감.
u-boot에서 kernel 부팅시 버퍼변수가 적용되어 led들이 모두 켜짐. 다른제어핀도 있는데 초기값 유지가 안되는 문제로 확대걱정임. 그래서 위와같은 로직추가함.

diff -urN a/drivers/ b/drivers/ > 0099-ARM-5.10.61-stm32mp1-r2-74x164INITVALUE.patch
대충 이런내용.
diff -urN a/drivers/gpio/gpio-74x164.c b/drivers/gpio/gpio-74x164.c
--- a/drivers/gpio/gpio-74x164.c    2021-08-26 21:51:21.000000000 +0900
+++ b/drivers/gpio/gpio-74x164.c    2022-08-04 12:59:51.665613200 +0900
@@ -144,7 +144,8 @@
    chip->gpio_chip.can_sleep = true;
    chip->gpio_chip.parent = &spi->dev;
    chip->gpio_chip.owner = THIS_MODULE;
-
+   of_property_read_u8_array(spi->dev.of_node, "registers-default",
+                   chip->buffer, chip->registers);
    mutex_init(&chip->lock);
 
    ret = __gen_74x164_write_config(chip);
이걸 패치들 모여있는곳에 추가하자.

위치는 
layers/meta-st/meta-st-stm32mp/recipes-kernel/linux/linux-stm32mp/5.10/5.10.61/

layers/meta-st/meta-st-stm32mp/recipes-kernel/linux/linux-stm32mp_5.10.bb 맨 밑에 파일추가
#c.h.jung added
KERNEL_CONFIG_FRAGMENTS += "${WORKDIR}/fragments/${LINUX_VERSION}/fragment-99-ssonic.config"
SRC_URI += "file://${LINUX_VERSION}/fragment-99-ssonic.config;subdir=fragments"
SRC_URI_class-devupstream += "file://${LINUX_VERSION}/fragment-99-ssonic.config;subdir=fragments"
#kernel patch
SRC_URI += " file://${LINUX_VERSION}/${LINUX_VERSION}.${LINUX_SUBVERSION}/0099-ARM-5.10.61-stm32mp1-r2-74x164INITVALUE.patch "

(기존에 fragment 추가한게 보이네? 그밑에 추가)

이제 빌드.
devtool reset linux-stm32mp 하여 연결고리 끊고 (압축파일풀어서 모두 다시 소스준비하도록)

확인은 알아서.



2022-08-03

[개발노트] gpio 핀맵 옵셋 해석문제 트릭해결


sdk에 아래와같이 pinctrl 과 시작번호와 갯수로 구성되는데 저걸 해석을 잘 못함.
    gpiof: gpio@50007000 {
        status = "okay";
        ngpios = <6>;
        gpio-ranges = <&pinctrl 6 86 6>;
    };

    gpiog: gpio@50008000 {
        status = "okay";
        ngpios = <10>;
        gpio-ranges = <&pinctrl 6 102 10>;
    };

sdk소스 건드리는건 반칙이므로, 오버레이로 햇깔리지않게 변경.
&gpiof {
    status = "okay";
    ngpios = <12>;
    gpio-ranges = <&pinctrl 0 80 12>;
};

&gpiog {
    status = "okay";
    ngpios = <16>;
    gpio-ranges = <&pinctrl 0 96 16>;
};

pwm 응용 참고

2022-08-02

[개발노트] stm32mp1 kernel fragment 적용.

1. devtool modify linux-stm32mp 로 workspace/source/linux-stm32mp 로 소스 빼냄.
2. devtool menuconfig linux-stm32mp 하여 기본에서 수정하고 싶은것 수정.
--> .../workspace/sources/linux-stm32mp/oe-local-files/devtool-fragment.cfg 에 생성됨.
4. 별도로 만드는 레시피가 복잡하므로, 이미 만들어져있는 커널레시피에 추가함.
이미 만들어져있는레시피
layers/meta-st/meta-st-stm32mp/recipes-kernel/linux/linux-stm32mp/linux-stm32mp_5.10.bb
위에것들 대충 보고 따라서 추가해본다.
#c.h.jung added
KERNEL_CONFIG_FRAGMENTS += "${WORKDIR}/fragments/${LINUX_VERSION}/fragment-99-ssonic.config"
SRC_URI += "file://${LINUX_VERSION}/fragment-99-ssonic.config;subdir=fragments"
SRC_URI_class-devupstream += "file://${LINUX_VERSION}/fragment-99-ssonic.config;subdir=fragments"

fragment-99-ssonic.config 파일은
layers/meta-st/meta-st-stm32mp/recipes-kernel/linux/linux-stm32mp/5.10/ 에 넣는다 
(다른것들도 여기있음)

devtool reset linux-stm32mp 하면 devtool과의 연결고리가 끊어지고, 수동으로 폴더를 지워야함.
이후 다시 devtool modify linux-stm32mp 하면 새로 원본소스부터 fragment까지 다 적용한것을 workspace/source/linux-stm32mp에 만들어주는데, 이후 devtool menuconfig linux-stm32mp 하면
해당폴더에, .config.baseline 과 .config.new 가 생김.
menuconfig을 할경우 .config.new가 수정됨. 






암호화 + base64 하고 쉘스크립트.

 #!/bin/bash # IV와 UserKey를 설정합니다 (아스키 문자열을 그대로 사용). IV="0123456789abcdef"  UserKey="0123456789abcdef" # IV와 UserKey를 16...