android2.3及linux2.6.29核心模擬器版本編譯與除錯
一、手動建立
1.驅動模組
test_driver.c
//#include #include #include #include #include #include #include #include #define test_major 240
//動態裝置節點
//struct class *mymodule_class;
//結束
static int test_led_open(struct inode *inode, struct file *file)
static int test_led_close(struct inode *inode, struct file *file)
static int test_led_read(struct file *filp, char __user *buff, size_t count, loff_t *offp)
static int test_led_write (struct file *filp, const char __user *buf, size_t count,loff_t *f_pos)
static struct file_operations led_fops = ;
static int __init test_drv_init(void)
//devfs檔案系統建立
/* devfs_mk_cdev( mkdev(test_major, 0),
s_ifchr | s_irusr | s_iwusr | s_irgrp, "test_dev");
*///結束
//實現動態建立
//mymodule_class = class_create(this_module, "test_dev");//在/sys/class/下建立「test_dev」目錄
//device_create(mymodule_class, null, mkdev(test_major, 0), null, "tankai_dev"); //在/dev/下建立「tankai_dev」檔案
//結束
printk ("ok!\n");
return 0;
out_chrdev:
unregister_chrdev(test_major, "mymodule");
}
static void __exit test_drv_exit(void)
module_init(test_drv_init);
module_exit(test_drv_exit);
module_author("tank");
module_license("gpl");
makefile
obj-m := test_driver.o
pwd := $(shell pwd)
#kerneldir := /usr/src/linux-headers-3.0.0-26-generic/
kerneldir := /home/android2.3/android2.3_kernel/
default:
$(make) -c $(kerneldir) m=$(pwd) modules
# cp -rf mini.ko ../module/
# cp -rf lddbus.ko ../module/
clean:
rm *.mod.c *.o *.ko *.bak modules.* module.*
2.android模擬器沒有mknod命令,我們實現它
mknod.c
#include #include #define s_ifchr 0020000
int main(int argc,char *argv)
char *devname = argv[1];
printf("devname is %s\n",devname);
int devnum = -1;
sscanf(argv[2],"%d",&devnum);
printf("devnum is %d\n",devnum);
if(mknod(devname,s_ifchr|0666,makedev(devnum,0))!=0)
perror("mknod");
return 0;
}
android.mklocal_path:= $(call my-dir)
include $(clear_vars)
local_src_files:= \
mknod.c
local_shared_libraries := \
libutils
local_module:= mknod
local_module_tags := optional
include $(build_executable)
檢視:cat /proc/devices
結果:
character devices:
1 mem
4 /dev/vc/0
4 tty
5 /dev/tty
5 /dev/console
5 /dev/ptmx
7 vcs
10 misc
13 input
14 sound
29 fb
90 mtd
116 alsa
128 ptm
136 pts
240 test_dev
253 ttys
254 rtc
block devices:
1 ramdisk
259 blkext
7 loop
31 mtdblock
43 nbd
179 mmc
執行:./mknod /dev/tankai_dev 240
//這裡只需要給出主裝置號,主裝置號相同的裝置使用同一驅動程式;只是加入次裝置號後可以實現乙個驅動,多個裝置使用的情況。這個目前我們的驅動中沒有實現;因此,次裝置號可以隨便。
ll /dev/tankai_dev
結果:
crw-rw-rw- root root 240, 0 2013-10-16 09:54 tankai_dev3.測試用例
testdriver.c
#include #include #include #include #include #include #include int main()
android.mk
local_path:= $(call my-dir)
include $(clear_vars)
local_src_files:= \
testdriver.c
local_shared_libraries := \
libutils
local_module:= testdriver
local_module_tags := optional
include $(build_executable)
二、自動建立
放通驅動中「建立」和「結束」部分**;就不需要在執行mknod命令,裝置節點會被建立,見:《linux裝置節點建立》核心kobject上報uevent過濾規則 及 《linux裝置節點建立》使用者空間ueventd建立裝置節點規則。
Linux驅動學習(3 裝置節點 手動建立)
模組 chr test.c to test the chr dev for ap operation by wozon include include include include include module license gpl dev t dev struct cdev cdev int ...
linux自動建立裝置節點
在有2.6系列版本中支援udev管理裝置檔案可以方便的建立裝置節點,不必使用mknod來建立 主要用到的四個方法在linux device.h定義 建立類和釋放類的函式 建立成後將建立 sys class name資料夾 extern struct class class create struct...
android如何手動生成裝置節點
init.rc裡所有可用的command都定義在system core init keyword.h裡,預設是不包含mknod的。事實上,android的init程序會通過kenel的uevent來自動建立裝置節點 見system core init devices.c裡的make device 函...