博文

关于Probe分析

从probe函数说起 每一个driver module,只要是挂载在platform bus这根虚拟总线上的,无一例外都需要自己实现一个probe函数。这个probe函数将会做真正的驱动加载操作。以pxa688的uart驱动为例: drivers/tty/serial/pxa.c: 840 static struct platform_driver serial_pxa_driver = { 841         .probe          = serial_pxa_probe, 842         .remove         = serial_pxa_remove, 843 844         .driver         = { 845                 .name   = "pxa2xx-uart", 846                 .owner  = THIS_MODULE, 847 #ifdef CONFIG_PM 848                 .pm     = &serial_pxa_pm_ops, 849 #endif 850         }, 851 }; 840~851定义了一个platform类型总线上驱动 serial_pxa_driver.其内部的成员变量中probe和remove以及driver成员都需要自己实现。其中,probe是用于驱动被加载的时候用;remove用于驱动被卸载的时候(如果驱动是built-in进kernel的,在runt...

what is /dev/vc ?

在Document/filesystems/proc.txt中: To see  which  tty's  are  currently in use, you can simply look into the file /proc/tty/drivers: 在我的机器上: $cat /proc/tty/drivers /dev/tty             /dev/tty        5       0 system:/dev/tty /dev/console         /dev/console    5       1 system:console /dev/ptmx            /dev/ptmx       5       2 system /dev/vc/0            /dev/vc/0       4       0 system:vtmaster rfcomm               /dev/rfcomm   216 0-255 serial ttyprintk            /dev/ttyprintk   5       3 console serial               /dev/ttyS       4 64-111 serial pty_slave       ...

关于tty驱动的简单问题

~/temp/linux-3.0.8$ cat /proc/tty/drivers /dev/tty             /dev/tty        5       0 system:/dev/tty /dev/console         /dev/console    5       1 system:console /dev/ptmx            /dev/ptmx       5       2 system /dev/vc/0            /dev/vc/0       4       0 system:vtmaster rfcomm               /dev/rfcomm   216 0-255 serial ttyprintk            /dev/ttyprintk   5       3 console serial               /dev/ttyS       4 64-111 serial pty_slave            /dev/pts      136 0-1048575 pty:slave pty_master           /dev/ptm      128...

配置wsgi运行环境

我想用python写web. 之前最拿手的应该是用asp写,后来,学了php。总感觉,用这些脚本写网站,不太geek。所以,就摸索着用python写。 昨天,申请了支持python的SAE,其安装手册上的例子是用wsgi跑一个helloworld. 我对这些东西还不懂,纯菜鸟。SAE用的版本系统是svn,蛋疼的很。每次svn ci的时候,总感觉很不习惯,不如git那样舒服。 so.想在local上学习python web开发。python写web方式有很多,因为SAE上支持WSGI,所以,就先玩玩WSGI吧。可是在配置WSGI方面,网上有很多垃圾文章,明明很简单的东西,非要再加个 Django ,而我只是想运行个hello world而已,用不上这么厚重的东西。 下面是配置总结,整个过程比较简单: 依次安装apache2和libapache2-mod-wsgi后,我还安装了libapache2-mod-wsgi-py3. 然后,在/etc/apache2/mods-enabled/下面应该能够看到俩个文件: wsgi.conf  wsgi.load 然后在/etc/apache2/apache2.conf结尾加上: 231 <Directory /var/www/> 232 order deny,allow 233 Allow from all 234 </Directory> 235 WSGIScriptAlias / /var/www/index.wsgi 于是,就OK了。这个时候,怎么测试是OK的呢?我们先重启apache2,然后写个简单的hello world程序。 重启apache2: $sudo /etc/init.d/apache2 restart Hello world程序: 在/var/www/下   $touch index.wsgi $vim index.wsgi def application(environ, start_response): start_response('200 OK', [('Content-Type', 'text/plain')]) yield 'Hello World\n' ps:该hello...

SD卡读写操作浅析

一个读写请求何时被读写,怎样读写,全看请求队列。以Goldfish平台上的MMC卡,我们来看看其请求队列都怎样设置的: mmc_blk_probe() 597     struct mmc_blk_data *md; 598     int err; 599 600     char cap_str[10]; 601 602     /* 603      * Check that the card supports the command class(es) we need. 604      */ 605     if (!(card->csd.cmdclass & CCC_BLOCK_READ)) 606         return -ENODEV; 607       608     md = mmc_blk_alloc(card); mmc_blk_probe->mmc_blk_alloc() 510     struct mmc_blk_data *md; 511     int devidx, ret; 512 513     devidx = find_first_zero_bit(dev_use, MMC_NUM_MINORS);//在dev_use中查找一个没有被用到的 514     if (devidx >= MMC_NUM_MINORS) 515         return ERR_PTR(-ENOSPC); 516     __set_bit(devidx, dev_use); 517 518     md = kzalloc(sizeof(struct mmc_blk_data), GFP_KERNEL); 519     if (...

从Nand驱动到文件读写

Nand属于块设备。那么nand块设备是否像其他块设备那样,每次读写都经历一个“C/S”的过程呢? 我们在Goldfish Platform上,从nand的驱动注册开始,看看nand之上的yaffs2文件读写到底是怎样的一个过程。 本文主要是对自己在学习过程中遇到疑问做一个记录,同以前的文章一样,基本上只有流程,那些原理之类的东西,请同学们google吧。在下文中,有些代码可能会有重复,主要目的是不想让各位看官看的太累,跳来跳去,眼镜受不了啊。 代码是Android Kernel 2.6.29.整个记录过程比较仓促,难免会由认识上的错误,欢迎大家指正。 下面是Android在Goldfish Platform上的执行流程: <1> 377 static int __init init_mtdblock(void)         378 {  379     return register_mtd_blktrans(&mtdblock_tr); 380 }  在代码片段<1>中注册了一个struct mtd_blktrans_ops结构的mtdblock_tr,这个模块是系统在启动过程中加载的,从模块的init名字,可以看出,是针对mtd块设备的。由于在Linux中,Nand被归为MTD设备,MTD设备就是将nand设备封装了一下,让上层没有直接看到nand,而是看到的MTD。实际上,通过MTD来操作Nand,还是通过nand内部的驱动函数。不要把MTD看的太过神秘。如果还需要了解,请Google吧,我之前就是太较真了,一直没有弄明白,read the fucking code之后才算明白过来了。 这个mtd_blktrans_ops结构如下: <2>  32 struct mtd_blktrans_ops {  33     char *name;  34     int major;  35 ...