Category: Linux

Debian Sid下通過HTC Hero共享上網

By ganquan, 2010年06月12日 20:03

今天下午畢設答辯,我是倒數第二個。等待是無聊的,實驗室又沒有網絡,也沒有找到wifi,索性打開筆記本連上Hero上網聊天。

本文描述的方法僅在如下環境測試通過:

Debian Sid 2.6.32-5-686

HTC Hero 2.1ROM

中國移動西安網絡

步驟如下:

1.用USB線連接筆記本和Hero,在Hero上選擇連接類型為“Internet共享”。

2.在Debian下執行sudo ifconfig -a,可以看到名為usb0的網卡

3.執行sudo dhclient usb0,給usb0申請IP,我這裡得到的是192.168.100.100

4.執行ping -I usb0 google.com來測試網絡是否通暢

然後就可以用筆記本上網了,很方便吧。^_^

EOF

Linux转换视频到mp4

By ganquan, 2010年05月10日 22:52

Hero播放视频的效果好得让我相当的惊讶!赶紧把我喜欢的MV都弄到Hero上。
以后坐车有得看啦,HOHO

ganquan@debian:~$ mencoder -of lavf -lavfopts format=mp4 -oac lavc -ovc lavc -lavcopts aglobal=1:vglobal=1:vcodec=mpeg4:vbitrate=600:acodec=libfaac:abitrate=128 -af lavcresample=22050 -vf dsize=480:360:0,scale=0:0,expand=480:360,harddup -ofps 25 -srate 22050 -o output.mp4  inputfile

framebuffer分辨率色彩表

By ganquan, 2010年05月8日 12:37

自己留一份,懶得搜。

色彩 640×400 640×480 800×600 1024×768 1280×1024 1600×1200
4bits ? ? 0×302 ? ? ?
8bits 0×300 0×301 0×303 0×305 0×307 0x31C
15bits ? 0×310 0×313 0×316 0×319 0x31D
16bits ? 0×311 0×314 0×317 0x31A 0x31E
24bits ? 0×312 0×315 0×318 0x31B 0x31F
32bits ? ? ? ? ? ?

EOF

如何在内核空间对文件进行操作

By ganquan, 2010年05月6日 09:52

在内核空间中,是不能直接使用open, read, write之类的系统调用直接访问文件的。那怎么在驱动中访问一个文件呢?

我们知道在内核中用struct file来表示一个打开的文件,file结构体中有一个字段f_op,它是struct file_operation的指针。有了这个指针,就可以对文件进行访问了。
代码如下:

struct file *filp;
mm_segment_t fs;

filp = filp_open("/path/to/your/file", O_RDWR, 0);

if(!IS_ERR(filp))
{
    fs=get_fs();
    set_fs(KERNEL_DS);

    filp->f_op->read(...);
    filp->f_op->write(...);

    set_fs(fs);

    filp->f_op->mmap(...);

    /* ... */
}

filp_close(filp, NULL);


f_op->read()和f_op->write()的第二个参数是char __user *,也就是说是用户空间的地址,所以在驱动中直接传递kernel空间的指针,这两个函数都会返回失败-EFAULT。因此,在f_op->read()和f_op->write()之前需要使用void set_fs(mm_segment_t fs);来改变kernel对内存地址检查的处理方式。
该函数的参数fs只有两个取值:USER_DS,KERNEL_DS,分别代表用户空间和内核空间,默认情况下,kernel取值为USER_DS。所以可以用set_fs(KERNEL_DS);来让这个两个函数可以接受内核空间的内存。在内核空间中其他用__user修饰的参数,需要用kernel空间的内存代替时,都可以用类似的方法。
另外一个常用的函数f_op->mmap()则不需要设置fs,因为它的参数中不需要用户空间的内存。事实上,在struct file_operation中,只有read和write函数需要用户空间的内存,其他函数都不需要设置fs。
EOF

解決編譯qvfb問題

By ganquan, 2010年04月25日 21:44

安裝QTE后自然是裝qvfb,遇到編譯錯誤。google一下,解決。

1.拷貝/path-to-qt-src/tools/shared/deviceskin目錄下的deviceskin.cpp和deviceskin.h到qvfb目錄

2.在qvfb目錄下qmake -project生成Makefile

3.修改Makefile中的LIBS,加上-lXtst

4.然後make即可

內存雜記

By ganquan, 2010年04月5日 15:26

在內核中,物理內存是用“頁”來管理的,頁大小取決於系統構架,X86上面是4096bytes,每一頁都由struct page(include/linux/mm_types.h)來描述
32位X86平台上,內核默認把4G地址空間分成兩部分,3GB給用戶進程,1GB給內核。虛擬地址空間0 -3GB被稱為用戶空間,3GB – 4GB被稱為內核空間

在物理地址上,0 – 1GB是給內核,1GB – 3GB給用戶。後者叫做ZONE_HIGH,前者中0 – 16MB部分叫做ZONE_DMA,16MB – 896MB 部分叫做ZONE_NORMAL,896MB之後還有128MB被內核數據結構佔用了。內核中低端896MB內存的地址是物理地址加上一個常偏移量(constant offset)得到的,這個地址叫做邏輯地址(logical address)。內核也可以訪問超過896MB的內存,不過需要開啟高內存支持(high memory support)

3個ZONE的要點:
1.ZONE_DMA就是用來做DMA的
2.ZONE_NORMAL叫做低端內存,這個ZONE裡面的內存,struct page的的virtual字段的內容就是logical address
3.ZONE_HIGH中的內存映射到ZONE_NORMAL中之後(用kmap()和kunmap())就可以被內核訪問。這個ZONE中是虛擬地址,而不是邏輯地址,所以這部分內存如果沒有kmap到內核空間,struct page的virtual字段就是NULL

kmalloc函數返回的是連續的內存,這些內存來自於ZONE_NORMAL。kmalloc返回的內存中留存了先前的內容,所以把這些內存暴露給用戶空間是不安全的。用kzalloc()可以獲得清零的內存。分配大量緩衝區或者不需要物理連續的內存時,用vmalloc()代替kmalloc()。

繼續越獄

By ganquan, 2010年03月7日 17:57

帝都近日正在開派對,全國亞克蜥匯集到帝都一展和諧神力,網絡封鎖日益加重,原來的越獄方法已經失效。我怎麼繼續像往常那樣越獄出去娛樂呢?

好在puff已經發布了新的客戶端,繼續無視強大的和諧之力,但是puff免費版的強制斷線功能又讓我非常不爽。免費又方便的tor遭受和諧打擊也不能繼續越獄,即使用新的網橋也沒用。抱着一絲希望決定安裝development branch試試,哈哈,成功越獄。方法很簡單:

1.添加tor的development branch源

ganquan@debian:~$ cat /etc/apt/sources.list | tail -n 4
#for tor
deb http://deb.torproject.org/torproject.org sid main
deb http://deb.torproject.org/torproject.org experimental-sid main

2.導入源的密鑰

ganquan@debian:~$ gpg --keyserver keys.gnupg.net --recv 886DDD89
ganquan@debian:~$ gpg --export A3C4F0F979CAA22CDBA8F512EE8CBC9E886DDD89 | sudo apt-key add -

3.由於torproject.org已經被牆,無法直接訪問,aptitude照樣不能拿到包子,所以需要給aptitude設置代理

ganquan@debian:~$ cat /etc/apt/apt.conf
Acquire::http::proxy "http://127.0.0.1:1984/";

經常翻牆的同學已經看到我給aptitude設置的是什麼代理了。

4.安裝開發分支的tor

ganquan@debian:~$ sudo aptitude update
ganquan@debian:~$ sudo aptitude install tor tor-geoipdb

裝好了再度越獄,成功。
EOF

vim以16进制方式显示文本

By ganquan, 2010年03月1日 03:54

:%!xxd     —->切换到十六进制显示
:%!xxd -r  —->切回文本方式显示

全面轉到Debian sid

By ganquan, 2009年12月29日 16:31

以前都是一直用testing,前段時間更換硬盤之後就開始用stable。今天轉到sid,以後應該是一直用sid了。

開發除了相關庫版本升級,其他沒什麼變化。

移植2.6.32内核到mini2440开发板

By ganquan, 2009年12月13日 16:02

转载请注明出处:http://ganquan.org,谢谢。本文链接是http://ganquan.org/blog/2009/12/2-6-32-port-to-mini2440/

过程非常简单,麻烦的是如果出问题,就要要一遍又一遍的编译。

先上图:

友善官方的Qtopia系统我早就看烦了,直接启动进入字符界面

img_3676

下面是移植步骤,

1.www.kernel.org下载内核代码,修改构架和编译器

2.修改时钟频率,mini2440开发板用的是12M晶振,修改arch/arm/mach-s3c2440/mach-smdk2440.c

把下面代码中的16934400改为12000000,如果不改串口会出现乱码

static void __init smdk2440_map_io(void)
{
s3c24xx_init_io(smdk2440_iodesc, ARRAY_SIZE(smdk2440_iodesc));
s3c24xx_init_clocks(12000000);
s3c24xx_init_uarts(smdk2440_uartcfgs, ARRAY_SIZE(smdk2440_uartcfgs));
}

3.修改mini2440的lcd配置,有两个地方要修改,第一是修改LCD屏幕的参数,第二是修改fbi

修改LCD屏幕参数,mini2440使用的是3.5寸的屏幕,在arch/arm/mach-s3c2440/mach-smdk2440.c中,写入

  • 3.1修改LCD参数结构。

#define LCD_WIDTH 240
#define LCD_HEIGHT 320
#define LCD_PIXCLOCK 170000

#define LCD_RIGHT_MARGIN 25
#define LCD_LEFT_MARGIN 0
#define LCD_HSYNC_LEN 4

#define LCD_UPPER_MARGIN 1
#define LCD_LOWER_MARGIN 4
#define LCD_VSYNC_LEN 1

修改lcd参数结构为:

static struct s3c2410fb_display mini2440_lcd_cfg __initdata = {

#if !defined (LCD_CON5)
.lcdcon5    = S3C2410_LCDCON5_FRM565 |
S3C2410_LCDCON5_INVVLINE |
S3C2410_LCDCON5_INVVFRAME |
S3C2410_LCDCON5_PWREN |
S3C2410_LCDCON5_HWSWP,
#else
.lcdcon5    = LCD_CON5,
#endif

.type        = S3C2410_LCDCON1_TFT,

.width        = LCD_WIDTH,
.height        = LCD_HEIGHT,

.pixclock    = LCD_PIXCLOCK,
.xres        = LCD_WIDTH,
.yres        = LCD_HEIGHT,
.bpp        = 16,
.left_margin    = LCD_LEFT_MARGIN + 1,
.right_margin    = LCD_RIGHT_MARGIN + 1,
.hsync_len    = LCD_HSYNC_LEN + 1,
.upper_margin    = LCD_UPPER_MARGIN + 1,
.lower_margin    = LCD_LOWER_MARGIN + 1,
.vsync_len    = LCD_VSYNC_LEN + 1,
};

  • 3.2修改fbi

static struct s3c2410fb_mach_info smdk2440_fb_info __initdata = {
.displays    = &smdk2440_lcd_cfg,
.num_displays    = 1,
.default_display = 0,

.gpccon =       0xaa955699,
.gpccon_mask =  0xffc003cc,
.gpcup =        0x0000ffff,
.gpcup_mask =   0xffffffff,

.gpdcon =       0xaa95aaa1,
.gpdcon_mask =  0xffc0fff0,
.gpdup =        0x0000faff,
.gpdup_mask =   0xffffffff,

.lpcsel        = 0xf82,
};

4.修改nand分区表,修改arch/arm/plat-s3c24xx/common-smdk.c,这个根据自己的情况来写,照抄是没用滴。

static struct mtd_partition smdk_default_nand_part[] = {
[0] = {
.name    = “bootloader”,
.size    = 0×00060000,
.offset    = 0,
},
[1] = {
.name    = “kernel”,
.offset = 0×00060000,
.size    = 0×00200000,
},
[2] = {
.name    = “root”,
.offset = 0×00260000,
.size    = 0x3fd80000,
}
};

5.修改machine ID,修改arch/arm/tools/mach-types,填写自己的machine ID

s3c2440            ARCH_S3C2440        S3C2440            1999

6.给内核打yaffs文件系统的补丁。去http://www.aleph1.co.uk/cgi-bin/viewcvs.cgi/下载GNU tarball,解压后进入yaffs2目录,给内核打补丁

./patch-ker.sh c ~/kernel/linux-2.6.32

补丁打好后,在内核代码目录下的fs目录新增了yaffs2目录和相关配置文件

7.因为2410和2440很多地方是一样的,可以用2410的配置文件为基础来配置内核。在内核代码主目录下执行:

make s3c2410_defconfig

这个命令其实就是把arch/arm/configs/s3c2410_defconfig文件拷贝过来命名为.config,所以也可以自己cp。其实在2.6.31版内核中就已经加入了对mini2440开发板的支持,但是我没有选。

配置内核这里没有什么好说的,按照自己的需求来配置。

注意两个问题:

(1)编译后的镜像大小不要超过分区配额

(2)不要裁剪太狠了,把一些基本支持都去掉了,这样一些设备就用不了啦

开始编译。我的机器配置是Core 2 T5500 1.66G,2.5G 内存,运行Debian Lenny 5.0.3,编译10分钟左右就OK了。

网卡驱动我一直没有移植成功。后面弄好了再写上来。

EOF

Panorama Theme by Themocracy