嵌入式linux编程学习笔记

**

Ubuntu系统基础

**
1.系统更新
sudo apt-get update
sudo apt-get upgrade

2.跨版本升级
sudo apt install update-manager-core
sudo do-release-upgrade -m desktop -d

3.文件操作
tar -vcjf rootfs.tar.bz2 *
tar -vcjf test.tar.bz2 test
tar -vczf test.tar.gz test

压缩.bz2 格式的压缩包我们使用的参数是-jcvf;
而.gz 格式的压缩包使用的参数是-zcvf。

4.降级gcc版本

例:
a.首先查看自己的gcc版本,Ubuntu18.04上默认的是7.3版本

gcc --version
gcc (Ubuntu 7.3.0-27ubuntu1~18.04) 7.3.0 Copyright © 2017 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

b.下载gcc/g++ 5
sudo apt-get install -y gcc-5 sudo apt-get install -y g+±5
c.链接gcc/g++实现降级
cd /usr/bin sudo rm gcc sudo ln -s gcc-5 gcc sudo rm g++ sudo ln -s g+±5 g++

d.再次查看gcc版本,可以看到已经降级

gcc --version
gcc (Ubuntu 5.5.0-12ubuntu1) 5.5.0 20171010 Copyright © 2015 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

Uboot启动程序编译配置

mx6ull_alientek_emmc_defconfig 就是正点原子针对 I.MX6U-ALPHA 的 EMMC 核心板编写的配置文件,这个配置文件在 uboot-imxrel_imx_4.1.15_2.1.0_ga_alientek /configs 目录中。在 uboot 中,通过“make xxx_defconfig”来配置 uboot,xxx_defconfig 就是不同板子的配置文件,这些配置文件都在 uboot/configs 目录中

mx6ull_14x14_evk_nand_defconfig
mx6ull_14x14_evk_emmc_defconfig

zhengyuan@NV52L:~/WorkSpace/I.MAX6ULL/uboot/configs$ cat mx6ull_alientek_emmc_defconfig
CONFIG_SYS_EXTRA_OPTIONS=“IMX_CONFIG=board/freescale/mx6ullevk/imximage-ddr512.cfg,MX6ULL_EVK_EMMC_REWORK”
CONFIG_ARM=y
CONFIG_ARCH_MX6=y
CONFIG_TARGET_MX6ULL_14X14_EVK=y
CONFIG_CMD_GPIO=y

zhengyuan@NV52L:~/WorkSpace/I.MAX6ULL/uboot/configs$ cat mx6ull_alientek_nand_defconfig
CONFIG_SYS_EXTRA_OPTIONS=“IMX_CONFIG=board/freescale/mx6ullevk/imximage-ddr256.cfg,SYS_USE_NAND”
CONFIG_ARM=y
CONFIG_ARCH_MX6=y
CONFIG_TARGET_MX6ULL_14X14_EVK=y
CONFIG_CMD_GPIO=y

编译环境
ARCH ?=arm
CROSS_COMPILE ?=arm-linux-gnueabihf-

u-boot version:2016.03
ubuntu version:18.04
ubuntu中环境配置正确,通过其他客户端能够挂载上。但是使用uboot得nfs下载命令会报错,入图所示错误(Loading: *** ERROR: File lookup fail):

导致此错误得原因是:uboot中使用得NFS版本为V2版本,而ubuntu中的NFS版本为V3,V4及以上版本,从而导致uboot不能再NFS服务器中找到文件。
解决办法为:让buntu中得NFS兼容V2。修改/etc/default/nfs-kernel-server 文件。
操作方法如下:
(1)打开文件:sudo vim /etc/default/nfs-kernel-server (注意一定要sudo或者root权限)
(2)修改如图:

(3)保存退出。
(4)重启NFS服务器。sudo service nfs-kernel-server restart
解决后重新输入命令下载成功如图:

NAND FLASH 烧录
./imxdownload u-boot.bin /dev/sdb -256m

uboot网络操作命令
setenv ipaddr 192.168.16.55
setenv ethaddr 00:04:9f:04:d2:35
setenv gatewayip 192.168.16.1
setenv netmask 255.255.255.0
setenv serverip 192.168.16.50
saveenv

setenv ethaddr 00:04:9f:04:d2:35
saveenv

TFTP from server 192.168.16.250; our IP address is 192.168.16.57; sending through gateway 192.168.16.1
tftp 80800000 zImage
tftp 83000000 imx6ull-alientek-nand.dtb
bootz 80800000 - 83000000

uboot 启动出现 *** Warning - bad CRC, using default environment
提示用的默认环境变量,清除一下环境变量就好
env default -a
saveenv

Creating 4 MTD partitions on “gpmi-nand”:
0x000000000000-0x000004000000 : “boot”
0x000004000000-0x000006000000 : “kernel”
0x000006000000-0x000007000000 : “dtb”
0x000007000000-0x000020000000 : “rootfs”

[ 1.430728] 6 cmdlinepart partitions found on MTD device gpmi-nand
[ 1.437001] Creating 6 MTD partitions on “gpmi-nand”:
[ 1.442098] 0x000000000000-0x000000400000 : “u-boot”
[ 1.449748] 0x000000400000-0x000000420000 : “env”
[ 1.457070] 0x000000420000-0x000000520000 : “logo”
[ 1.464546] 0x000000520000-0x000000620000 : “dtb”
[ 1.471599] 0x000000620000-0x000000e20000 : “kernel”
[ 1.479211] 0x000000e20000-0x000020000000 : “rootfs”

setenv bootargs ‘console=ttymxc0,115200 root=/dev/nfs rw nfsroot=192.168.16.71:/home/zhengyuan/linux/nfs/rootfs,v3 proto=tcp ip=192.168.16.57:192.168.16.250:192.168.16.1:255.255.255.0::eth0:off’
saveenv

env default -a
saveenv

kernel内核设备信息修改

arch\arm\boot\dts\imx6ull-14x14-evk.dts
model = “Freescale i.MX6 ULL 14x14 EVK Board”;
LED控制
root@IMX6ULL:/# echo 0 > /sys/class/leds/sys-led/brightness
root@IMX6ULL:/# echo 1 > /sys/class/leds/sys-led/brightness

UART5故障

Does it mean I cannot use GPIO1_IO00 ~ GPIO1_IO02 and GPIO1_IO05 for other functions?
Seems it can be used as described in attached Linux Manual sect.53.2 ADC External Signals
“The ADC pin settings should be done in the ADCx_PCTL register. No other extraIOMUX settings are required.”Also even these pads are used by ADC, it can not influence on GPIO operation asADC are just high impedance analog inputs.

For usage only ADC1 input 3,4, 6 and 7 one can try next changes:

change num-channels=4 in imx6ul.dtsi:

adc1: adc@02198000 { … num-channels = <4>;

change order channels iio_chan_spec vf610_adc_iio_channels[] in linux/drivers/iio/adc/vf610_adc.chttp://git.freescale.com/git/cgit.cgi/imx/linux-2.6-imx.git/tree/drivers/iio/adc/vf610_adc.c?id=rel_imx_4.1.15_1.2.0_ga

static const struct iio_chan_spec vf610_adc_iio_channels[] = { VF610_ADC_CHAN(3, IIO_VOLTAGE), VF610_ADC_CHAN(4, IIO_VOLTAGE), VF610_ADC_CHAN(6, IIO_VOLTAGE), VF610_ADC_CHAN(7, IIO_VOLTAGE), remaining channels

We are using GPIO1_IO3, GPIO1_IO8, and GPIO1_IO9 as 3 ADC input pins to measure DC voltage in the range of 1.6V-1.8V. The reference VREFH is DC 3.3V. I’ve measure on the board, these voltages are as expected.

We are seeing that ADC read in Linux (sys/bus/iio/devices/iio:devices/in_voltage0/1/2_raw) in the range of 4050-4095. For a 12 bit ADC, these are absolutely too high.

I’ve checked our device tree file. There seems nothing suspicious for now. There was a bug, a 3.3V applied on one ADC input. It was fixed.
I verified with memtools on the IOMUX reg configuration. They are all 0xB0.

I also tried to recalibrate ADC through memtools. When CFG.ATRIG = 0, set GC.CAL = 1. The CALF flag is 0. It sounds that calibration is good.

Here are the related parts in our device tree file.

            regulators {
                            compatible = "simple-bus";
                            #address-cells = <1>;
                            #size-cells = <0>;

                            reg_vref_3v3: regulator@1 {
                                            compatible = "regulator-fixed";
                                            regulator-name = "vref-3v3";
                                            regulator-min-microvolt = <3300000>;
                                            regulator-max-microvolt = <3300000>;
                            };
            };


&adc1 {
pinctrl-names = “default”;
pinctrl-0 = <&pinctrl_adc1>;
vref-supply = <&reg_vref_3v3>;
num-channels = <3>;
status = “okay”;
};
….
pinctrl_adc1: adc1grp {
fsl,pins = <
MX6UL_PAD_GPIO1_IO03__GPIO1_IO03 0xb0 /* ADC_SYS4V0_SENSE (IN) /
MX6UL_PAD_GPIO1_IO09__GPIO1_IO09 0xb0 /
ADC_GEN3V6_SENSE (IN)/
MX6UL_PAD_GPIO1_IO08__GPIO1_IO08 0xb0 /
ADC_LDO3V3_SENSE (IN)*/
>;
};

minicom 串口工具
当咱们在使用终端输入 minicom 进入传输时,是无法直接退出的,需要使用以下方法退出。

1) 需使用Ctrl+a 进入设置状态
2)按z进入设置菜单
(1)S键:发送文件到目标系统中;
(2)W键:自动卷屏。当显示的内容超过一行之後,自动将後面的内容换行。这个功能在查看内核的啓动信息时很有用。
(3)C键:清除屏幕的显示内容;
(4)B键:浏览minicom的历史显示;
(5)X键:退出mInicom,会提示确认退出

1、配置内核,使用如下命令配置内核
make menuconfig
2、开启nfs配置,找到如下配置并将其编译进内核:
Networking support
----->Networking options
----->[]IP:kernel level autoconfiguralion
[
]DHCP support
File systems
---->[]Network file system
—>[
]NFS client support
[]NFS client support for NFS vision3
[
]NFS client support for the NFSv3 ACL protocol extension|
[] NFS client support for NFS version 4
[
] NFS client support for NFSv4.1 (EXPERIMENTAL)
—>[*]Root file system on NFS

3、编译
make

1.make imx_alientek_nand_defconfig
2.make menuconfig
3.make all

如果2中有更改,下次执行不能加第1步

rootfs根文件系统

拷贝文件
scp 文件 用户名@ip 地址:路径
拷贝文件夹
scp -r 文件夹 用户名@ip 地址:路径
例:scp test.c root@192.168.1.12:/home/root
指令格式分析:
test.c
要传输的文件
root
为用户名,开发板默认的就是 root 用户,拥有最高权限
@
一个符号
192.168.1.12 开发板 ip
:
这里要加一个英文字符的“:”,不要忘记了!
/home/root 要传输到开发板的路径
Ubuntu# scp test.c root@192.168.1.12:/home/root

linux内核启动完之后,会自动执行以下两个脚本文件:/etc/init.d/rcS/etc/profile

一、查看PS1的格式:
在Linux中,PS1是一个全局变量,查看PS1的格式如:

二、更改PS1的格式:
PS1=’[\u@\h \w]$ ’

----注意$后面有一个空格!如果没有空格的话,将会报错!
\d :代表日期,格式为weekday month date,例如:“Mon Aug 1”   \H :完整的主机名称。例如:我的机器名称为:fc4.linux,则这个名称就是fc4.linux   \h :仅取主机的第一个名字,如上例,则为fc4,.linux则被省略   \t :显示时间为24小时格式,如:HH:MM:SS   \T :显示时间为12小时格式   \A :显示时间为24小时格式:HH:MM   \u :当前用户的账号名称   \v :BASH的版本信息   \w :完整的工作目录名称。家目录会以 ~代替   \W :利用basename取得工作目录名称,所以只会列出最后一个目录   # :下达的第几个命令   $ :提示字符,如果是root时,提示符为:# ,普通用户则为:$

自动登录root修改步骤:修改完毕后可以自动root登录
sudo vi /etc/passwd
找到 root: x:0:0:root:/root:/bin/sh删除第2列的x,这里的第2列指的是:分割的第2列,字符串中:将字符分割成一列列。删除后变成root::0:0:root:/root:/bin/sh 然后保存文件退出
sudo vi /etc/shadow
找到 root:(一大串字符 这些全删除):::::::修改第一行为:root::10933:0:99999:7:::
sudo vi /etc/inittab
找到#Put a getty on the serial portconsole::respawn:/sbin/getty -L console 0 vt100 # GENERIC_SERIAL由于我在buildroot配置时开启了Run a getty after boot选项,由于进行自动登录了所以这里我把它注释掉不要,也就是在console前加上一个#。然后在后面添加console::respawn:-/bin/sh

在使用scp时拷贝文件时建立连接非常慢。其实除了网络原因,还有就是因为在scp拷贝文件前会生成 认证文件。

  1. 连接时用命令指定(推荐,理由看注释):
    ssh -o GSSAPIAuthentication=no cherry
  2. 在 ssh 客户端程序的配置文件里显式禁用 GSSAPI 认证. 如, 编辑 /etc/ssh/ssh_config 文件, 添加或修改使其有如下一行:
    GSSAPIAuthentication no
  3. 在用户根目录下的 .ssh 目录下创建一个 config 文件. 如, 编辑 /home/cherry/.ssh/config (如果该文件不存在, 则创建之), 添加选项:
    GSSAPIAuthentication no

1、切换到root用户,直接修改/etc/passwd文件,找到你的用户名你一行,如下图所示修改路径,然后保存即可。

2、切换到root用户,使用usermod命令,例如usermod -d /tmp test (test为你的用户名),使用该命令请确保该用户下没有运行的软件或进程

3
最后切换到普通账户,就会看到当前默认目录已经更改了。

tar -vcjf test.tar.bz2 test
tar -vczf test.tar.gz test

使用压缩命令将文件系统打包,生成 rootfs.tar.bz2 文件
“tar -cjf rootfs.tar.bz2 bin dev etc lib linuxrc mnt proc sbin sys tmp usr var”

tar -cjf rootfs.tar.bz2 bin dev etc lib lib32 linuxrc media mnt opt proc root run sbin sys tmp usr var

cd rootfs/bin/

ln -s /usr/local/bin/scp
ln -s /usr/local/bin/sftp
ln -s /usr/local/bin/ssh
ln -s /usr/local/bin/ssh-add
ln -s /usr/local/bin/ssh-agent
ln -s /usr/local/bin/ssh-keygen
ln -s /usr/local/bin/ssh-keyscan

cd rootfs/sbin/
ln -s …/usr/local/sbin/sshd

cd rootfs/lib
ln -sv ld-2.19-2014.08-1-git.so ld-linux.so.3

i.MX Yocto Project User’s Guide.pdf
https://www.yoctoproject.org/docs/1.7/ref-manual/ref-manual.html
11.2章节,SSH功能

DISTRO=fsl-imx-fb MACHINE=imx6ull14x14evk source fsl-setup-release.sh -b build_fsl-imx-fb
bitbake core-image-base

生成新的根文件系统
首先烧写原有根文件系统,然后根据需要做定制、更改; 修改完成后,再将根文件系统压缩。
一般情况,需要加入压缩包的文件夹:
bin dev etc home lib sbin usr var
再加入以下空文件夹
proc sys tmp
加入以下挂载点文件夹,再根据udev等需要,增加相应子文件夹
media mnt
启动时禁止LCD显示控制台命令行
修改 /etc/inittab 文件,找到一行包含:
1:2345:respawn:/sbin/getty 38400 tty1
其中关键字的含义为:
/sbin/getty
运行控制台的命令
tty1
终端名,tty1 代表显示屏;如果是ttymxc3,代表串口终端
开机自动启动程序
在 /etc/init.d 文件夹创建一个脚本。可以复制同文件夹下面其他脚本,修改。
之后在 /etc/rc5.d 做一个软链,名字为 S10filename ,指向前面的脚本。

RTC
date -s “2020-11-04 10:18:30”

./main 直接执行
./main & 后台执行

Linux 设置时区
一、查看和修改Linux的时区

  1. 查看当前时区命令 : “date -R”
  2. 修改设置Linux服务器时区方法 A命令 : “tzselect”
    方法 B 仅限于RedHat Linux 和 CentOS命令 : “timeconfig”
    方法 C 适用于Debian命令 : “dpkg-reconfigure tzdata”
  3. 复制相应的时区文件,替换系统时区文件;或者创建链接文件cp /usr/share/zoneinfo/ 主 时 区 / 主时区/ /次时区 /etc/localtime
    例如:在设置中国时区使用亚洲/上海(+8)
    cp /usr/share/zoneinfo/Asia/Shanghai ./etc/localtime

进程是在 CPU 及内存中运行的程序代码,而每个进程可以创建一个或多个进程(父子进程)。
查看进程方法:
第一种:
ps aux

ps命令用于报告当前系统的进程状态。可以搭配kill指令随时中断、删除不必要的程序。ps命令是最基本同时也是非常强大的进程查看命令,使用该命令可以确定有哪些进程正在运行和运行的状态、进程是否结束、进程有没有僵死、哪些进程占用了过多的资源等等,总之大部分信息都是可以通过执行该命令得到的。
a:显示当前终端下的所有进程信息,包括其他用户的进程。
u:使用以用户为主的格式输出进程信息。
x:显示当前用户在所有终端下的进程。

udhcpc -b -i eth0 -s /usr/share/udhcpc/default.script

ERROR: gnu-config-native-20150728+gitAUTOINC+b576fa87c1-r0 do_unpack: Function failed: Fetcher failure: Fetch command failed with exit code 128, output: fatal: the ‘–set-upstream’ option is no longer supported. Please use ‘–track’ or ‘–set-upstream-to’ instead.

  • 说明:
  • 在Ubuntu 18.04上编译Yocto,出现的git访问的问题。
    一、参考文档:
    1. ubuntu 12.04 yocto 最近出现的编译问题
      https://blog.csdn.net/ming_l1/article/details/79362370

二、解决方法:
1. sources/poky/bitbake/lib/bb/fetch2/git.py
runfetchcmd("%s branch --set-upstream %s origin/%s" % (ud.basecmd, branchname,
branchname), d)
to
runfetchcmd("%s branch --set-upstream-to origin/%s" % (ud.basecmd,
branchname), d)

一、linux下如何查看已安装的centos版本信息:
1.Linux查看当前操作系统版本信息 cat /proc/version
Linux version 2.6.32-696.el6.x86_64 (mockbuild@c1bm.rdu2.centos.org) (gcc version 4.4.7 20120313 (Red Hat 4.4.7-18) (GCC) ) #1 SMP Tue Mar 21 19:29:05 UTC 2017
2.Linux查看版本当前操作系统内核信息 uname -a
Linux localhost.localdomain 2.4.20-8 #1 Thu Mar 13 17:54:28 EST 2003 i686 athlon i386 GNU/Linux
3.linux查看版本当前操作系统发行信息 cat /etc/issue
/etc/issue是存bai放linux登录前的提示语
/etc/motd是存放linux登录后的提示语
motd是message of the day的缩写
提示语涉及一些转义字符:
\d 日期
\t 时间

系统配置

setenv ethaddr 00:04:9f:04:d2:35
saveenv

cp /usr/share/zoneinfo/Asia/Shanghai ./etc/localtime

修改 vim ./etc/inittab 文件,找到一行包含:
#1:2345:respawn:/sbin/getty 38400 tty1

vim ./etc/profile

HOSTNAME=/bin/hostname
PS1=’\u@\h:\w$:’
export PS1 HOSTNAME
alias ls=‘ls --color’

vim ./etc/hostname
imx6ull-iotc

vim ./etc/init.d/rcS
#…
echo 32768 > /proc/sys/vm/min_free_kbytes

/bin/hostname -F /etc/hostname

udhcpc -b -i eth0 -s /usr/share/udhcpc/default.script

psplash编译替换

根文件系统打包
tar -cjf rootfs.tar.bz2 bin boot dev etc home lib media mnt proc run sbin sys tmp usr var
/----/
echo “HOSTNAME=`/bin/hostname`” >>./etc/profile
echo “PS1=’\u@\h:\w$:’” >>./etc/profile
echo “export PS1 HOSTNAME” >>./etc/profile
echo “alias ls=‘ls --color’” >>./etc/profile

echo “imx6ull-iotc” >./etc/hostname

echo “/bin/hostname -F /etc/hostname” >>./etc/init.d/rcS
echo “udhcpc -b -i eth0 -s /usr/share/udhcpc/default.script” >>./etc/init.d/rcS

cp -f /usr/share/zoneinfo/Asia/Shanghai ./etc/localtime

cp -f ~/Documents/psplash-default ./usr/bin
cp -f ~/Documents/psplash-write ./usr/bin
cp -rf ~/Documents/modules ./lib/
cp -rf ~/Documents/system_init.sh ./etc/

tar -cjf rootfs.tar.bz2 bin boot dev etc home lib media mnt proc run sbin sys tmp usr var

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值