原创 arm linux無線路由

         一塊arm開發板,帶有以太網口,還有一個在京東上買的usbwifi模塊,wifi模塊在ubuntu上直接可以用,輸入lsusb,發現其使用的wifi模塊竟然是realtek的8192,於是想用這兩個網口實現無線路由的轉發

原创 自旋鎖的使用

自旋鎖有兩個版本: spin_lock() spin_lock_irqsave() 個人理解,如果只在ISR中,使用spin_lock(); 如果在進程上下文,或者進程上下文或者中斷上下文都用到, 或者在某個函數中用到,而這個函數

原创 linux4.9內核PCIe的一個問題

diff --git a/drivers/pci/setup-bus.c b/drivers/pci/setup-bus.c index f30ca75b5b6c…d87876fb8f90 100644 — a/drivers/p

原创 回聲消除數據對齊軟件方法

回聲消除需要採集兩路數據,而且這兩路數據要在時間軸上對齊, 這裏介紹一種簡單的方法: 驅動裏增加一個ioctl命令,上層軟件開始採集數據的時候driver同時使能兩路音頻數據的採集。

原创 SD卡測試腳本

#!/bin/bash cp /mnt/sdcard/appfs.cramfs /tmp/a.bin umount /usr/fs md5a=md5sum /tmp/a.bin | awk '{print $1 }' asize=

原创 linux gpio驅動示例

#include <linux/fs.h> #include <linux/module.h> #include <linux/kernel.h> #include <linux/init.h> #include <linux/i

原创 sin函數生成PCM文件

  利用正弦函數採樣生成音頻RAW數據存入PCM文件.用Audacity打開可以看到波形:  

原创 C函數與棧的理解

棧是一段內存空間,用來存儲局部的變量,sp寄存器值是這片空間的基址,大小是編譯的時候算出來的。 下面的例子直觀的說明了這一點: test.c: #include <stdio.h> #include <stdlib.h> int

原创 C指針的理解

c語言中變量對應彙編立即數尋址,指針對應寄存器尋址,指針的指針對應寄存器間接尋址。用下面這段代碼作爲例子: test.c: #include <stdio.h> #include <stdlib.h> int main(int a

原创 宏函數的返回值

宏函數,在定義時不需要指明返回類型及返回值 宏函數中最後一個表達式的值,即爲宏函數的返回值。 該值的類型,即爲宏函數的返回類型。 #define Min(x, y) ((x)<(y)?(x):(y) int main() {

原创 spin_lock爲什麼要關閉搶佔?

The reason that preemption is disabled on a uniprocessor system is: If not: P1 holds the lock and after a time is s

原创 重採樣庫示例

功能:對音頻數據重採樣,適用於單聲道16位音頻數據。 ​#include <fcntl.h> #define BUFFER_LEN30*48000*2 static void simple_test (int converter,

原创 linux內核宏的閱讀方法

預編譯將內核代碼中的宏替換掉,再把得到的c代碼對齊閱讀 下面是預編譯後的一個例子: extern void task_cputime_adjusted(struct task_struct *p, cputime_t *ut,

原创 一種調試方法

芯片驗證期間,可能在palladium上調試driver,早期只起了個ramdisk文件系統,網絡,sd卡,u盤可能都不能使用,如何將ko傳到文件系統裏?如果把ko直接編譯進內核,再用jtag燒錄,這也是一種辦法,但是由於pall

原创 qemu添加網卡

ip link add brtest0 type bridge ip tuntap add tap0 mode tap user wood ip link set tap0 up ip link set tap0 master b