android 设备注册,Android平台上PMEM的使用及Platform设备注册(二)
三、注冊(cè)PMEM設(shè)備
這里我們除了描述PMEM設(shè)備,還將注冊(cè)一個(gè)擁有memory空間和IRQ資源的示例設(shè)備example_device。
對(duì)于example_device,定義如下結(jié)構(gòu)體:
static struct resource example_resources[] = {
[0] = {
.start??= 0xC0000000,
.end????= 0xC0020000,
.flags??= IORESOURCE_MEM,
},
[1] = {
.start??= 30,
.end????= 30,
.flags??= IORESOURCE_IRQ,
},
};
static struct platform_device example_device = {
.name???????????= "example",
.id?????????????= 0,
.num_resources??= ARRAY_SIZE(example_resources),
.resource???????= example_resources,
};
example_device設(shè)備擁有IORESOURCE_MEM和IORESOURCE_IRQ兩種資源,其IORESOURCE_MEM的起始地址為0xC0000000,結(jié)束地址為0xC0020000,IORESOURCE_IRQ的中斷號(hào)為30。
對(duì)于PMEM設(shè)備,我們先要介紹一下結(jié)構(gòu)體android_pmem_platform_data。它被定義在文件/kernel/include/linux/android_pmem.h中。其定義為:
struct android_pmem_platform_data
{
const char* name;
/* starting physical address of memory region */
unsigned long start;
/* size of memory region */
unsigned long size;
/* set to indicate the region should not be managed with an allocator */
unsigned no_allocator;
/* set to indicate maps of this region should be cached, if a mix of
* cached and uncached is desired, set this and open the device with
* O_SYNC to get an uncached region */
unsigned cached;
/* The MSM7k has bits to enable a write buffer in the bus controller*/
unsigned buffered;
};
我們?yōu)镻MEM設(shè)備定義如下結(jié)構(gòu)體:
static struct android_pmem_platform_data android_pmem0_pdata = {
.name = "pmem0",
.start = PMEM_0_BASE,
.size = PMEM_0_SIZE,
.no_allocator = 0,
.cached = 1,
};
static struct android_pmem_platform_data android_pmem1_pdata = {
.name = "pmem1",
.start = PMEM_1_BASE,
.size = PMEM_1_SIZE,
.no_allocator = 0,
.cached = 1,
};
struct platform_device android_pmem0_device = {
.name = "android_pmem",
.id = 0,
.dev = { .platform_data = &android_pmem0_pdata },
};
struct platform_device android_pmem1_device = {
.name = "android_pmem",
.id = 1,
.dev = { .platform_data = &android_pmem1_pdata },
};
然后將這幾個(gè)設(shè)備結(jié)構(gòu)體放置到一個(gè)platform_device的數(shù)組中,
static struct platform_device *devices[] __initdata = {
&example_device,
&android_pmem0_device,
&android_pmem1_device,
};
最后通過調(diào)用函數(shù)platform_add_devices()向系統(tǒng)中添加這些設(shè)備。
static void __init androidphone_init(void)
{
……
platform_add_devices(devices, ARRAY_SIZE(devices));
……
}
函數(shù)platform_add_devices()內(nèi)部調(diào)用platform_device_register(?)進(jìn)行設(shè)備注冊(cè)。要注意的是,這里的platform_device設(shè)備的注冊(cè)過程必須在相應(yīng)設(shè)備驅(qū)動(dòng)加載之前被調(diào)用,即執(zhí)行platform_driver_register()之前,原因是驅(qū)動(dòng)注冊(cè)時(shí)需要匹配內(nèi)核中所有已注冊(cè)的設(shè)備名。
函數(shù)platform_add_devices()定義在文件/kernel/driver/base/platform.c中,
/**
* platform_add_devices - add a numbers of platform devices
* @devs: array of platform devices to add
* @num: number of platform devices in array
*/
int platform_add_devices(struct platform_device **devs, int num)
{
int i, ret = 0;
for (i = 0; i < num; i++) {
ret = platform_device_register(devs[i]);
if (ret) {
while (--i >= 0)
platform_device_unregister(devs[i]);
break;
}
}
return ret;
}
EXPORT_SYMBOL_GPL(platform_add_devices);
最后,需要說明的結(jié)構(gòu)體是platform_driver,它的原型定義,在
/kernel/include/linux/platform_device.h中,代碼如下:
struct platform_driver {
int (*probe)(struct platform_device *);
int (*remove)(struct platform_device *);
void (*shutdown)(struct platform_device *);
int (*suspend)(struct platform_device *, pm_message_t state);
int (*resume)(struct platform_device *);
struct device_driver driver;
struct platform_device_id *id_table;
};
內(nèi)核提供的platform_driver結(jié)構(gòu)體的注冊(cè)函數(shù)為platform_driver_register(),其原型定義在/kernel/driver/base/platform.c文件中,具體實(shí)現(xiàn)代碼如下:
/**
* platform_driver_register
* @drv: platform driver structure
*/
int platform_driver_register(struct platform_driver *drv)
{
drv->driver.bus = &platform_bus_type;
if (drv->probe)
drv->driver.probe = platform_drv_probe;
if (drv->remove)
drv->driver.remove = platform_drv_remove;
if (drv->shutdown)
drv->driver.shutdown = platform_drv_shutdown;
return driver_register(&drv->driver);
}
EXPORT_SYMBOL_GPL(platform_driver_register);
如果想深入了解Platform機(jī)制,可以參考下面的文章:
Linux Platform驅(qū)動(dòng)程序框架解析
Linux內(nèi)核驅(qū)動(dòng)的的platform機(jī)制
QQ:1226062415
Date:2011/5/14
Blog:http://blog.csdn.net/wxzking
歡迎交流,歡迎轉(zhuǎn)載,轉(zhuǎn)載時(shí)請(qǐng)保留以上信息。
Android平臺(tái)上PMEM的使用及Platform設(shè)備注冊(cè)(一)
Android中PMEM驅(qū)動(dòng)程序是物理內(nèi)存的驅(qū)動(dòng)程序,可用于分配物理內(nèi)存.PMEM在camera和video系統(tǒng)中頻繁使用.下面,簡(jiǎn)單記錄一下PMEM的使用方法.另外,由于PMEM設(shè)備做為Platfo ...
將Unity3D游戲移植到Android平臺(tái)上
將Unity3D游戲移植到Android平臺(tái)是一件很容易的事情,只需要在File->Build Settings中選擇Android平臺(tái),然后點(diǎn)擊Switch Platform并Build出ap ...
Android平臺(tái)上的Aplay與TinyAlsa移植使用
ALSA是高級(jí)Linux聲音架構(gòu).提供了一系列音頻的邏輯接口,包括PCM.CONTROL等.這些,不影響它的使用,了解一下就可以. 在Android設(shè)備上,linux 2.x的版本,要控制錄制播放音頻 ...
android平臺(tái)上AES,DES加解密及問題
在使用java進(jìn)行AES加密的時(shí)候,會(huì)用到如下方法: SecureRandom?sr?= SecureRandom.getInstance("SHA1PRNG");?但是在andr ...
(轉(zhuǎn))FS_S5PC100平臺(tái)上Linux Camera驅(qū)動(dòng)開發(fā)詳解(二)
4-3 攝像頭的初始化流程及v4l2子設(shè)備驅(qū)動(dòng) 這個(gè)問題弄清楚了以后下面就來看獲得Camera信息以后如何做后續(xù)的處理: 在fimc_init_global調(diào)用結(jié)束之后我們獲得了OV9650的信息,之 ...
驅(qū)動(dòng)開發(fā)學(xué)習(xí)筆記. 0.05 linux 2.6 platform device register 平臺(tái)設(shè)備注冊(cè) 2/2 共2篇
驅(qū)動(dòng)開發(fā)讀書筆記. 0.05 linux 2.6 platform device register 平臺(tái)設(shè)備注冊(cè) 2/2 共2篇 下面這段摘自 linux源碼里面的文檔 : 內(nèi)核版本2.6.22Doc ...
驅(qū)動(dòng)開發(fā)學(xué)習(xí)筆記. 0.04 linux 2.6 platform device register 平臺(tái)設(shè)備注冊(cè) 1/2 共2篇
驅(qū)動(dòng)開發(fā)讀書筆記. 0.04 ?linux 2.6 platform device register 平臺(tái)設(shè)備注冊(cè) ?1/2 共2篇下面這段摘自 linux源碼里面的文檔 : Documentatio ...
Android 8.0的平臺(tái)上,應(yīng)用不能對(duì)大部分的廣播進(jìn)行靜態(tài)注冊(cè)
引言在Android 8.0的平臺(tái)上,應(yīng)用不能對(duì)大部分的廣播進(jìn)行靜態(tài)注冊(cè),也就是說,不能在AndroidManifest文件對(duì)有些廣播進(jìn)行靜態(tài)注冊(cè),這里必須強(qiáng)調(diào)是有些廣播,因?yàn)橛行V播還是能夠注冊(cè)的. ...
隨機(jī)推薦
MySQL 挺有意思
1, 修改密碼 mysql -u root -p update user set Password = PASSWORD('NEWPWD') WHERE user = 'root'; FLUSH PR ...
PHP 生成隨機(jī)字符串與唯一字符串
說明:生成隨機(jī)字符串用到的方法有 mt_rand() 生成唯一字符串用到的方法有 md5(),uniqid(),microtime() 代碼: <?php /* * 生成隨機(jī)字符串 * @par ...
從匯編看c++成員函數(shù)指針(二)
下面先看一段c++源碼: #include using namespace std; class X { public: virtual int get1() { ; } ...
iOS 10 創(chuàng)建iMessage App
總結(jié)
以上是生活随笔為你收集整理的android 设备注册,Android平台上PMEM的使用及Platform设备注册(二)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 智能灯丝灯方案为复古设计注入“ 科技基因
- 下一篇: 三种方式让 Android WebVie