2022-09-05

[개발노트]초기설치

우분투20.04.5 기준, stm32mp1 개발에 필요한 기본 설치 (소스 및 배포판 제외)

sudo apt update
sudo apt install -y gawk wget git diffstat unzip texinfo gcc build-essential chrpath socat cpio python3 python3-pip python3-pexpect xz-utils debianutils iputils-ping python3-git python3-jinja2 libegl1-mesa libsdl1.2-dev pylint3 xterm python3-subunit mesa-common-dev zstd liblz4-tool
sudo apt install -y make xsltproc docbook-utils fop dblatex xmlto
sudo apt install -y libmpc-dev libgmp-dev
sudo apt install -y build-essential libncurses-dev libyaml-dev libssl-dev
sudo apt install -y python-is-python3
sudo apt -y install coreutils bsdmainutils sed curl bc lrzsz corkscrew cvs subversion mercurial nfs-common nfs-kernel-server libarchive-zip-perl dos2unix texi2html diffstat libxml2-utils
sudo apt install -y openssh-server gcc-multilib libusb-1.0-0 vim screen
sudo usermod -a -G dialout $USER

mkdir ~/.bin
PATH=~/.bin:$PATH
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/.bin/repo
chmod a+x ~/.bin/repo

터미널 열때마다 패쓰적용.
vim ~/.profile
if [ -d "$HOME/.bin" ] ; then
   PATH="$HOME/.bin:$PATH"
fi

어디서든 실행할수있도록.
stm32cubeprogrammer symbolic link 추가.
ln -s <설치된위치>/STM32_Programmer_CLI $HOME/.bin/STM32_Programmer_CLI 

udev rule복사해넣기. usb인식을 위한 규칙.
sudo cp  ~/STMicroelectronics/STM32Cube/STM32CubeProgrammer/Drivers/rules/* /etc/udev/rules.d/




* conf/local.conf 에 OE_TERMINAL = "screen" 추가하면 터미널에서 menuconfig 됨.

2022-09-04

[개발노트] ttyUSB 권한

stm32cubeprogrammer를 실행할때 ttyUSB 포트를 사용못해서 관리자로 실행한적이 있는가??

sudo usermod -a -G dialout $USER

2022-09-01

[개발노트] usb modem의 네트워크이름 바꾸고, DM포트 자동 생성

리눅스 RNDIS 드라이버를 켜면 usb테더링한 스마트폰, usb타입 모뎀 등이 네트워크로 잡힌다.
잡히는 순서에 따라 usb0, usb1 등 또는 usb-gadget 또한 usbX형태로 잡힌다.
그래서, usb net장치 의 제조사번호와 제품번호가 인식되면, udev의 rule에 등록하여
이름을 변경할 수있다. 
또한 DM을위한 시리얼포트 생성하는 실행 스크립트도 추가할수있다.
/etc/udev/rules/XXXXX.rule
SUBSYSTEM=="net", ACTION=="add", ATTRS{idVendor}=="05c6", ATTRS{idProduct}=="902d", NAME="lte0" ,RUN += "/usr/bin/modem_dm.sh"

socat으로 ttyGS0 와 연결하면 됨.

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가 수정됨. 






2022-07-28

[개발노트] yocto에 my-app 넣기.

사전준비

my custom recipe를 만드는법은 많이 나와있으므로, 생성시킴.

bitbake-layers show-layers
bitbake-layers create-layer --priority 7 ../layers/meta-st/meta-ssonic
bitbake-layers add-layer ../layers/meta-st/meta-ssonic


# We have a conf and classes directory, add to BBPATH
BBPATH .= ":${LAYERDIR}"

# We have recipes-* directories, add to BBFILES
BBFILES += "${LAYERDIR}/recipes-*/*/*.bb \
            ${LAYERDIR}/recipes-*/*/*.bbappend"

BBFILE_COLLECTIONS += "meta-ssonic"
BBFILE_PATTERN_meta-ssonic = "^${LAYERDIR}/"
BBFILE_PRIORITY_meta-ssonic = "7"

LAYERDEPENDS_meta-ssonic = "core"
LAYERSERIES_COMPAT_meta-ssonic = "dunfell"


recipes-*/*/*.bb 와 bbappend를 찾는구조임.

recipes-이름/이름/이름.bb 로 만들면됨.

ex) app이라면, 
recipes-app/app/app.bb 로 그냥 만들면됨

recipes-app/app/files 디렉토리를 만들고 그 안에 소스를 넣는다.

app.bb는 자동생성된것을 수정하여 사용한다.

내용은
SUMMARY = "bitbake-layers recipe"
DESCRIPTION = "Recipe created by bitbake-layers"
LICENSE = "MIT"
LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302"

python do_display_banner() {
    bb.plain("***********************************************");
    bb.plain("*                                             *");
    bb.plain("*  Example recipe created by bitbake-layers   *");
    bb.plain("*                                             *");
    bb.plain("***********************************************");
}

addtask display_banner before do_build

SRC_URI = "file://*"

S = "${WORKDIR}"
P = "r01"

inherit cmake

cmake로 된 프로젝트일때 SRC_URI = "file://*"

CMakeLists.txt
cmake_minimum_required(VERSION 3.0.0)

project(hong)

#set (CMAKE_NO_SYSTEM_FROM_IMPORTED ON)
INCLUDE_DIRECTORIES( .)

set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -lrt -lpthread -ldl -std=gnu99")

add_executable(main main.c)

install (TARGETS main DESTINATION bin)

install은 main이라는 프로그램이 /usr/bin에 들어간다.

끝.


구글드라이브 wget 다운받는 명령어

구글드라이브의 파일을 링크가있는사람 무조건받기로 해서 공유링크를 복사하여 아래의 "구글드라이브공유링크"에 붙여넣는다. 원하는파일명은적절히 써준다.  주의: 실행속성은 추가로 변경해주어야한다. chmod a+x 파일명 GDRIVE_LI...