平台匯流排(三)

2021-07-22 18:55:02 字數 3262 閱讀 4626

平台匯流排:用於平台公升級的

三星: 

s3c2410  --------------- s3c6410 ----------- s5pv210

gpio控制器            gpio控制器

gpio控制器

uart 

i2cspi

控制邏輯方法相同:1,配置gpio暫存器

2.讀寫資料

位址會不同

三元素:

匯流排: 開機的時候就已經建立了,不需要我們建立

struct bus_type platform_bus_type = ;

device物件:

struct platform_device ;

struct resource

driver物件

struct platform_driver ;

pdrv中獲取資源:

/*** 引數1: pdev

* 引數2: 獲取的是中斷資源還是記憶體資源 

* 引數3: 同種資源中第幾個

*/struct resource * platform_get_resource(struct platform_device * dev,unsigned int type,unsigned int num)

在probe方法中:

1,申請主裝置號  register_chrdev_region (與核心相關)

2,註冊字元裝置驅動 cdev_alloc  cdev_init  cdev_add (與核心相關)

3,利用udev/mdev機制建立裝置檔案(節點) class_create, device_create (與核心相關)

4,實現操作硬體方法  ***_open,***_read,***x_write...(與硬體相關)

5,硬體初始化

最重要的:

獲取到資源,利用資源進行硬體初始化

/* led_test.c */

#include #include #include #include int main(void)

close(fd);

return 0;

}

/* plat_led_dev.c */

#include #include #include #define gpc0con 0xe0200060

#define gpc_size 24

//用於演示,沒有實際裝置對應

#define gpa0con 0xe0200000

#define gpa_size 24

struct resource led_res = ,

/*假如有其他的資源,比如有中斷*/

[1] = ,

[2] = ,

};struct platform_device led_pdev = ;

static int __init plat_led_dev_init(void)

static void __exit plat_led_dev_exit(void)

module_init(plat_led_dev_init);

module_exit(plat_led_dev_exit);

module_license("gpl");

/* plat_led_drv.c */

#include #include #include #include #include #include #include /*設計乙個物件,表示乙個全域性的裝置物件*/

struct samsung_led;

struct samsung_led * led_dev;

int led_pdrv_open(struct inode *inode, struct file *filp)

ssize_t led_pdrv_write(struct file *filp, const char __user *buf, size_t count, loff_t *fpos)

if (value) else

return count;

}int led_pdrv_close(struct inode *inode, struct file *filp)

struct file_operations led_fops = ;

int led_pdrv_probe(struct platform_device *pdev)

int led_pdrv_remove(struct platform_device *pdev)

/*用於匹配*/

const struct platform_device_id led_id_table = ,

, ,};struct platform_driver led_drv = ,

.id_table = led_id_table,//優先匹配列表中的名字,如果沒有列表,就匹配父類中name

};static int __init plat_led_drv_init(void)

static void __exit plat_led_drv_exit(void)

module_init(plat_led_drv_init);

module_exit(plat_led_drv_exit);

module_license("gpl");

# makefile

rootfs_dir = /opt/filesystem

module_name = plat_led_dev

module_name2 = plat_led_drv

cross_compile = arm-cortex_a8-linux-gnueabi-

cc = $(cross_compile)gcc

ifeq ($(kernelrelease), )

kernel_dir = /home/linux-3.0.8

cur_dir = $(shell pwd)

all :

make -c $(kernel_dir) m=$(cur_dir) modules

clean :

make -c $(kernel_dir) m=$(cur_dir) clean

install:

else

obj-m = $(module_name).o

obj-m += $(module_name2).o

endif

平台匯流排概述

platform匯流排是linux2.6核心加入的一種虛擬匯流排。platform機制的本身使用並不複雜,由兩部分組成 platform device 和 platform driver platform驅動與傳統的裝置驅動模型相比,優勢在於platform機制將裝置本身的資源註冊進核心,由核心統一...

平台匯流排模型

平台匯流排模型主要分為3個部分,1.driver 2.device 3.bus device主要放硬體相關的東西 driver裡面主要存放的比較穩定的 我們依然可以檢視gpio keys.c這個 來學習 平台匯流排是一種虛擬的匯流排 driver這個結構體會通過呼叫platform driver r...

平台匯流排驅動模型

arch arm plat s3c24xx devs.c 這個函式實現的平台匯流排模型中的 platform device 1.註冊各種資源 struct resource s3c2410 uart0 resource等各種資源 static struct resource s3c lcd reso...