一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

Linux|Centos|Ubuntu|系統(tǒng)進(jìn)程|Fedora|注冊表|Bios|Solaris|Windows7|Windows10|Windows11|windows server|

服務(wù)器之家 - 服務(wù)器系統(tǒng) - Linux - linux nand flash驅(qū)動編寫

linux nand flash驅(qū)動編寫

2022-03-07 16:43feixiaoxing Linux

這篇文章主要介紹了linux nand flash驅(qū)動編寫,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

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

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

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

2、nand在mtd下面,是作為一個單獨(dú)目錄保存的,這時應(yīng)該查看nand下的Kconfig

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
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、不難發(fā)現(xiàn),MTD_NAND_S3C2410才是那個真正的macro,嘗試在Makefile找文件

?
1
obj-$(CONFIG_MTD_NAND_S3C2410)   += s3c2410.o

4、查看s3c2410.c文件,看看基本結(jié)構(gòu)構(gòu)成

?
1
2
3
4
5
6
7
8
9
10
11
12
13
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、繼續(xù)分析s3c24xx_nand_probe函數(shù)

?
1
s3c2410_nand_init_chip(info, nmtd, sets);

6、之所以從中摘出了s3c2410_nand_init_chip這個函數(shù),是因?yàn)槔锩孢M(jìn)行了函數(shù)注冊

類似的函數(shù)還有s3c2410_nand_update_chip函數(shù)

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
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、抓住了函數(shù)接口,就找到了基本邏輯。

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

8、為什么我們都用s3c芯片進(jìn)行舉例

因?yàn)樗玫膱鼍白疃啵瑢W(xué)習(xí)資料最全,對于新手來說,這會少很多麻煩。

9、這個驅(qū)動依賴的kernel版本是什么

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

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持服務(wù)器之家。

原文鏈接:https://blog.csdn.net/feixiaoxing/article/details/79855970

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 蜜月aⅴ免费一区二区三区 蜜桃影像传媒推广 | 热99这里只有精品 | 俄罗斯激情性孕妇孕交大全 | 国产精品亚洲精品青青青 | 成人精品一区二区三区 | 五月最新商场女厕所高跟嘘嘘 | 亚洲免费视频一区 | 久久综合色超碰人人 | 99久久国产综合精品女小说 | 四虎精品成人a在线观看 | 乌克兰粉嫩摘花第一次 | 秋霞啪啪片 | 厕所rxxx| 国产欧美日韩精品高清二区综合区 | 亚洲日本中文字幕天堂网 | 日本在线不卡免 | 99re热精品这里精品 | 国产精品露脸国语对白手机视频 | 免费在线观看亚洲 | 久久热这里只有 精品 | 亚洲激情在线 | 久草热在线| 91精品国产人成网站 | 日韩成人一区ftp在线播放 | 麻豆小视频在线观看 | 91大神第九部红酒气质女 | 91精品啪在线观看国产日本 | 成人做视频免费 | 性派对videofreeparty| 亚洲高清色图 | 国产精品久久国产三级国电话系列 | 女人狂吮男人命根gif视频 | www青青草原| 教室里的激情电影 | 久久精品热在线观看85 | 动漫美女被吸乳 | 亚洲欧美日韩综合一区久久 | 日韩欧美推理片免费在线播放 | 侮辱丰满美丽的人妻 | 韩国漂亮美女三级在线观看 | 亚洲干综合 |