海思3536 emmc驱动调试记录

hi3536 emmc驱动记录

一、kernel menuconfig配置mmc相关驱动

Device Drivers  ---> 
	<*> MMC/SD/SDIO card support  --->
		(8)     Number of minors per block device //分区数
		<*>   himci v200 emmc/sd/mmc device support  --->
			--- himci v200 emmc/sd/mmc device support
			[*]   Send Auto Stop to terminate data transfer between host and SD card
			[*]   himci0 sd/mmc controller support  --->
			[*]   himci1 emmc controller support  ---> 
				[*]   himci v200 sdio1 bus_width_8_bit support  //数据宽度8bit

二、配置emmc sdio硬件接口相关管脚配置

	himm 0x120f00c0 0x02
	himm 0x120f00c8 0x02 
	himm 0x120f00cc 0x02
	himm 0x120f00d4 0x02
	himm 0x120f00d8 0x02
	himm 0x120f009c 0x02
	himm 0x120f00a0 0x02
	himm 0x120f00a4 0x02
	himm 0x120f00a8 0x02
	himm 0x120f00ac 0x02
	himm 0x120f00b0 0x02
	himm 0x120f00b4 0x02
	himm 0x120f00b8 0x02
	himm 0x120f00d0 0x02

以上为配置相关管脚复用功能为sdio模式管脚。

三、分析kernel log

mmc0: mmc_rescan_try_freq: trying to init card at 400000 Hz
hub 1-1:1.0: USB hub found
hub 1-1:1.0: 4 ports detected
mmc0: unrecognised EXT_CSD revision 8
mmc0: error -22 whilst initialising MMC card
mmc0: mmc_rescan_try_freq: trying to init card at 300000 Hz

mmc0: mmc_rescan_try_freq: trying to init card at 200000 Hz
mmc0: unrecognised EXT_CSD revision 8
mmc0: error -22 whilst initialising MMC card
mmc0: mmc_rescan_try_freq: trying to init card at 100000 Hz
mmc0: unrecognised EXT_CSD revision 8
mmc0: error -22 whilst initialising MMC card
mmc0: unrecognised EXT_CSD revision 8 
该emmc被分配挂在mmc0总线上
emmc芯片手册查到该芯片接口版本为5.0 对应的话应该是revision 8 
修改驱动相关代码
static int mmc_read_ext_csd(struct mmc_card *card, u8 *ext_csd)
{
     	
	......
	if (card->ext_csd.rev > 8) {
      // 将7 改为 8即可
                pr_err("%s: unrecognised EXT_CSD revision %d\n",
                        mmc_hostname(card->host), card->ext_csd.rev);
                err = -EINVAL;
                goto out;
        }
	......

四、在驱动中配置gpio,不然emmc加载不成功

修改 drivers/mmc/host/himciv200/himci.c
的probe函数 hi_mci_probe

        mmcGpioBase = ioremap(0x120f00c0, 32);
        mmcGpioBase1 = ioremap(0x120f009c, 32);
        mmcGpioBase2 = ioremap(0x120f00a0, 32);
        himci_writel(0x02,mmcGpioBase + 0x0);
        himci_writel(0x02,mmcGpioBase + 0x8);
        himci_writel(0x02,mmcGpioBase + 0xc);
        himci_writel(0x02,mmcGpioBase + 0x14);
        himci_writel(0x02,mmcGpioBase + 0x18);
        himci_writel(0x02,mmcGpioBase1);
        himci_writel(0x02,mmcGpioBase2);
        himci_writel(0x02,mmcGpioBase2 + 0x4);
        himci_writel(0x02,mmcGpioBase2 + 0x8);
        himci_writel(0x02,mmcGpioBase2 + 0xc);
        himci_writel(0x02,mmcGpioBase2 + 0x10);
        himci_writel(0x02,mmcGpioBase2 + 0x14);
        himci_writel(0x02,mmcGpioBase2 + 0x18);
        himci_writel(0x02,mmcGpioBase2 + 0x30);
加上如上的gpio配置

重启机器,可以看到

mmc0: mmc_rescan_try_freq: trying to init card at 400000 Hz
mmc0: BKOPS_EN bit is not set
hub 1-1:1.0: USB hub found
mmc0: new high speed MMC card at address 0001
mmcblk0: mmc0:0001 S0J56X 14.8 GiB 
hub 1-1:1.0: 4 ports detected
mmcblk0boot0: mmc0:0001 S0J56X partition 1 31.5 MiB
mmcblk0boot1: mmc0:0001 S0J56X partition 2 31.5 MiB
mmcblk0: unknown partition table
mmcblk0boot1: unknown partition table
mmcblk0boot0: unknown partition table

成功识别出emmc的块设备。

五、测试读写

先格式化emmc再挂载再进行文件拷贝
1 用 fdisk 工具分区
若已有分区,本操作可以跳过,直接 用 mkdosfs 工具格式化。
若没有分区,则在控制台的提示符下,输入命令 fdisk,具体格式如下:

~ $ fdisk 设备节点 /dev/mmcblk0
回车后,输入命令 m,根据帮助信息继续进行以下的操作。

1.1 查看当前状态
在控制台的提示符下,输入命令 p,查看当前分区状态:
Command (m for help): p
控制台显示出分区状态信息:
Disk /dev/mmc/blk1/disc: 127 MB, 127139840 bytes
8 heads, 32 sectors/track, 970 cylinders
Units = cylinders of 256 * 512 = 131072 bytes
Device Boot Start End Blocks Id System
上面信息表明设备没有分区,需要 创建新的分区 保存分区信
息对设备进行分区。

1.2 创建新的分区
创建新的分区步骤如下:
步骤 1. 创建新的分区。
在提示符下输入命令 n,创建新的分区:
Command (m for help): n外围设备驱动

控制台显示出如下信息:
Command action
e extended
p primary partition (1-4)
步骤 2. 建立主分区。
输入命令 p,选择主分区:p
步骤 3. 选择分区数。
本例中选择为 1,输入数字 1:
Partition number (1-4): 1
控制台显示出如下信息:
First cylinder (1-970, default 1):
步骤 4. 选择起始柱面。
本例选择默认值 1,直接回车:
Using default value 1
步骤 5. 选择结束柱面。
本例选择默认值 970,直接回车:
Last cylinder or +size or +sizeM or +sizeK (1-970, default 970):
Using default value 970
步骤 6. 选择系统格式。
由于系统默认为 Linux 格式,本例中选择 Win95 FAT 格式,输入命令 t 进行修改:
Command (m for help): t
Selected partition 1
输入命令 b,选择 Win95 FAT 格式:
Hex code (type L to list codes): b
输入命令 l,可以查看 fdisk 所有分区的详细信息:
Changed system type of partition 1 to b (Win95 FAT32)
步骤 7. 查看分区状态。
输入命令 p,查看当前分区状态:
Command (m for help): p
控制台显示出当前分区状态信息,表示成功分区。外围设备驱动

1.3 保存分区信息
输入命令 w,写入并保存分区信息到设备:
Command (m for help): w
控制台显示出当前设备信息,表示成功写入分区信息到设备:
The partition table has been altered!
Calling ioctl() to re-read partition table.
…………
~ $
2 用 mkdosfs 工具格式化
存在以下情况选择操作:
若已格式化,本操作可以跳过,直接到“7.3 挂载目录”。
若没有格式化,则输入命令 mkdosfs 进行格式化:
~ $ mkdosfs –F 32 设备分区名
其中设备分区名与实际接入的设备类型有关,具体名称在以上各章节的“操作示例”
中均有说明。
控制台没有显示错误提示信息,表示成功格式化:
~ $
3 挂载目录
使用命令 mount 挂载到 mnt 目录下,就可以进行读写文件操作:
~ $ mount -t vfat 设备分区名 /mnt
其中设备分区名与实际接入的设备类型有关,具体名称在以上各章节的“操作示例”
中均有说明。
4 读写文件
读写操作的具体情况很多,在本例中使用命令 cp 实现读写操作。
使用命令 cp 拷贝当前目录下的 test.txt 文件到 mnt 目录下,即拷贝至设备,实现写操
作,如:
~ $ cp ./test.txt /mn

以上为整个调试过程。

你可能感兴趣的:(海思,linux,驱动程序)