15AH, San Francisco

California, United States.

Send Your Mail At:

tianyingkejishe@sina.cn

Working Hours

Mon-Sat: 9.30am To 7.00pm

分类标题

Autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et dolore feugait.

分类归档 Linux

【Linux】DMA内存占用计算

1、查看内存页大小

root@Linux:~# getconf PAGESIZE
4096

2、查看DMA分配关系

root@Linux:~# cat /proc/buddyinfo
Node 0, zone      DMA      4      5      0      5      1      3      4      4      6      7    461
Node 0, zone   Normal    456   1982   1205    478    151     49     31     18     10      5   6732

3、计算DMA内存占用大小

每一行代表当前的内存区中连续1、2、4、8、16、32、64、128、256、512、1024个可使用空闲页的数量,当前系统默认的页大小为4K,所以分别对应的大小为1x4k、2x4k、4x4k、8x4k、16x4k、32x4k、64x4k、128x4k、256x4k=1M、512x4k=2M、1024x4k=4M,由此可以计算出:

DMA大小为:

3x4M+1x2M+1x1M+…=16M

DMA32大小为:

539x4M+22M+21M+…=2G

Normal大小为:

7043x4M+9x2M+6x1M+…=27G

【Linux】linux fdisk tf卡分区操作解析说明

/*****************************************************************************
     *                   linux fdisk tf卡分区操作解析说明
     * 说明:
     *     本文主要是解析linux fdisk命令的使用,是一个朋友留下的自动化脚本。
     *
     *                                       2015-9-16 晴 深圳 南山平山村 曾剑锋
     ****************************************************************************/
    #! /bin/sh
     
    # 卸载接下来需要分区的设备
    umount    /dev/mmcblk1boot0
    umount    /dev/mmcblk1boot1
    umount    /dev/mmcblk1p1
    umount    /dev/mmcblk1p2
    sync                                    # 同步上面的操作
    sleep                                  # 等待1秒
     
    fdisk    /dev/mmcblk1    << EOF          # 开始分区
    d           # 删除操作
               # 删除分区1
    d           # 删除操作
               # 删除分区2,其实只剩下2,这里会出现menu
    m           # 显示操作menu,相当于帮助
    m           # 显示操作menu,相当于帮助
    n           # 创建新分区,相当于new
    p           # 创建primary分区
               # 创建primary分区1
                # First sector (-, default ):
    +50M        # Last sector, +sectors or +size{K,M,G} (-, default ): +50M, Partition  of type Linux and of size  MiB is set
    a           # toggle a bootable flag, 选择启动分区
               # 选择分区1作为启动分区
    t           # change a partition's system id, 改变分区类型
    c           # c  W95 FAT32 (LBA),选择FAT32格式
    n           # 创建新分区,相当于new
    p           # 创建primary分区
               # 创建primary分区2
                # First sector (-, default ):
                # Last sector, +sectors or +size{K,M,G} (-, default ): Using default value , Partition  of type Linux and of size 3.7 GiB is set
    p           # 查看创建结果
    w           # 保存退出
    EOF
    sync                                # 同步以上操作
    sleep 
     
    umount /dev/mmcblk1p1               # 卸载创建的分区
    umount /dev/mmcblk1p2               # 卸载创建的分区
    sync                                # 同步以上操作
    sleep 
     
    mkdosfs  -F  /dev/mmcblk1p1       # 以FAT32格式化mmcblk1p1分区
    sync
    sleep 
     
    mkfs.ext3 /dev/mmcblk1p2            # 以ext3格式化mmcblk1p2分区
    sync
    sleep 
     
    echo "finish make tf card"          # 输出提示信息

【uboot】Uboot烧录及使用

一、UBOOT学习

0、基础知识

进入uboot,查询到dram 起始地址为0x80000000,大小为0x20000000(512Mb)

bdinfo
arch_number = 0x00000000
boot_params = 0x80000100
DRAM bank   = 0x00000000
-> start    = 0x80000000
-> size     = 0x20000000
eth0name    = FEC1
ethaddr     = 88:30:6D:AF:F4:8F
current eth = FEC1
ip_addr     = 192.168.1.3
baudrate    = 115200 bps
TLB addr    = 0x9FFF0000
relocaddr   = 0x9FF55000
reloc off   = 0x18755000
irq_sp      = 0x9EF52EA0
sp start    = 0x9EF52E90
DDR ADDR程序
0x80800000zImage
0x83000000dtb

1、UBOOT裸程序构成

由 IVT + Boot Data + DCD + bin 构成,在DDR中的存放地址如下:

DDR ADDR内容
0x877ff000boot load start
…(+ 1KB, block 0, block 1)reserve
0x877ff400 (bolck 2)IVT(u-boot.imx)
Boot data
DCD
(+ 3Kb)( IVT+BOOTDATA+DCD)
0x87800000bin

①IVT内容

TAG、指定IVT大小
bin PC指针
DCD地址(ddr)
boot data地址(ddr)
IVT地址(ddr)
②Boot Data内容

xxx.imx起始地址
镜像大小
③DCD内容

TAG、DCD大小、版本
寄存器及值,配置基础功能(时钟、DDR等)

2、Uboot烧写方法


①从linux用户空间直接将uboot.imx烧录到SD/EMMC设备

烧录到SD卡

#将SD卡插入开发板或者ubunto开发环境
$ sudo fdisk -l #查看SD卡/dev名
$ sudo dd if=u-boot.imx of=/dev/yourSdName bs=1024 seek=1 conv=fsync

烧录到EMMC

$ echo 0 > /sys/block/mmcblk1boot0/force_ro #开启emmc写功能
$ dd if=u-boot.imx of=/dev/mmcblk1boot0 bs=1024 seek=1 conv=fsync
$ echo 1 >/sys/block/mmcblk1boot0/force_ro #关闭写
$ mmc bootpart enable 1 1 /dev/mmcblk1 #使能分区1

②从uboot中下载后,再写入到SD/EMMC设备block 2处

=> setenv serverip 192.168.1.101
=> tftp 80800000 u-boot.imx
Using FEC1 device
TFTP from server 192.168.1.101; our IP address is 192.168.1.3
Filename 'u-boot.imx'.
Load address: 0x80800000
Loading: #########################
	 938.5 KiB/s
done
Bytes transferred = 363520 (58c00 hex)
 => mmc dev 0 0
switch to partitions #0, OK
mmc0 is current device
=> mmc write 80800000 2 2c6 #363520/512

MMC write: dev # 0, block # 2, count 710 ... 710 blocks written: OK 
#emmc需要这一步
=>mmc partconf 1 1 0 0
#重启后,查看版本
=> version  

③ 使用mfgtool通过串口烧录

1、配置BOOT_CFG 为01000000
2、连接串口
3、烧录

④ 在ubuntu开发环境下使用imxdownload

1、插入SD卡
2、找到/dev名
3、./imxdownload u-boot.bin /dev/sdd

3、Uboot下常用命令

=> mmc info #查看当前mmc设备信息
=> mmc list #查看mmc设备列表
=> mmc dev 1 [可选part]#切换到mmc设备1(默认到分区part=0)
=> mmc part #查看当前设备分区
=> mmc read/write/erase 80800000 600 10 #读取0x600块开始10个块到80800000ddr addr.
=> nand info
=> nand device
=> nand erase addr size
=> nand wrete/read addr off size
=> fatinfo mmc 0:1 #产看分区文件系统信息
=> fat[ext2/ext4]ls mmc 0:1 #查看mmc0分区1下文件
=> fat[ext]load mmc 0:1 80800000 file #将文件读取到ddr
=> fdt addr 80800000 #设置设备树地址
=> fdt print #查看设备树文件内容
=> bootz 80800000 - 83000000 #从ddr启动linux镜像zImage(808) 、inidrd(-)、dtb(830)
=> bootm 80800000 #从ddr启动镜像uImage
=> boot #从bootcmd读取,并执行命令
=> reset #重启
=> go addr #跳转到addr并运行bin程序
=> run xxxcmd #运行自定义的xxxcmd(类似于bootcmd)

【Linux】文件系统到处GPIO配置

GPIO号为416具体转换看芯片手册。

echo 416 > /sys/class/gpio/export
echo out > /sys/class/gpio/gpio416/direction
echo 1 > /sys/class/gpio/gpio416/value
echo 0 > /sys/class/gpio/gpio416/value

echo in > /sys/class/gpio/gpio416/direction
cat /sys/class/gpio/gpio416/value

echo falling > /sys/class/gpio/gpio416/edge
cat /proc/interrupts |grep gpio

【DTB】设备树解、压包

1、安装工具链

sudo apt-get install device-tree-compiler

2、解包dtb->dts

dtc -I dtb -O dts -o xxx.dts xxx.dtb

3、压包dts->dtb

dtc -I dts -O dtb -o xxx.dtb xxx.dts

【Linux】安装SCTP协议支持

一、报错现象


sctp程序运行:
int i = socket(AF_INET,SOCK_STREAM,IPPROTO_SCTP);
printf("huilh:%d,%d\r\n",i,errno);
输出:
huilh:-1,93

checksctp:
sctp: Protocol not supported

二、解决方法

1、外围的模块加载到内核中

#yum list kernel-modules-extra*

kernel-modules-extra.x86_64             4.18.0-240.15.1.el8_3             BaseOS

#yum install kernel-modules-extra.x86_64

2、安装SCTP

yum install lksctp*

3、查看安装是否成功

# modinfo sctp

filename:       /lib/modules/4.18.0-240.15.1.el8_3.x86_64/kernel/net/sctp/sctp.ko.xz
license:        GPL
description:    Support for the SCTP protocol (RFC2960)
author:         Linux Kernel SCTP developers <linux-sctp@vger.kernel.org>
alias:          net-pf-10-proto-132
alias:          net-pf-2-proto-132
rhelversion:    8.3
srcversion:     1F7FF36BEF4076DB3D4AF26
depends:        libcrc32c
intree:         Y
name:           sctp
vermagic:       4.18.0-240.15.1.el8_3.x86_64 SMP mod_unload modversions
sig_id:         PKCS#7
signer:         CentOS kernel signing key
sig_key:        43:C1:A4:E8:DF:2E:B3:D4:43:C1:4B:38:46:94:93:EB:C4:27:08:0D
sig_hashalgo:   sha256
signature:      1F:34:2A:3F:35:55:A9:24:B2:64:31:D6:AA:8F:E0:10:0C:76:B8:BF:
        CB:47:B0:59:39:22:B4:E8:3B:9A:F9:B5:82:D9:22:53:4E:A7:27:4C:
        D7:F3:C9:65:B6:77:1A:5A:25:18:C8:9B:D7:27:CB:A3:D4:95:ED:E5:
        3E:87:4E:E3:4F:A0:5B:DA:31:18:34:89:88:D9:CC:F5:90:76:D6:4A:
        0D:BA:1B:09:E2:10:80:7B:77:7B:15:97:7E:F9:45:92:39:7D:7C:A9:
        5D:4E:D5:8C:61:E0:F0:8D:CB:97:A7:E6:0C:84:64:6B:26:C7:69:02:
        54:EA:EB:04:C9:02:39:F8:7E:C7:08:C2:7E:83:4A:69:4F:B2:8C:83:
        C9:51:9B:5D:C7:C4:DB:5A:C4:14:DA:52:64:A2:FF:C5:E2:FE:DA:ED:
        B9:44:4B:C7:A8:D9:F4:78:A6:35:E9:E8:1C:14:E6:1B:1B:AD:72:4B:
        22:4E:05:6D:E6:DE:0A:D8:98:2C:AD:6E:25:84:1F:38:C1:D7:2B:5C:
        79:E6:CC:DF:16:D2:54:17:CD:87:B5:56:00:20:9D:09:F4:01:75:85:
        83:CA:C6:75:7E:3A:15:95:04:98:F1:D4:A1:47:CD:B1:8A:6A:3A:51:
        1F:07:1C:47:02:6A:17:CC:27:F5:DD:58:15:18:77:5B:BC:76:60:3C:
        D5:97:2C:EF:0E:32:E4:A3:93:EE:E7:F8:93:09:CB:1D:DB:84:D3:B5:
        56:C9:50:5C:42:95:7E:64:DF:CD:CE:4E:7E:AF:DE:C8:E9:29:51:62:
        46:C1:6F:BF:85:1E:EB:36:65:40:74:EF:64:47:6A:AB:11:B0:B7:24:
        4E:4F:3A:60:83:C7:5B:42:6A:A3:DC:0B:89:6C:CB:7D:EC:00:6A:8C:
        48:DE:17:B4:85:41:A1:F7:68:74:1C:FA:D2:10:89:20:A7:75:34:05:
        E7:A8:BB:AD:BA:33:2F:04:92:A1:33:1B:68:9A:D7:20:25:BA:7A:61:
        A8:DE:D2:85
parm:           no_checksums:Disable checksums computing and verification (bool)

从上述结果可以看出,可以查到模块,然后使用lsmod | grep sctp查看是否能查到模块,如果不能查到,则使用modprobe sctp 安装

4、手动加载SCTP

# modprobe sctp

安装完毕后,再用lsmod 查看是否已安装sctp模块。所示结果如下。

#lsmod | grep sctp

sctp                  405504  18
libcrc32c              16384  4 nf_conntrack,nf_nat,xfs,sctp

表明lsctp模块已在当前linux下安装完成。或者使用cat 命令。

# cat /proc/modules | grep sctp

sctp 405504 18 - Live 0xffffffffc0d71000
libcrc32c 16384 4 sctp,nf_nat,nf_conntrack,xfs, Live 0xffffffffc00dc000

5、自动加载

如果sctp不能自动加载到内核,请使用下面处理方式。

在/etc/sysconfig/modules的目录下新建sctp.modules文件

#! /bin/sh

/sbin/modinfo -F filename sctp > /dev/null 2>&1
if [ $? -eq 0 ]; then
    /sbin/modprobe sctp
fi

保存后,修改权限chmod+777 sctp.modules,重启便可看到已自动加载。

【Linux】克隆SD/TF卡

1、克隆指令:

sudo dd if=/dev/sdb of=/dev/sdc bs=4096 conv=notrunc,noerror 

2、查看克隆进度:

sudo watch -n 5 pkill -USR1 ^dd$

3、压缩克隆:

sudo dd if=/dev/sdd | bzip2 > /tmp/image_32G.img
sudo bzip2 -dc /home/tool/image_32G.img | sudo dd of=/dev/sde