2024年9月20日 星期五

Useful Git command

### 1. Fetch all remote branches ```shell git fetch origin ``` ### 2. Pull update to local branch ```bash git pull origin main --rebase --autostash ``` ### 3. Rebase other branch to main branch ```bash # checkout to main branch git checkout main git rebase xxx ``` ### 4. Show branchs ``` bash # show local branch git branch # show remote branch git branch -a ``` ### 5. Create branch ``` bash git branch ``` ### 6. Switch branch ``` bash git checkout ``` ### 7. Commit code change ``` bash # In one line. git commit -m # Add commit message from file git commit -F # Edit commit message with editor git commit -a ``` ### 8. Revert ``` bash #Reset git reset HEAD # 還原 "指定" 的檔案狀態 git reset HEAD # 還原 "全部" 的檔案狀態 #Checkout git checkout -- # 還原 "指定" 的檔案狀態 git checkout # 還原 "全部" 的檔案狀態 ``` ### 9. Compare ``` bash # compare difference git diff # show difference file git status ``` ### 10. Push ``` bash # first time git push -u origin # normal git push # force git push -f ```

Append ccflag in yocto bbfile

Could append ccfllag with define flag which wanna to append like following ```bash # CFLAGS_append_{actived_machine_name} = "-DHT_QCA_WIFI " CFLAGS_append_chita-clr = "-DHT_QCA_WIFI " ```

2024年3月18日 星期一

【拆雷實錄】fragmeted IP 封包追蹤

最近在Trace fragmeted IP 封包無法被原本程式加的rule "-A INPUT -f -j DROP"阻擋,原因是他是加在input表,其優先權是低於raw表,順序是在defrag之後,這時被切割的packet已經經過defrag重組完,所以無法match fragmented的flag,所以按下面這篇文章需要將rule加在raw表,因為raw表的優先權比defrag高。 [https://blog.csdn.net/caofengtao1314/article/details/120047179](https://blog.csdn.net/caofengtao1314/article/details/120047179) 更改過的rule指令會像是這樣 ```bash iptables -t raw -I PREROUTING -i erouter0 -f -j DROP # 打LOG方便追蹤 iptables -t raw -I PREROUTING -i erouter0 -f -j LOG --log-prefix "[ATK] IP fragmented" --log-level 1 ``` 理論上改成這樣就OK,但在比較後面的kernel版本變得比較複雜,defrag變得比raw表的優先權高,變成就算把上面的rule加到raw表也檔不住,所以按下面這篇文章說明需要在load iptable_raw時傳遞參數 ```bash modprobe iptable_raw raw_before_defrag=1 ``` [https://serverfault.com/questions/964072/how-to-block-incoming-ipv6-fragments](https://serverfault.com/questions/964072/how-to-block-incoming-ipv6-fragments) 而如果是builtin的kernel module,則需要透過Bootloadert傳遞參數或定義Kernel command line(CONFIG_CMDLINE)在Kernel config,在我的情況是第二種builtin的kernel module,然後在不更改Bootloader的前提,所以我需要加Kernel command line ```ini CONFIG_CMDLINE_BOOL=y CONFIG_CMDLINE="raw_before_defrag=1" ```

2024年3月12日 星期二

【拆雷實錄】ping 8.8.8.8 data length問題

最近遇到busybox ping 8.8.8.8的怪問題,當ping的data length > 88就ping不通,後面根據google的一篇文章,修改unpack function,拿掉datalen的檢查就OK了。 ## 程式碼 [https://gist.github.com/JeffTsengTwn/439e7660958709b388c9cc7eeabc21fb#file-ping-c](https://gist.github.com/JeffTsengTwn/439e7660958709b388c9cc7eeabc21fb#file-ping-c)

2023年10月19日 星期四

Raspberry PI 3 B+ Yocto研究筆記(一)

## 前言 因為在工作上會在RDK-B的框架下開發,而RDK-B的Build system就是用Yocto,終於最近比較有動力,就搭建一下環境及手邊樹梅派的板子,把這部份摸熟一點也記錄一下。 ## Yocto簡介 做嵌入式軟體開發應該都會常常聽到BuildRoot和Yocto,他們都是一種建立Embedded Linux distribution的build system,關於更多Yocto介紹可以到他們官網了解更多,這邊就不再贅述,接下來就是開始建置環境。 ## 環境建置 首先需要在一台電腦上先安裝虛擬磯的環境,我是習慣用VMWare,接著就是開一個新的虛擬磯,大概的配置如下: 1. CPU核心:8 2. RAM:8G 3. OS:20.04.6 LTS 4. Storage: 120 GB 一切都就緒後,就可以開始安裝相依性的套件 ## 相依套件安裝 在編譯Yocto之前需要以下的相依套件,更多細節可參考 https://docs.yoctoproject.org/brief-yoctoprojectqs/index.html ```bash $ sudo apt install 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 python3-subunit mesa-common-dev zstd liblz4-tool file locales libacl1 $ sudo locale-gen en_US.UTF-8 ``` ## 配置及編譯 首先當然需要先下載Yocto source code,我們先建立一個資料夾,並透過git clone source code. ```bash mkdir my-rpi && cd my-rpi git clone -b kirkstone git://git.yoctoproject.org/poky.git ``` 接著就是下載Raspberry Pi的meta層 ```bash git clone -b kirkstone git://git.yoctoproject.org/meta-raspberrypi ``` 初始化yocto開發環境 ```bash source poky/oe-init-build-env build-rpi ``` 加入剛剛下載的Raspberry Pi的meta層 ```bash bitbake-layers add-layer ../meta-raspberrypi ``` 修改配置 ```bash sed -i 's/^MACHINE.*/MACHINE ?= "raspberrypi3"/g' conf/local.conf sed -i '/^#DL_DIR ?= "${TOPDIR}\/downloads"/ a DL_DIR ?= \"${HOME}/yocto/downloads"' conf/local.conf sed -i 's/^PACKAGE_CLASSES.*/PACKAGE_CLASSES ?= "package_ipk"/g' conf/local.conf # 設定透過uboot開機 echo 'RPI_USE_U_BOOT = "1"' >> conf/local.conf #設定開啟uart console echo 'ENABLE_UART = "1"' >> conf/local.conf ``` 編譯image ```bash bitbake core-image-minimal ``` 編譯完成後image大概會在下面的路徑 ```bash /my-rpi/build-rpi/tmp/deploy/images/raspberrypi3/core-image-minimal-raspberrypi3.wic.bz2 ``` 他是一個symbollink實際上對應到像這樣檔名的image ```bash core-image-minimal-raspberrypi3-20231111193508.rootfs.wic.bz2 ``` 之後就可以透過balenaEtcher等工具燒錄image到SD卡,再確認開機後的console有帶起來,這樣就大功告成囉! ## 參考資料 [使用 Yocto 打造你的 Raspberry Pi 系統](https://e61983.github.io/2021-07-26-building-raspberry-pi-systems-with-yocto/)

2013年11月14日 星期四

BluetoothChatService改良

最近都在處理android藍芽傳輸的問題,雖然以前處理過不過被eclipse吃掉了,後面也忘記怎麼用,然後同學說官方有提供bluetooth chat的範例直接改比較快,但後來發現此範例字串有漏接的情況,最後改BluetoothchatService中ConnectThread的run部份解決了此問題,程式碼如下 ```Java public void run() { Log.i(TAG, "BEGIN mConnectedThread"); // Keep listening to the InputStream while connected while (true) { Scanner scanner = new Scanner(mmInStream); while( scanner.hasNext()) { String readMessage = scanner.nextLine(); mHandler.obtainMessage(Oscillator.MESSAGE_READ, -1, -1, readMessage) .sendToTarget(); } } } ```

2013年1月1日 星期二

RS232傳輸(使用DMAR-128開發板,開發環境為AVR Studio)

這是用來練習如何在AVR單晶片上利用RS232傳輸,電腦端輸入數值傳送到開發板,透過七段顯示器顯示數值,程式碼如下:

#include<avr/io.h>
#include<avr/interrupt.h>
#include<avr/delay.h>
#include <string.h>
#include <stdio.h>
#define F_CPU 7372800
#define BAURDRATE 9600
#define UBRR_VALUE (unsigned char)((unsigned long)F_CPU/(16*(unsigned long)BAURDRATE)-1)
#define UBRR_VALUE_H (unsigned char)UBRR_VALUE>>8
#define UBRR_VALUE_L (unsigned char)UBRR_VALUE
#define D_LE0            PORTD &= ~(1 << PD4) 
#define D_LE1           PORTD |= (1 << PD4)  
#define W_LE0            PORTD &= ~(1 << PD5) 
#define W_LE1           PORTD |= (1 << PD5) 
#define DATA PORTA
#define SIZE 8
unsigned char str[SIZE];
unsigned char getstr[SIZE];
short int counter = -1;
void initialize(void);
void show_one(unsigned char,unsigned char);
void show(unsigned char[]);

void uart0Init(void)
{
    UBRR0H = UBRR_VALUE_H;
    UBRR0L = UBRR_VALUE_L;
    UCSR0B = _BV(RXEN1) | _BV(RXCIE1) | _BV(TXEN1);
    UCSR0C = _BV(UCSZ11) | _BV(UCSZ10);
}

SIGNAL(SIG_USART0_RECV)
{
    //str[++counter] = UDR0;
    //if (counter== 7)counter = -1;
    getstr[++counter] = UDR0;
    while(!(UCSR0A&_BV(UDRE1)));
    UDR0=getstr[counter];
    if (!getstr[counter] | getstr[counter] == (unsigned char)13) {
        getstr[counter] = 0;
        strcpy(str,getstr);
        counter = -1;
    }
}

int main(void)
{
    initialize();
    uart0Init();
    sei();
    while(1){
        show(str);
    }
    return 0;
}

void show_one(unsigned char number,unsigned char place) {
    unsigned char pattern[12]={0x3f,0x06,0x5b,0x4f,0x66,0x6d, 0x7d,0x07,0x7f,0x6f,0x40,0x79};
    D_LE1;
    W_LE1;
    DATA=~(0x01&lt;&lt;place);
    W_LE0;
    DATA=pattern[number];
    D_LE0;
    return;
}

void show(unsigned char seg7[]) {
    unsigned char i;
    for(i=0;seg7[i];i++) {
        show_one(seg7[i]-'0',SIZE-(strlen(seg7)-1-i)-1);
        _delay_ms(1);
    }
    for(i=i;i<SIZE;i++) {
        show_one(0,SIZE-i-1);
        _delay_ms(1);
    }
    _delay_ms(1);
    return;                    
}

void initialize(void) {    
    DDRA=0XFF;
    PORTA=0xFF;

    DDRC=0XF0;
    PORTC=0xF0;

    DDRD=0XFF;
    PORTD=0xFF;
}