編輯:Android開發教程
八、 指定回調函數
本節講的內容十分關鍵。不管Linux驅動程序的功能多麼復雜還是多麼“酷”,都必須允許用戶空間的應用程序與內核空間的驅動程序進行交互才有意義。而最 常用的交互方式就是讀寫設備文件。通過file_operations.read和file_operations.write成員變量可以分別指定讀寫 設備文件要調用的回調函數指針。
在本節將為word_count.c添加兩個函數:word_count_read和word_count_write。這兩個函數分別處理從設備文件讀 數據和向設備文件寫數據的動作。本節的例子先不考慮word_count要實現的統計單詞數的功能,先用word_count_read和 word_count_write函數做一個讀寫設備文件數據的實驗,以便讓讀者了解如何與設備文件交互數據。本節編寫的word_count.c文件是 一個分支,讀者可在word_count/read_write目錄找到word_count.c文件。可以用該文件覆蓋word_count目錄下的同 名文件測試本節的例子。
本例的功能是向設備文件/dev/wordcount寫入數據後,都可以從/dev/wordcount設備文件中讀出這些數據(只能讀取一次)。下面先看看本例的完整的代碼。
#include <linux/module.h>
#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/fs.h>
#include <linux/miscdevice.h>
#include <asm/uaccess.h>
#define DEVICE_NAME "wordcount" // 定義設備文件名
static unsigned char mem[10000]; // 保存向設備文件寫入的數據
static char read_flag = 'y'; // y:已從設備文件讀取數據 n:未從設備文件讀取數據
static int written_count = 0; // 向設備文件寫入數據的字節數
// 從設備文件讀取數據時調用該函數
// file:指向設備文件、buf:保存可讀取的數據 count:可讀取的字節數 ppos:讀取數據的偏移量
static ssize_t word_count_read(struct file *file, char __user *buf, size_t count, loff_t *ppos)
{
// 如果還沒有讀取設備文件中的數據,可以進行讀取
if(read_flag == 'n')
{
// 將內核空間的數據復制到用戶空間,buf中的數據就是從設備文件中讀出的數據
copy_to_user(buf, (void*) mem, written_count);
// 向日志輸出已讀取的字節數
printk("read count:%d", (int) written_count);
// 設置數據已讀狀態
read_flag = 'y';
return written_count;
}
// 已經從設備文件讀取數據,不能再次讀取數據
else
{
return 0;
}
}
// 向設備文件寫入數據時調用該函數
// file:指向設備文件、buf:保存寫入的數據 count:寫入數據的字節數 ppos:寫入數據的偏移量
static ssize_t word_count_write(struct file *file, const char __user *buf, size_t count, loff_t *ppos)
{
// 將用戶空間的數據復制到內核空間,mem中的數據就是向設備文件寫入的數據
copy_from_user(mem, buf, count);
// 設置數據的未讀狀態
read_flag = 'n';
// 保存寫入數據的字節數
written_count = count;
// 向日志輸出已寫入的字節數
printk("written count:%d", (int)count);
return count;
}
// 描述與設備文件觸發的事件對應的回調函數指針
// 需要設置read和write成員變量,系統才能調用處理讀寫設備文件動作的函數
static struct file_operations dev_fops =
{ .owner = THIS_MODULE, .read = word_count_read, .write = word_count_write };
// 描述設備文件的信息
static struct miscdevice misc =
{ .minor = MISC_DYNAMIC_MINOR, .name = DEVICE_NAME, .fops = &dev_fops };
// 初始化Linux驅動
static int word_count_init(void)
{
int ret;
// 建立設備文件
ret = misc_register(&misc);
// 輸出日志信息
printk("word_count_init_success\n");
return ret;
}
// 卸載Linux驅動
static void word_count_exit(void)
{
// 刪除設備文件
misc_deregister(&misc);
// 輸出日志信息
printk("word_init_exit_success\n");
}
// 注冊初始化Linux驅動的函數
module_init( word_count_init);
// 注冊卸載Linux驅動的函數
module_exit( word_count_exit);
MODULE_AUTHOR("lining");
MODULE_DESCRIPTION("statistics of word count.");
MODULE_ALIAS("word count module.");
MODULE_LICENSE("GPL");
Android ApiDemos示例解析(23) App->Intents
Intents 這個例子的代碼非常簡單:Intent intent = new Intent(Intent.ACTION_GET_CONTENT); intent
android的系統目錄說
一.圖示android是基於linux的,和我們通常認為的windows不同。它的文件結構和linux類似,因此它的根目錄是/,然後之下是:1. mnt:掛載點目錄,sd
KJFrameForAndroid框架簡介
android app一般性架構設計一.UI層(Activity+Fragment基類設計+部分自定義控件)KJActivity(Activity繼承鏈的規范)I_KJA
Android開發入門(十)基本控件 10.3 ProgressBar
當執行某些正在處理的任務時,ProgressBar提供了一個可視化的反饋。例如,你在從web服務器下載數據 ,然後需要更新下載的狀態。在這種情況下,ProgressBar