一 背景
一直想通过linux平台跑一个类似于ubuntu的带图形界面的系统,于是买了一块linux开发板,最终只是能跑个linux系统,没有把图形加进去,后来就没有再去深入研究了,最近终于有一点时间来研究一下了。
二 搭建裸机开发环境
2.1 准备相关的资源
2.1.1 vmware虚拟机
15.1.0 build-13591040
2.1.2 ubuntu系统镜像
ubuntu-20.04.1-desktop-amd64
这里的镜像是使用鸿蒙系统已编译好的code.1.0基础上开发的
2.1.3 am335x_starterware_02_00_01_01_setup.bin
到ti官网搜索下载starterware:https://www.ti.com/tool/starterware-sitara#tech-docs
2.1.4 bbb补丁
starterware_bbb_support.tar.gz
2.1.5 交叉编译器
gcc-arm-none-eabi-4_7-2013q1-20130313-linux.tar.bz2
2.1.6 串口驱动
adafruit 4 pin cable (pl2303),需要下载pl2303串口驱动,需要注意下载特定的版本,否则会提示使用不了,也不能使用win10自带的usb串口驱动
2.1.7 终端调试工具
securecrt6.5.0
2.1.8 读卡器和sd卡
sd卡容量在2g以上
三 安装交叉编译环境
3.1 解压缩工具链文件
gcc-arm-none-eabi-4_7-2013q1-20130313-linux.tar.bz2
3.2 设置环境变量
gedit /etc/profile打开配置文件
export path=$path:/home/harmony/gcc-arm-none-eabi-4_7-2013q1-20130313-linux/gcc-arm-none-eabi-4_7-2013q1/bin/export lib_path=/home/harmony/gcc-arm-none-eabi-4_7-2013q1-20130313-linux/gcc-arm-none-eabi-4_7-2013q1source /etc/profile 使配置生效
arm-none-eabi-gcc -v查看编译器是否安装成功
四 编译运行gpio测试程序
4.1 解压startware软件包
cd到am335x_starterware_02_00_01_01_setup.bin所在的目录
执行安装指令
./am335x_starterware_02_00_01_01_setup.bin
4.2 打上bb-black补丁
解压缩starterware_bbb_support.tar.gz覆盖文件
4.3 编译源码
4.3.1 编译bootloader
cd build/armv7a/gcc/am335x/beaglebone/bootloader/
make clean
make
4.3.2 编译gpio
cd ..
cd gpio/
make clean
make
4.3.3 插入sd卡通过读卡器连接到电脑
将bootloader输出bin文件重命名为mlo(没有后缀),将gpio输出的bin文件更改为app(没有后缀)
4.3.4 将两个文件拷贝到sd卡根目录下
4.3.5 将sd卡取出插入到bb-black开发板
先按住boot再开电源上电
可以看到led在闪烁
五 编译并运行debian系统
(参考element14 beaglebone black用户手册_v2.1.pdf)
5.1 获取源码
可通过官网下载或者使用开发板自带的源文件
bb-black-debian-kernel-3.8.tar.bz2
bb-black-debian-u-boot.tar.bz2
5.2 解码源码
tar xvf bb-black-debian-u-boot.tar.bz2 tar xvf bb-black-debian-kernel-3.8.tar.bz25.3 安装交叉编译器
gcc-linaro-arm-linux-gnueabihf-4.8-2014.03_linux.tar.xz
5.3.1 设置环境变量
export cc=`pwd`/gcc-linaro-arm-linux-gnueabihf-4.8-2014.03_linux/bin/arm-linux-gnueabihf-5.4 编译u-boot
cd u-bootmake arch=arm cross_compile=${cc} distclean //清理make arch=arm cross_compile=${cc} am335x_evm_config //配置make arch=arm cross_compile=${cc} //编译输出5.5 编译kernel
sudo apt-get install lzop// 可能会报/bin/sh: lzop: command not found错误,需要安装 lzop 包 cd kernelcp ../configs/beaglebone .config make arch=arm cross_compile=${cc} zimage dtbs5.6 准备镜像文件
一共有五个文件
mkdir ~/imagescd u-bootcp mlo ~/imagescp u-boot.img ~/imagescd kernel/kernelcp arch/arm/boot/zimage ~/imagescp arch/arm/boot/dts/am335x-boneblack.dtb ~/imagesmkdir ~/images/rootfscd ~/kernel/kernelmake arch=arm cross_compile=${cc} modulesmake arch=arm cross_compile=${cc} modules_install install_mod_path=$home/images/rootfscd ~/images/rootfstar -czvf ../kernel_modules.tar.gz ./cd ~/images/rm -rf rootfs$home/imagescd ~/images/lsam335x-boneblack.dtb kernel_modules.tar.gz mlo u-boot.img zimage5.7 更新镜像到emmc中
将以上镜像复制到sd卡中,把sd卡插入读卡器,接入bb-black的usb接口
mkdir /media/sda1mount /dev/sda1 /media/sda1 //挂载u盘mkdir /media/mmcblk0p1mount /dev/mmcblk0p1 /media/mmcblk0p1cp -f /media/sda1/mlo /media/mmcblk0p1/cp -f /media/sda1/u-boot.img /media/mmcblk0p1/cp -f /media/sda1/zimage /media/mmcblk0p1/cp -f /media/sda1/am335x-boneblack.dtb /boot/uboot/dtbs/tar -xvf /media/sda1/kernel_modules.tar.gz -c /#同步文件,写入emmcsync reboot5.8 至此系统更新完毕后会自动运行
以下为完整的系统启动日志:
u-boot spl 2014.04-rc3 (may 02 2022 - 23:22:21)reading argsspl_load_image_fat_os: error reading image args, err - -1reading u-boot.imgreading u-boot.imgu-boot 2014.04-rc3 (may 02 2022 - 23:22:21)i2c: readydram: 512 mibnand: 0 mibmmc: omap sd/mmc: 0, omap sd/mmc: 1*** warning - readenv() failed, using default environmentnet: not set. validating first e-fuse maccpsw, usb_etherwarning: your board does not use generic board. please readdoc/readme.generic-board and take action. boards notupgraded by the late 2014 may break or be removed.hit any key to stop autoboot: 0 gpio: pin 53 (gpio 53) value is 1card did not respond to voltage select!mmc0(part 0) is current devicecard did not respond to voltage select!gpio: pin 56 (gpio 56) value is 0gpio: pin 55 (gpio 55) value is 0gpio: pin 54 (gpio 54) value is 0mmc1(part 0) is current devicegpio: pin 54 (gpio 54) value is 1sd/mmc found on device 1reading uenv.txt1699 bytes read in 6 ms (276.4 kib/s)gpio: pin 55 (gpio 55) value is 1loaded environment from uenv.txtimporting environment from mmc ...checking if uenvcmd is set ...gpio: pin 56 (gpio 56) value is 1running uenvcmd ...reading zimage4379112 bytes read in 249 ms (16.8 mib/s)reading initrd.img2952653 bytes read in 190 ms (14.8 mib/s)reading /dtbs/am335x-boneblack.dtb24968 bytes read in 10 ms (2.4 mib/s)kernel image @ 0x82000000 [ 0x000000 - 0x42d1e8 ]## flattened device tree blob at 88000000 booting using the fdt blob at 0x88000000 using device tree in place at 88000000, end 88009187starting kernel ...uncompressing linux... done, booting the kernel.[ 0.355566] omap2_mbox_probe: platform not supported[ 0.362094] tps65217-bl tps65217-bl: no platform data provided[ 0.426288] bone-capemgr bone_capemgr.9: slot #0: no cape found[ 0.463398] bone-capemgr bone_capemgr.9: slot #1: no cape found[ 0.500505] bone-capemgr bone_capemgr.9: slot #2: no cape found[ 0.537613] bone-capemgr bone_capemgr.9: slot #3: no cape found[ 0.552871] bone-capemgr bone_capemgr.9: slot #6: bb-bonelt-hdmin conflict p8.45 (#5:bb-bonelt-hdmi)[ 0.562503] bone-capemgr bone_capemgr.9: slot #6: failed verification[ 0.576257] omap_hsmmc mmc.5: of_parse_phandle_with_args of 'reset' failed[ 0.584643] bone-capemgr bone_capemgr.9: loader: failed to load slot-6 bb-bonelt-hdmin:00a0 (prio 2)[ 0.639443] pinctrl-single 44e10800.pinmux: pin 44e10854 already requested by 44e10800.pinmux; cannot claim for gpio-leds.8[ 0.651156] pinctrl-single 44e10800.pinmux: pin-21 (gpio-leds.8) status -22[ 0.658437] pinctrl-single 44e10800.pinmux: could not request pin 21 on device pinctrl-singleloading, please wait...modprobe: chdir(3.8.13): no such file or directorymodprobe: chdir(3.8.13): no such file or directorymodprobe: chdir(3.8.13): no such file or directorysystemd-fsck[215]: rootfs: clean, 79943/233856 files, 452128/933632 blocksdebian gnu/linux 7 beaglebone ttyo0default username:password is [debian:temppwd]support/faq: http://elinux.org/beagleboard:beagleboneblack_debianthe ip address for usb0 is: 192.168.7.2beaglebone login: rootpassword: last login: thu may 15 02:19:04 utc 2014 on ttyo0linux beaglebone 3.8.13 #1 smp mon may 2 23:43:36 cst 2022 armv7lthe programs included with the debian gnu/linux system are free software;the exact distribution terms for each program are described in theindividual files in /usr/share/doc/*/copyright.debian gnu/linux comes with absolutely no warranty, to the extentpermitted by applicable law.root@beaglebone:~# [ 26.168165] libphy: phy 4a101000.mdio:01 not found[ 26.173471] net eth0: phy 4a101000.mdio:01 not found on slave 1^croot@beaglebone:~#六 led字符设备开发
6.1 led驱动程序
6.1.1 寄存器方式
参考startware通过寄存器方式操作gpio,这种方式的执行效率会更高
#include #include#include#include#include#include#include#include#include#include#include#include#include#include#include#include//函数声明static ssize_t led_drv_read(struct file *file, char __user *buf, size_t nbytes, loff_t *ppos);static ssize_t led_drv_write(struct file *file, const char __user *buffer,size_t count, loff_t *ppos);static int led_drv_open(struct inode *inode, struct file *filp);static int __init led_init(void);static void __exit led_exit(void); /*registers*/ static volatile unsigned int *soc_gpio_1_regs = null; static volatile unsigned int *soc_control_regs = null; // led类 static struct class *led_class; static int major = 250;static int minor=0;static dev_t devno; static struct device *test_device;#define gpio_revision (0x0)#define gpio_sysconfig (0x10)#define gpio_irqstatus_raw(n) (0x24 + (n * 4))#define gpio_irqstatus(n) (0x2c + (n * 4))#define gpio_irqstatus_set(n) (0x34 + (n * 4))#define gpio_irqstatus_clr(n) (0x3c + (n * 4))#define gpio_irqwaken(n) (0x44 + (n * 4))#define gpio_sysstatus (0x114)#define gpio_ctrl (0x130)#define gpio_oe (0x134)#define gpio_datain (0x138)#define gpio_dataout (0x13c)#define gpio_leveldetect(n) (0x140 + (n * 4))#define gpio_risingdetect (0x148)#define gpio_fallingdetect (0x14c)#define gpio_debouncenable (0x150)#define gpio_debouncingtime (0x154)#define gpio_cleardataout (0x190)#define gpio_setdataout (0x194) /* values helping to decide the value on a gpio pin. */#define gpio_pin_low (0x0)#define gpio_pin_high (0x1) #define control_conf_muxmode(n) (n) #define hwreg(x) (*((volatile unsigned int *)(x)))#define control_conf_gpmc_ad_conf_gpmc_ad_slewctrl (0x00000040u)#define control_conf_gpmc_ad_conf_gpmc_ad_slewctrl_shift (0x00000006u)#define control_conf_gpmc_ad_conf_gpmc_ad_rxactive (0x00000020u)#define control_conf_gpmc_ad_conf_gpmc_ad_rxactive_shift (0x00000005u)#define control_conf_gpmc_ad_conf_gpmc_ad_puden (0x00000008u)#define control_conf_gpmc_ad_conf_gpmc_ad_puden_shift (0x00000003u)#define control_conf_gpmc_ad_conf_gpmc_ad_putypesel (0x00000010u)#define control_conf_gpmc_ad_conf_gpmc_ad_putypesel_shift (0x00000004u) #define gpio_sysconfig_softreset (0x00000002u)#define control_conf_gpmc_ad(n) (0x800 + (n * 4))#define gpio_sysstatus_resetdone (0x00000001u)#define gpio_sysstatus_resetdone_shift (0x00000000u)#define gpio_sysstatus_resetdone_complete (0x1u)#define gpio_sysstatus_resetdone_ongoing (0x0u)#define gpio_ctrl_disablemodule (0x00000001u)#define gpio_ctrl_disablemodule_shift (0x00000000u)#define gpio_ctrl_disablemodule_disabled (0x1u)#define gpio_ctrl_disablemodule_enabled (0x0u)/* this is used to configure a gpio pin as an input pin. */#define gpio_dir_input 1/* this is used to configure a gpio pin as an output pin.*/#define gpio_dir_output 0//#define gpio_instance_address (soc_gpio_1_regs)#define gpio_instance_pin_number (24) //3、定义自己的 file_operations 结构体 static const struct file_operations my_fops = { .read = led_drv_read, .write = led_drv_write, .open = led_drv_open, .owner = this_module, }; void gpiopinwrite(unsigned int baseadd, unsigned int pinnumber, unsigned int pinvalue){ if(gpio_pin_high == pinvalue) { hwreg(baseadd + gpio_setdataout) = (1 < < pinnumber); } else { hwreg(baseadd + gpio_cleardataout) = (1 < < pinnumber); }} //4、实现对应的 drv_open/drv_read/drv_write 等函数,填入 file_operations 结构体 static ssize_t led_drv_read(struct file *file, char __user *buf, size_t nbytes, loff_t *ppos){ return 0; } static ssize_t led_drv_write(struct file *file, const char __user *buffer,size_t count, loff_t *ppos){ char val; /*1、get data from app*/ /*copy_from_user(void * to, const void __user * from, unsigned long n):get form app*/ copy_from_user(&val,buffer,1); /*2、set register out 1/0*/ printk(kern_emerg led_drv_write =%dn,val); gpiopinwrite(soc_gpio_1_regs, gpio_instance_pin_number, (val==1)); return 1; } static int led_drv_open(struct inode *inode, struct file *filp){ /*3、configure gpa10 as gpio*/ return 0; }void gpiomoduleenable(unsigned int baseadd){ /* clearing the disablemodule bit in the control(ctrl) register. */ hwreg(baseadd + gpio_ctrl) &= ~(gpio_ctrl_disablemodule);}void gpiomodulereset(unsigned int baseadd){ /* ** setting the softreset bit in system configuration register. ** doing so would reset the gpio module. */ hwreg(baseadd + gpio_sysconfig) |= (gpio_sysconfig_softreset); /* waiting until the gpio module is reset.*/ while(!(hwreg(baseadd + gpio_sysstatus) & gpio_sysstatus_resetdone));} void gpio1pinmuxsetup(unsigned int pinno){ hwreg(soc_control_regs + control_conf_gpmc_ad(pinno)) = (control_conf_gpmc_ad_conf_gpmc_ad_slewctrl | /* slew rate slow */ control_conf_gpmc_ad_conf_gpmc_ad_rxactive | /* receiver enabled */ (control_conf_gpmc_ad_conf_gpmc_ad_puden & (~control_conf_gpmc_ad_conf_gpmc_ad_puden)) | /* pu_pd enabled */ (control_conf_gpmc_ad_conf_gpmc_ad_putypesel & (~control_conf_gpmc_ad_conf_gpmc_ad_putypesel)) | /* pd */ (control_conf_muxmode(7)) /* select mode 7 */ );}void gpiodirmodeset(unsigned int baseadd, unsigned int pinnumber, unsigned int pindirection){ /* checking if pin is required to be an output pin. */ if(gpio_dir_output == pindirection) { hwreg(baseadd + gpio_oe) &= ~(1 < < pinnumber); } else { hwreg(baseadd + gpio_oe) |= (1 < < pinnumber); }}#define gpio_to_pin(bank, gpio) (32 * (bank) + (gpio))#define gpio_fail_save_time4_en gpio_to_pin(1, 2) static int __init led_init(void){ printk(kern_emerg %s %s line %dn, __file__, __function__, __line__); major = register_chrdev(0,my_led,&my_fops); devno = mkdev(major, 0); printk(kern_emerg major=%dn,major); led_class = class_create(this_module, myled); /*创建/dev/myled*/ device_create(led_class, null, devno,null,myled); gpio_request(gpio_fail_save_time4_en, set_fail_save_low); gpio_direction_output(gpio_fail_save_time4_en, 0); return 0; } static void __exit led_exit(void){ printk(kern_emerg led_exitn); if (soc_control_regs) { //printk(kern_emerg exist soc_control_regsn); // iounmap(soc_control_regs); } if (soc_control_regs) { // printk(kern_emerg exist soc_gpio_1_regsn); // iounmap(soc_gpio_1_regs); } if (led_class) { //device_destroy(cls,devno); //class_destroy(cls); //unregister_chrdev(major,led); printk(kern_emerg exist led_classn); device_destroy(led_class, devno); class_destroy(led_class); unregister_chrdev(major,my_led); } printk(kern_emerg led_exit okn); } //修饰入口、出口函数 module_init(led_init); module_exit(led_exit); module_description(led driver); module_license(gpl);6.1.2 gpio库方式
使用通用api来操作gpio资源
#include #include #include#include#include#include#include#include#include#include#include#include#include#include#include#include#includestatic ssize_t led_drv_read(struct file *file, char __user *buf, size_t nbytes, loff_t *ppos);static ssize_t led_drv_write(struct file *file, const char __user *buffer,size_t count, loff_t *ppos);static int led_drv_open(struct inode *inode, struct file *filp);static int __init led_init(void);static void __exit led_exit(void);static struct class *led_class;static int major = 250;static int minor=0;static dev_t devno; #define gpio_to_pin(bank, gpio) (32 * (bank) + (gpio))#define gpio_fail_save_time4_en gpio_to_pin(1, 22) //3、定义自己的 file_operations 结构体 static const struct file_operations my_fops = { .read = led_drv_read, .write = led_drv_write, .open = led_drv_open, .owner = this_module, }; //4、实现对应的 drv_open/drv_read/drv_write 等函数,填入 file_operations 结构体 static ssize_t led_drv_read(struct file *file, char __user *buf, size_t nbytes, loff_t *ppos){ return 0;} static ssize_t led_drv_write(struct file *file, const char __user *buffer,size_t count, loff_t *ppos){ char val; /*1、get data from app*/ /*copy_from_user(void * to, const void __user * from, unsigned long n):get form app*/ copy_from_user(&val,buffer,1); /*2、set register out 1/0*/ printk(kern_emerg led_drv_write =%dn,val); gpio_set_value(gpio_fail_save_time4_en,val); return 1; }static int led_drv_open(struct inode *inode, struct file *filp){ /*3、configure gpa10 as gpio*/ return 0;} static int __init led_init(void){ printk(kern_emerg %s %s line %dn, __file__, __function__, __line__); major = register_chrdev(0,my_led,&my_fops); devno = mkdev(major, 0); printk(kern_emerg major=%dn,major); led_class = class_create(this_module, myled); /*创建/dev/myled*/ device_create(led_class, null, devno,null,myled); int get_result = gpio_request(gpio_fail_save_time4_en, set_fail_save_low); if (0 == get_result) { gpio_direction_output(gpio_fail_save_time4_en, 0); } return 0; } static void __exit led_exit(void){ gpio_free(gpio_fail_save_time4_en); if (led_class) { device_destroy(led_class, devno); class_destroy(led_class); unregister_chrdev(major,my_led); } } //修饰入口、出口函数 module_init(led_init); module_exit(led_exit); module_description(led driver); module_license(gpl);6.2 测试程序
#include #include #include #include #include #include //ledtest /dev/myled onint main(int argc, char **argv){ int fd; char status = 0; if(argc != 3){ printf(usage: %s n,argv[0]); printf(eg:%s /dev/myled onn,argv[0]); printf(eg:%s /dev/myled offn,argv[0]); return -1; } //open fd = open(argv[1],o_rdwr); if(fd < 0){ printf(open %s errorn,argv[0]); return -1; } //write if是on,status = 1;if是off,status = 0; if(strcmp(argv[2],on) == 0){ printf(open ledn); status = 1; } write(fd,&status,1);}6.3 makefile
要注意make rm等字符前需要有个tab,需要指定正在运行的内核源码路径
kern_dir = /home/harmony/kernel/kernelall: make -c $(kern_dir) m=`pwd` modules $(cc)gcc -o ledtest ledtest.cclean: make -c $(kern_dir) m=`pwd` modules clean rm -rf modules.order rm -f ledtestobj-m += led_my.o6.4 编译
make arch=arm cross_compile=${cc}6.5 测试
6.5.1 拷贝文件
将输出的led_my.ko和ledtest文件复制到sd卡boot区
6.5.2 连接读取器
通过读卡器插入bb-black开发板的usb端口
6.5.3 加载led驱动模块
#进入boot目录root@beaglebone:~# cd /media/boot/root@beaglebone:/media/boot# lsam335x-boneblack.dtb ledtest system volume information zimageled_my.ko mlo u-boot.imgroot@beaglebone:/media/boot# insmod led_my.komessage from syslogd@beaglebone at may 15 02:30:29 ... kernel:[ 699.497819] /mnt/hgfs/am335/app_ok/led_my.c led_init line 74root@beaglebone:/media/boot# message from syslogd@beaglebone at may 15 02:30:29 ... kernel:[ 699.504546] major=2416.5.4 运行ledtest测试程序,打开led
#复制测试程序到/home目录下root@beaglebone:/media/boot# cp ledtest /home/# 给ledtest增加权限root@beaglebone:/home# chmod 777 ledtest #打开led灯root@beaglebone:/home# ./ledtest /dev/myled onopen led[ 911.100696] led_drv_write =1message from syslogd@beaglebone at may 15 02:34:00 ... kernel:[ 911.100696] led_drv_write =16.5.5 对照原理图
这里的led的阳极连接了高电平,通过控制阴极为低电平来点亮led,根据电路原理,使用高电平可使电路导通,使led的引脚变为低电平。
6.5.6 关闭led
root@beaglebone:/home# ./ledtest /dev/myled off kernel:[ 1275.812135] led_drv_write =0七 总结
7.1 编译驱动程序时报错
7.1.1 cc1: error: code model kernel does not support pic mod
需要在内核源码目录下的makefile文件中增加编译选项“-fno-pie”
kbuild_cflags := -wall -wundef -wstrict-prototypes -wno-trigraphs -fno-strict-aliasing -fno-common -werror-implicit-function-declaration -wno-format-security -fno-delete-null-pointer-checks -fno-pie7.1.2 error: expected ‘:’ or ‘)’ before ‘popcnt64
需要在编译时增加编译选项
arch=arm cross_compile=${cc}7.2 加载驱动时的问题
7.2.1 insmod: error: could not insert module led_my.ko: invalid module format
7.2.1.1 版本信息不匹配
原因是正在运行的内核版本与源码版本信息有差异
需要重新编译内核,更新内核使编译驱动的内核版本与正在运行内核版本保持一致,通过以下命令查看,如果还是报错,则需要更新内核
uname -rmodinfo led_my.ko7.2.2 printk不打印信息
使用kern_emerg关键字
printk(kern_emerg %s %s line %dn, __file__, __function__, __line__);7.3 卸载驱动时提示访问空指针
unable to handle kernel null pointer dereference at virtual address 0000000
需要注意卸载驱动调用api的顺序
device_destroy(led_class, devno); class_destroy(led_class); unregister_chrdev(major,my_led);7.4 测试程序无法运行提示permission denied
需要把sd卡下的测试程序拷贝到home或其他本地目录增加权限,如果双击tab还是没有提示,则可能是文件的读写权限不够
chmod 777 ledtest7.5 相关命令
#查看内核版本号uname -r root@beaglebone:/home# uname -r3.8.13#查看驱动模块root@beaglebone:/home# lsmodmodule size used byled_my 1475 0 g_multi 47152 2 libcomposite 13879 1 g_multiipv6 229038 21 autofs4 17241 2 #查看模块信息root@beaglebone:/media/boot# modinfo led_my.ko filename: /media/boot/led_my.kolicense: gpldescription: led driversrcversion: 7a16bef13016a144bb92af1depends: vermagic: 3.8.13 smp mod_unload modversions armv7 thumb2 p2v8 #查看内核构建时间linux version 3.8.13 (root@harmony-virtual-machine) (gcc version 4.8.3 20140303 (prerelease) (crosstool-ng linaro-1.13.1-4.8-2014.03 - linaro gcc 2014.03) ) #1 smp mon may 2 23:43:36 cst 2022#查看模块是否加载成功root@beaglebone:/media/boot# cat /proc/devicescharacter devices: 1 mem 4 /dev/vc/0 4 tty 4 ttys 5 /dev/tty 5 /dev/console 5 /dev/ptmx 7 vcs 10 misc 13 input 14 sound 29 fb 81 video4linux 89 i2c 90 mtd116 alsa128 ptm136 pts153 spi166 ttyacm180 usb189 usb_device212 dvb226 drm241 my_led242 ttygs243 roccat244 hidraw245 ttysdio246 usbmon247 uio248 ttyo249 bsg250 iio251 watchdog252 pps253 media254 rtcblock devices: 1 ramdisk259 blkext 7 loop 8 sd 31 mtdblock 65 sd 66 sd 67 sd 68 sd 69 sd 70 sd 71 sd128 sd129 sd130 sd131 sd132 sd133 sd134 sd135 sd179 mmc7.6 gpio子系统相关api参考链接:
https://blog.csdn.net/orz415678659/article/details/8625284
7.7 交叉编译器的一些区别
arm-none-eabi-gcc:是 gnu 推出的的arm交叉编译工具。可用于交叉编译arm mcu(32位)芯片,如arm7、arm9、cortex-m/r芯片程序。
arm-linux-gnueabihf-gcc:是由 linaro 公司基于gcc推出的的arm交叉编译工具。可用于交叉编译arm(32位)系统中所有环节的代码,包括裸机程序、u-boot、linux kernel、filesystem和app应用程序。
5G网关在工业场景中有哪些实际应用
一种简单实用的交直流农作物电子驱鸟器
手提式防爆探照灯的使用寿命由这五个层面决策
诺德股份子公司联合铜箔通过LG化学审厂
Vishay推出超薄MTC封装三相桥式功率模块,提高系统可靠性,降低生产成本
通过linux跑一个ubuntu的带图形界面的系统
全球首颗二维码解码“中国芯”
量子显微镜帮助第一次真正看到光被纳米材料捕获时的动态
大电流弹片微针模组可提高FPC连接器的测试效率
5G+新基建,共创‘智·慧’新园区
PVPChain通过区块链技术,开启以赛事共治为核心的电竞区块链3.0时代
携手各界生态伙伴共促数实融合,罗克韦尔自动化参与2023中国5G+工业互联网大会
专利授权方面无休止 传高通计划裁员1500人
SCA体系结构中ARM组件的设计
全球首次实现基于eMTC VoLTE的应用落地 高通爱立信和中国联通合作
无人驾驶汽车的发展前景详细说明
高中生也能听懂的焦耳小偷电路详解_原理分析
WiFi 6正在加速赶来!
电池技术需要大家的努力
虹科新品 | 可调谐宽带白光LED光源!