国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 服務器 > Linux服務器 > 正文

linux nand flash驅動編寫

2024-09-05 23:04:42
字體:
來源:轉載
供稿:網友

很長一段時間,nand flash都是嵌入式的標配產品。nand flash價格便宜,存儲量大,適用于很多的場景。現在很普及的ssd,上面的存儲模塊其實也是由一塊一塊nand flash構成的。對于linux嵌入式來說,開始uboot的加載是硬件完成的,中期的kernel加載是由uboot中的nand flash驅動完成的,而后期的rootfs加載,這就要靠kernel自己來完成了。當然,這次還是以三星s3c芯片為例進行說明。

1、nand flash驅動在什么地方,可以從drviers/mtd/Makefile來看

obj-y    += chips/ lpddr/ maps/ devices/ nand/ onenand/ tests/ 

2、nand在mtd下面,是作為一個單獨目錄保存的,這時應該查看nand下的Kconfig

config MTD_NAND_S3C2410   tristate "NAND Flash support for Samsung S3C SoCs"   depends on ARCH_S3C24XX || ARCH_S3C64XX   help    This enables the NAND flash controller on the S3C24xx and S3C64xx    SoCs     No board specific support is done by this driver, each board    must advertise a platform_device for the driver to attach.  config MTD_NAND_S3C2410_DEBUG   bool "Samsung S3C NAND driver debug"   depends on MTD_NAND_S3C2410   help    Enable debugging of the S3C NAND driver  config MTD_NAND_S3C2410_CLKSTOP   bool "Samsung S3C NAND IDLE clock stop"   depends on MTD_NAND_S3C2410   default n   help    Stop the clock to the NAND controller when there is no chip    selected to save power. This will mean there is a small delay    when the is NAND chip selected or released, but will save    approximately 5mA of power when there is nothing happening. 

3、不難發現,MTD_NAND_S3C2410才是那個真正的macro,嘗試在Makefile找文件

obj-$(CONFIG_MTD_NAND_S3C2410)   += s3c2410.o 

4、查看s3c2410.c文件,看看基本結構構成

static struct platform_driver s3c24xx_nand_driver = {   .probe   = s3c24xx_nand_probe,   .remove   = s3c24xx_nand_remove,   .suspend  = s3c24xx_nand_suspend,   .resume   = s3c24xx_nand_resume,   .id_table  = s3c24xx_driver_ids,   .driver   = {     .name  = "s3c24xx-nand",     .of_match_table = s3c24xx_nand_dt_ids,   }, };  module_platform_driver(s3c24xx_nand_driver); 

5、繼續分析s3c24xx_nand_probe函數

s3c2410_nand_init_chip(info, nmtd, sets); 

6、之所以從中摘出了s3c2410_nand_init_chip這個函數,是因為里面進行了函數注冊

類似的函數還有s3c2410_nand_update_chip函數

chip->write_buf  = s3c2410_nand_write_buf; chip->read_buf   = s3c2410_nand_read_buf; chip->select_chip = s3c2410_nand_select_chip; chip->chip_delay  = 50; nand_set_controller_data(chip, nmtd); chip->options    = set->options; chip->controller  = &info->controller;  switch (info->cpu_type) { case TYPE_S3C2410:   chip->IO_ADDR_W = regs + S3C2410_NFDATA;   info->sel_reg  = regs + S3C2410_NFCONF;   info->sel_bit  = S3C2410_NFCONF_nFCE;   chip->cmd_ctrl = s3c2410_nand_hwcontrol;   chip->dev_ready = s3c2410_nand_devready;   break;  case TYPE_S3C2440:   chip->IO_ADDR_W = regs + S3C2440_NFDATA;   info->sel_reg  = regs + S3C2440_NFCONT;   info->sel_bit  = S3C2440_NFCONT_nFCE;   chip->cmd_ctrl = s3c2440_nand_hwcontrol;   chip->dev_ready = s3c2440_nand_devready;   chip->read_buf = s3c2440_nand_read_buf;   chip->write_buf = s3c2440_nand_write_buf;   break;  case TYPE_S3C2412:   chip->IO_ADDR_W = regs + S3C2440_NFDATA;   info->sel_reg  = regs + S3C2440_NFCONT;   info->sel_bit  = S3C2412_NFCONT_nFCE0;   chip->cmd_ctrl = s3c2440_nand_hwcontrol;   chip->dev_ready = s3c2412_nand_devready;    if (readl(regs + S3C2410_NFCONF) & S3C2412_NFCONF_NANDBOOT)     dev_info(info->device, "System booted from NAND/n");    break; } 

7、抓住了函數接口,就找到了基本邏輯。

對于框架來說,它不關心你的代碼如何實現。只要你按照它的接口寫,就能讓上層正常獲得數據。platform、usb、pci這都是一種接口形式,具體實現還要按照各個具體功能模塊來實現才行。

8、為什么我們都用s3c芯片進行舉例

因為它用的場景最多,學習資料最全,對于新手來說,這會少很多麻煩。

9、這個驅動依賴的kernel版本是什么

這里最有的代碼都是按照最新4.16的版本進行分析的,大家可以直接查看這里的地址。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。


注:相關教程知識閱讀請移步到服務器教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 化隆| 大渡口区| 新营市| 运城市| 云安县| 东兰县| 巧家县| 漾濞| 隆回县| 乌拉特后旗| 准格尔旗| 舞钢市| 全南县| 霍城县| 团风县| 金华市| 福海县| 徐州市| 台北市| 和田市| 和硕县| 唐山市| 尤溪县| 老河口市| 安化县| 雷州市| 神农架林区| 遂川县| 育儿| 砚山县| 晋中市| 丰顺县| 冀州市| 九寨沟县| 方城县| 乾安县| 蓬莱市| 长阳| 延安市| 宁乡县| 乐清市|