我真的很討厭工具...一段時間沒用一定不會記得...
還是寫程式比較好...有良好的邏輯觀念就可以寫出我要用的功能...
函式用法man一下就知道了...我真的不想當個google廚阿 OTZ
抱怨到這邊...這篇是來記錄alsa-utils的一些使用記錄
aplay - alsa player
可以播放wav、voc、raw or au,不能播mp3
amixer - command-line mixer for ALSA soundcard driver
同alsamixer,只是是command-line,要在後面加參數
ex: 將左聲道靜音,將右聲道調到最大聲
amixer -c 1 (看一下card 1的資訊)
將card1的Playback,0上的左聲道聲音設為0%,右聲道為100%
amixer -c 1 sset Playback,0 0%,100%
alsamixer -soundcard mixer for ALSA soundcard driver, with ncurses interface
故名思義,就是有著簡易圖形介面的amixer,F6可以切換card number。
arecord - command-line sound recorder and player for ALSA sound-card driver
錄音程式,可以將line-in以及mic-in的聲音錄起來,再透過aplay來播放
ex: 錄10秒 Line-in/Mic-in的聲音,然後播放
先用alsamixer來切換capture的內容(mic-in or line-in)
alsamixer -c 1
錄製10秒,存成test.wav
arecord -d 10 test.wav
播放test.wav
aplay test.wav
2011年12月2日 星期五
2011年10月28日 星期五
mplayer for console mode and mplayer benchmark
# mplyaer -nosound -vo fbdev:/dev/fb2 -benchmark $FILE_NAME
用fb2來播影片,無聲,播放完畢後顯示benchmark
BENCHMARKs: VC: 99.066s VO: 24.192s A: 0.000s Sys: 1.214s = 124.472s
VC: video codec
VO: video output
A: audio codec
Sys: kerenl time
Total time
不要vo,只要單純測video codec的話,就加上 -vo null
用fb2來播影片,無聲,播放完畢後顯示benchmark
BENCHMARKs: VC: 99.066s VO: 24.192s A: 0.000s Sys: 1.214s = 124.472s
VC: video codec
VO: video output
A: audio codec
Sys: kerenl time
Total time
不要vo,只要單純測video codec的話,就加上 -vo null
2011年8月24日 星期三
PXE Server on Debian 6.0 (squeeze)
使用Linux的環境架設PXE Server
何謂PXE Server: Preboot Execution Environment
環境: Debian 6.0(代號: squeeze)
核心: Kernel 2.6.32-5-686
硬體: 945GSE晶片組
我是用Expert install來裝Debian 6.0,所以我無法保証是不是要額外裝其他的套件 XD
PXE Server,主要是由兩個最重要的功能所組成:
1. DHCP: 提供給 Target Board IP (Target Board本身必需將BIOS選項裡的Lan Boot功能打開)
2. TFTP: 提供Image,讓Target Board可以得到所需的Image. (pelinux.0)
DHCP Server: dhcp3-server
同時會安裝isc-dhcp-server,而在/etc/init.d下,是看到isc-dhcp-server。
需要修改設定檔,才可以讓dhcp server正確的運作。
設定檔名稱: /etc/dhcp/dhcpd.conf
下面是修改過的地方:
增加DNS,只是不曉得這樣有沒有問題就是了~XD 我只需要看到安裝的畫面就好~所以也沒測
option domain-name-servers 168.95.1.1, 8.8.8.8, 8.8.4.4;
第二段才是在述敘此DHCP Server的運作模式
subnet 10.1.199.0 netmask 255.255.255.0 {
range 10.1.199.50 10.1.199.200; >> Target board能拿到的ip範圍
filename "pxelinux.0"; >> DHCP到IP後,要跟TFTP討的檔案名稱
next-server 10.1.199.2; >> TFTP Server IP
option subnet-mask 255.255.255.0; >> netmask
option broadcast-address 10.1.199.255; >> broadcast
option routers 10.1.199.254; >> routers
}
TFTP Server: atftpd
因為一開始裝了其他的套件,所以並不確定atftpd是不是一開始就有
設定檔名稱: /etc/default/atfptd
設定檔內容:
USE_INETD=false >> 使tftpd不使用inetd(但是這邊我不是很確定,因為其實可以修改/etc/inetd.conf,但是將tftp那行註解掉後,tftp server也會有問題)
OPTIONS="--tftpd-timeout 300 --retry-timeout 5 --mcast-port 1758 --mcast-addr 10.1.199.0-255 --mcast-ttl 1 --maxthread 100 --verbose=5 /home/avalue/tftp"
一些設定就自己man一下atftpd,主要就是最後的參數/home/avalue/tftp。
這就是設定tftp的root directory.
嗯...除了設定atfptd之外,也要修改/etc/inetd.conf下的tftp設定,將tftp root改為/home/avalue/tftp (這邊應該是我有地方沒設定好才會需要修改這個地方)
PXE Server:
DHCP Server以及TFTP Server都設定好後,就只差PXE Server所需要的檔案了。
PXE Server會去找pxe loader >> pxelinux.0,而這個檔案會去讀取pxelinux.cfg下的default。
我一開始要笨...把pxelinux.cfg當一個檔案,所以我的PXE Server會一直說找不到pxelinux.cfg/default
這些相關的檔案可以至義守大學的FTP站 http://ftp.isu.edu.tw/pub/Linux/Debian/debian/dists/lenny/main/installer-i386/20090123lenny8/images/netboot/
裡面有所需的pxelinux.0,以及pxelinux.cfg用的default。
透過default,你可以修改你的PXE Server要做的事情。
例如在義大站台下載到的default,內容如下:
include debian/squeeze/i386/boot-screens/menu-cfg
default debian/squeeze/i386/boot-screens/vesamenu.c32
嗯...長得不一樣...因為這是我的tftp內的路徑 w
所以pxe server會去tftp server下的debian/squeeze/i386/boot-screens/menu-cfg讀取設定
假如使用義大的設定,那最後PXE跑起來會是Debian的安裝畫面~
有要補充的之後有空再補充
何謂PXE Server: Preboot Execution Environment
環境: Debian 6.0(代號: squeeze)
核心: Kernel 2.6.32-5-686
硬體: 945GSE晶片組
我是用Expert install來裝Debian 6.0,所以我無法保証是不是要額外裝其他的套件 XD
PXE Server,主要是由兩個最重要的功能所組成:
1. DHCP: 提供給 Target Board IP (Target Board本身必需將BIOS選項裡的Lan Boot功能打開)
2. TFTP: 提供Image,讓Target Board可以得到所需的Image. (pelinux.0)
DHCP Server: dhcp3-server
同時會安裝isc-dhcp-server,而在/etc/init.d下,是看到isc-dhcp-server。
需要修改設定檔,才可以讓dhcp server正確的運作。
設定檔名稱: /etc/dhcp/dhcpd.conf
下面是修改過的地方:
增加DNS,只是不曉得這樣有沒有問題就是了~XD 我只需要看到安裝的畫面就好~所以也沒測
option domain-name-servers 168.95.1.1, 8.8.8.8, 8.8.4.4;
第二段才是在述敘此DHCP Server的運作模式
subnet 10.1.199.0 netmask 255.255.255.0 {
range 10.1.199.50 10.1.199.200; >> Target board能拿到的ip範圍
filename "pxelinux.0"; >> DHCP到IP後,要跟TFTP討的檔案名稱
next-server 10.1.199.2; >> TFTP Server IP
option subnet-mask 255.255.255.0; >> netmask
option broadcast-address 10.1.199.255; >> broadcast
option routers 10.1.199.254; >> routers
}
TFTP Server: atftpd
因為一開始裝了其他的套件,所以並不確定atftpd是不是一開始就有
設定檔名稱: /etc/default/atfptd
設定檔內容:
USE_INETD=false >> 使tftpd不使用inetd(但是這邊我不是很確定,因為其實可以修改/etc/inetd.conf,但是將tftp那行註解掉後,tftp server也會有問題)
OPTIONS="--tftpd-timeout 300 --retry-timeout 5 --mcast-port 1758 --mcast-addr 10.1.199.0-255 --mcast-ttl 1 --maxthread 100 --verbose=5 /home/avalue/tftp"
一些設定就自己man一下atftpd,主要就是最後的參數/home/avalue/tftp。
這就是設定tftp的root directory.
嗯...除了設定atfptd之外,也要修改/etc/inetd.conf下的tftp設定,將tftp root改為/home/avalue/tftp (這邊應該是我有地方沒設定好才會需要修改這個地方)
PXE Server:
DHCP Server以及TFTP Server都設定好後,就只差PXE Server所需要的檔案了。
PXE Server會去找pxe loader >> pxelinux.0,而這個檔案會去讀取pxelinux.cfg下的default。
我一開始要笨...把pxelinux.cfg當一個檔案,所以我的PXE Server會一直說找不到pxelinux.cfg/default
這些相關的檔案可以至義守大學的FTP站 http://ftp.isu.edu.tw/pub/Linux/Debian/debian/dists/lenny/main/installer-i386/20090123lenny8/images/netboot/
裡面有所需的pxelinux.0,以及pxelinux.cfg用的default。
透過default,你可以修改你的PXE Server要做的事情。
例如在義大站台下載到的default,內容如下:
include debian/squeeze/i386/boot-screens/menu-cfg
default debian/squeeze/i386/boot-screens/vesamenu.c32
嗯...長得不一樣...因為這是我的tftp內的路徑 w
所以pxe server會去tftp server下的debian/squeeze/i386/boot-screens/menu-cfg讀取設定
假如使用義大的設定,那最後PXE跑起來會是Debian的安裝畫面~
有要補充的之後有空再補充
2011年8月3日 星期三
Add Kernel Configuration -- 「Select Option」
要加入kernel option的選項,讓編譯時可以選擇產品,讓程式碼變得比較有彈性。
參考kernel config裡的一些設定方式,試著做出想要的功能
原來的menuconfig如下,我想在MX51 BABBAGE那邊多加選項,變成可以選公板或我們自己的板子。
改變後如下兩張圖
點進去後長樣子
程式碼如下
其實為何要用的那麼麻煩,因為我本來是直接加#define RSC_IMX51在code裡面,但是compile時,會該該叫(Warning),所以就循正規做法來實作。
參考kernel config裡的一些設定方式,試著做出想要的功能
原來的menuconfig如下,我想在MX51 BABBAGE那邊多加選項,變成可以選公板或我們自己的板子。
改變後如下兩張圖
點進去後長樣子
程式碼如下
choice
prompt "Board Selected:"
default RSC_IMX51
depends on MACH_MX51_BABBAGE
config RSC_IMX51
bool "Avalue RSC-IMX51"
help
This enables support for systems based on the Avalue RISC Product RSC-IMX51 Board
config EVK_IMX51
bool "Freescale EVK-IMX51"
help
This enables support for systems based on the Freescale i.MX51 EVK Board
endchoice
其實為何要用的那麼麻煩,因為我本來是直接加#define RSC_IMX51在code裡面,但是compile時,會該該叫(Warning),所以就循正規做法來實作。
2011年6月14日 星期二
CONFIG_UNIX98_PTYS
PTY = pseudo terminal
也就是假的terminal
主要說明如kernel options內的說明,有master以及slave. slave就是常見的/dev/tty系列.
這個網頁有解譯比較清楚的pseudo terminal的觀念.
偽終端(Pseudo Terminal)是成對的邏輯終端設備(即master和slave設備, 對master的操作會反映到slave上)。
例如/dev/ptyp3和/dev/ttyp3(或者在設備文件系統中分別是/dev/pty/m3和 /dev/pty/s3)。它們與實際物理設備並不直接相關。如果一個程序把ptyp3(master設備)看作是一個串行端口設備,則它對該端口的讀/ 寫操作會反映在該邏輯終端設備對應的另一個ttyp3(slave設備)上面。而ttyp3則是另一個程序用於讀寫操作的邏輯設備。
這樣,兩個程序就可以通過這種邏輯設備進行互相交流,而其中一個使用ttyp3的程序則認為自己正在與一個串行端口進行通信。這很像是邏輯設備對之間的管道操作。對於ttyp3(s3),任何設計成使用一個串行端口設備的程序都可以使用該邏輯設備。但對於使用ptyp3的程序,則需要專門設計來使用 ptyp3(m3)邏輯設備。
例如,如果某人在網上使用telnet程序連接到你的計算機上,則telnet程序就可能會開始連接到設備 ptyp2(m2)上(一個偽終端端口上)。此時一個getty程序就應該運行在對應的ttyp2(s2)端口上。當telnet從遠端獲取了一個字符時,該字符就會通過m2、s2傳遞給 getty程序,而getty程序就會通過s2、m2和telnet程序往網絡上返回」login:」字符串信息。這樣,登錄程序與telnet程序就通過「偽終端」進行通信。通過使用適當的軟件,就可以把兩個甚至多個偽終端設備連接到同一個物理串行端口上。
大概就是這樣...算是要enable起來的kernel option.
也就是假的terminal
主要說明如kernel options內的說明,有master以及slave. slave就是常見的/dev/tty系列.
這個網頁有解譯比較清楚的pseudo terminal的觀念.
偽終端(Pseudo Terminal)是成對的邏輯終端設備(即master和slave設備, 對master的操作會反映到slave上)。
例如/dev/ptyp3和/dev/ttyp3(或者在設備文件系統中分別是/dev/pty/m3和 /dev/pty/s3)。它們與實際物理設備並不直接相關。如果一個程序把ptyp3(master設備)看作是一個串行端口設備,則它對該端口的讀/ 寫操作會反映在該邏輯終端設備對應的另一個ttyp3(slave設備)上面。而ttyp3則是另一個程序用於讀寫操作的邏輯設備。
這樣,兩個程序就可以通過這種邏輯設備進行互相交流,而其中一個使用ttyp3的程序則認為自己正在與一個串行端口進行通信。這很像是邏輯設備對之間的管道操作。對於ttyp3(s3),任何設計成使用一個串行端口設備的程序都可以使用該邏輯設備。但對於使用ptyp3的程序,則需要專門設計來使用 ptyp3(m3)邏輯設備。
例如,如果某人在網上使用telnet程序連接到你的計算機上,則telnet程序就可能會開始連接到設備 ptyp2(m2)上(一個偽終端端口上)。此時一個getty程序就應該運行在對應的ttyp2(s2)端口上。當telnet從遠端獲取了一個字符時,該字符就會通過m2、s2傳遞給 getty程序,而getty程序就會通過s2、m2和telnet程序往網絡上返回」login:」字符串信息。這樣,登錄程序與telnet程序就通過「偽終端」進行通信。通過使用適當的軟件,就可以把兩個甚至多個偽終端設備連接到同一個物理串行端口上。
大概就是這樣...算是要enable起來的kernel option.
2011年4月22日 星期五
UTF-8 與 BIG5 轉換
Big-5 To Utf-8
iconv -f big5 -t utf-8 big5.txt -o utf8.txt
Utf-8 To Big-5
iconv -f utf-8 -t big5 utf8.txt -o big5.txt
iconv -f big5 -t utf-8 big5.txt -o utf8.txt
Utf-8 To Big-5
iconv -f utf-8 -t big5 utf8.txt -o big5.txt
2011年3月2日 星期三
TFTP Server
這邊記錄的是atftpd
參考這裡
修改/etc/default/atftpd
USE_INETD=false
OPTIONS="--tftpd-timeout 300 --retry-timeout 5 --mcast-port 1758 --mcast-addr 10.1.1.0-255 --mcast-ttl 1 --maxthread 100 --verbose=5 /tftp"
使剛剛的設定生效
~$sudo invoke-rc.d atftpd start
修改Server資料夾的權限
~$sudo chmod -R 777 /tftp
~$sudo chown -R nobody /tftp
重啟
~$sudo reboot
我沒有設定防火牆,所以不用去設定。假如有開防火牆,就要允許Client端進入
參考這裡
修改/etc/default/atftpd
USE_INETD=false
OPTIONS="--tftpd-timeout 300 --retry-timeout 5 --mcast-port 1758 --mcast-addr 10.1.1.0-255 --mcast-ttl 1 --maxthread 100 --verbose=5 /tftp"
使剛剛的設定生效
~$sudo invoke-rc.d atftpd start
修改Server資料夾的權限
~$sudo chmod -R 777 /tftp
~$sudo chown -R nobody /tftp
重啟
~$sudo reboot
我沒有設定防火牆,所以不用去設定。假如有開防火牆,就要允許Client端進入
Git 二三事
不常用,但是還是會用,所以一定會忘記...
1. 第一次用Git,初始化Git
~$ git init
2. 將所有的code加入Git database
~$ git add .
3. 由於Git預設Editor是Nano(應該),改成習慣的vim
~$ vi .git/config
加入下面這一句
editor = vim
4. commit
~$ git commit -a
可以在此時記錄這一版修改了什麼
1. 第一次用Git,初始化Git
~$ git init
2. 將所有的code加入Git database
~$ git add .
3. 由於Git預設Editor是Nano(應該),改成習慣的vim
~$ vi .git/config
加入下面這一句
editor = vim
4. commit
~$ git commit -a
可以在此時記錄這一版修改了什麼
2011年2月18日 星期五
加快開機速度
這邊記錄如何加快開機速度
有兩種方式:
1. 將用不到的功能從核心中移除
2. 將用不到的服務從設定檔中移除
1的話請參考如何優化Linux Kernel
這邊只討論2的狀況
~$ runlevel 可以查目前環境的runlevel
N 2
所以runlvel = 2
那Linux載入時會去參考 /etc/rc2.d裡的設定
~$ ls /etc/rc2.d
README S20atftpd S20fancontrol ... S79sendmail... 略
我根本用不到mail啊...每次開機到 "Mail Transport Agent (MTA) Sendmail starting" 就會停在這一下,拖慢我的開機速度
看一下S79sendmail實際長啥樣
~$ ls -l /etc/rc2.d/S79sendmail
lrwxrwxrwx 1 root root 18 2011-02-18 18:50 S79sendmail -> ../init.d/sendmail
所以他實際上是/etc/init.d/sendmail
看一下rc.d的Readme
~$ cat /etc/rc2.d/README
To disable a service in this runlevel, rename its script in this
directory so that the new name begins with a 'K' and a two-digit
number, and run 'update-rc.d script defaults' to reorder the scripts according to dependencies.
man一下update-rc.d就知道如何開關服務
~$ sudo update-rc.d sendmail disable
這樣就不會在開機時開啟 sendmail這個script了
有空再解譯/etc/init.d/sendmail在做啥
有兩種方式:
1. 將用不到的功能從核心中移除
2. 將用不到的服務從設定檔中移除
1的話請參考如何優化Linux Kernel
這邊只討論2的狀況
~$ runlevel 可以查目前環境的runlevel
N 2
所以runlvel = 2
那Linux載入時會去參考 /etc/rc2.d裡的設定
~$ ls /etc/rc2.d
README S20atftpd S20fancontrol ... S79sendmail... 略
我根本用不到mail啊...每次開機到 "Mail Transport Agent (MTA) Sendmail starting" 就會停在這一下,拖慢我的開機速度
看一下S79sendmail實際長啥樣
~$ ls -l /etc/rc2.d/S79sendmail
lrwxrwxrwx 1 root root 18 2011-02-18 18:50 S79sendmail -> ../init.d/sendmail
所以他實際上是/etc/init.d/sendmail
看一下rc.d的Readme
~$ cat /etc/rc2.d/README
To disable a service in this runlevel, rename its script in this
directory so that the new name begins with a 'K' and a two-digit
number, and run 'update-rc.d script defaults' to reorder the scripts according to dependencies.
man一下update-rc.d就知道如何開關服務
~$ sudo update-rc.d sendmail disable
這樣就不會在開機時開啟 sendmail這個script了
有空再解譯/etc/init.d/sendmail在做啥
2011年2月10日 星期四
Linux上的續傳軟體
公司的網路真是非常容易斷...而且有些人會開BT下載東西,造成下載速度很慢 囧
每次用chrome下載大一點的檔案,都很容易因為斷線就再也不動了...
就算暫停再啟動也是一樣...這不知道是chrome的關係還是Linux版chrome的關係
其實Linux就有非常好用的續傳軟體了~好用又小
wget -c (continue)
一般我是使用wget http://xxxx 就可以從網址抓下東西
斷了想要續傳就 wget -c http://xxxx
有帳號密碼的就
http: wget -d --http-user=xxx --http-passwd=xxx http://url
ftp: wget -d --ftp-user=xxx --ftp-password=xxx http://url
就這樣!
Useful website
http://www.cyberciti.biz/tips/linux-wget-your-ultimate-command-line-downloader.html
每次用chrome下載大一點的檔案,都很容易因為斷線就再也不動了...
就算暫停再啟動也是一樣...這不知道是chrome的關係還是Linux版chrome的關係
其實Linux就有非常好用的續傳軟體了~好用又小
wget -c (continue)
一般我是使用wget http://xxxx 就可以從網址抓下東西
斷了想要續傳就 wget -c http://xxxx
有帳號密碼的就
http: wget -d --http-user=xxx --http-passwd=xxx http://url
ftp: wget -d --ftp-user=xxx --ftp-password=xxx http://url
就這樣!
Useful website
http://www.cyberciti.biz/tips/linux-wget-your-ultimate-command-line-downloader.html
2011年1月13日 星期四
platfrom_match trace
在kernel內,許多結構內都會包含一個父結構成員,以利結構的轉換。
今天trace platform device,看如何利用platform device structure內的device structure pointer得知platform device structure的位址
呼叫platform_match in drivers/base/platform.c
這是platform_match的定義
主要今天目標是這行,之前上課時老師有說過,現在才拿出來看 T _ T
struct platform_device *pdev = to_platform_device(dev);
define to_platform_device in include/linux/platform_device.h
define container_of in include/linux/kernel.h
define offsetof in include/linux/stddef.h
offsetof 將0轉換成(TYPE *),即指向0的TYPE指標,((size_t) &((TYPE *)0)->MEMBER)就可以取得此MEMBER在這結構內位址值。
比如說platform_device structure(pd) 內的 device structure(dev)成員位置在0x1004。
假設dev在pd內的相對位址為4,那0x1004減去4就可以得到pd的指標位址。
今天trace platform device,看如何利用platform device structure內的device structure pointer得知platform device structure的位址
呼叫platform_match in drivers/base/platform.c
static __init struct platform_device *
early_platform_match(struct early_platform_driver *epdrv, int id)
{
struct platform_device *pd;
list_for_each_entry(pd, &early_platform_device_list, dev.devres_head)
if (platform_match(&pd->dev, &epdrv->pdrv->driver))
if (pd->id == id)
return pd;
return NULL;
}
這是platform_match的定義
static int platform_match(struct device *dev, struct device_driver *drv)
{
struct platform_device *pdev = to_platform_device(dev);
struct platform_driver *pdrv = to_platform_driver(drv);
/* match against the id table first */
if (pdrv->id_table)
return platform_match_id(pdrv->id_table, pdev) != NULL;
/* fall-back to driver name match */
return (strcmp(pdev->name, drv->name) == 0);
}
主要今天目標是這行,之前上課時老師有說過,現在才拿出來看 T _ T
struct platform_device *pdev = to_platform_device(dev);
define to_platform_device in include/linux/platform_device.h
#define to_platform_device(x) container_of((x), struct platform_device, dev)
define container_of in include/linux/kernel.h
#define container_of(ptr, type, member) ({ \
const typeof( ((type *)0)->member ) *__mptr = (ptr); \
(type *)( (char *)__mptr - offsetof(type,member) );})
define offsetof in include/linux/stddef.h
#ifdef __compiler_offsetof
#define offsetof(TYPE,MEMBER) __compiler_offsetof(TYPE,MEMBER)
#else
#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
#endif
#endif /* __KERNEL__ */
offsetof 將0轉換成(TYPE *),即指向0的TYPE指標,((size_t) &((TYPE *)0)->MEMBER)就可以取得此MEMBER在這結構內位址值。
比如說platform_device structure(pd) 內的 device structure(dev)成員位置在0x1004。
假設dev在pd內的相對位址為4,那0x1004減去4就可以得到pd的指標位址。