- 博客(30)
- 资源 (1)
- 收藏
- 关注
原创 liinux中lds链接脚本中定义的变量理解
链接脚本中定义的符号(symbol)也可以认为是全局变量,在C代码和汇编代码都可以访问它。链接脚本定义的符号(变量)时代表一个地址。下面根据u-boot中情形分两种情况讨论:OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")OUTPUT_ARCH(arm)ENTRY(_start)SE
2020-04-06 19:00:43 1160 1
原创 手动为zynq mpsoc交叉编译dfu-utils工具
1)首先创建一个目录:mkdir dfu-util-cross2)下载源码包:http://sourceforge.net/projects/libusb/files/ 下载libusb-1.0.20.tar.bz2 http://dfu-util.sourceforge.net/releases/ 下载dfu-util-0.9.tar.gz3)解压两个包:
2018-01-09 19:42:35 1523
原创 GIC使用注意事项
一:GIC的原理:GIC最大支持8个cpu interface,对于0-31号中断每个CPU interface都是私有的。SPI中断(32-1019)会经过distributor转发给各cpu interface,ditributor和cpu interface都是基于内存地址映射的方式访问。distributor的地址是各CPU共享的,cpu interface的地址是每个CPU
2015-01-05 19:19:30 2925
原创 USB HID设备驱动加载过程
本文以linux-3.12内核来分析usb键盘插入系统后系统如何识别usb键盘的过程。内核选项配置CONFIG_HID,CONFIG_USB_HID,CONFIG_HID_GENERIC,但是没有配置CONFIG_USB_KBD,CONFIG_USB_MOUSE选项。 1)在内核启动时,注册了hid总线驱动,在drivers/hid/hid-core.c中 hid_init---->
2014-12-30 18:04:07 8152
原创 实现可变参数函数字符串的格式简单解析样例
void my_func(const char *s,...){ char *p, *prev = (char *)s; char *peer, *i; int for_int = -1; double for_double = 0.0; int skip = 0; va_list v; va_start(v, s); whi
2014-10-23 18:34:32 743
原创 用shell脚本读取gpio按键的对应的eventx
#/bin/bashline=$(cat ./input.txt | grep -n "gpio-keys" | awk -F: '{print $1}')echo $lineline=$(($line + 3))echo $linecat ./input.txt | sed -n ''$line'p' |awk '{print $3}'cat ./input.txt |
2014-06-06 16:35:36 3026
原创 在进程中用户态地址如何得到物理地址
在3.9内核里drivers/staging/tidspbridge/core/tiomap3430.c中发现一个有意思的函数:/* * ======== user_va2_pa ======== * Purpose: * This function walks through the page tables to convert a userland *
2014-05-14 15:10:52 1927
原创 usb
usb 信号:VBUS, GND, D+,D-,ID共5根线。usb分为插座和插头两种。图1 A型插座图2 A型插头图3 mini 插头图4 micro 插头 standard:标准mini:micro:最扁的那种mini插头转A型插座(AF)转接线:ID引脚是接地的mini插头转A型插头(AM)转接线:ID引脚是悬空的
2014-05-14 14:23:18 1448
原创 分析三星的uboot中的fdisk功能
MBR的分区表有4个,每个分区表长度为16个字节。CHS mode表示Cylinder/ Head/Sector,由于硬盘可能有多块盘片组成,每个盘片正面和反面都可以存数据,所以每个盘片正面和反面各有一个磁头,每个盘片的一面都是有一些同心圆组成,这些同心圆就是磁道,不同盘片上的相同位置的同心圆(磁道)应该在一个圆柱体的表面,称为柱面,同时每个磁道又会切分成多个扇区,一般扇区的大小为512个字节
2014-05-14 14:20:57 1228
原创 ARM linux下memtester交叉编译
我们在自己的新开发的板子上测试DDR稳定性很必要,尽管uboot下可以用mtest测试DDR,但是由于uboot一般不使能cache,测试不完全,一旦开cache,DDR会出现burst传输。 linux的内存测试工具memtester,为了测试ARM板子的DDR的稳定性,需要移植memtester我们的arm板子上,它的移植比较简单。 我们可以从http://pyropus.ca/s
2014-04-03 14:05:42 9070
原创 linux下的二进制工具
hexdump -C -v xxx.bin xxd -g1 xxx.bin 表示以1个字节为分组,默认是2个字节分组,-g0表示以位的形式分组。
2014-03-20 11:43:29 533
原创 魔法键sysrq
1)在串口终端中,我们可以发送一个break,串口驱动收到这个break后(所以需要串口驱动支持的),会触发魔法键。如何发送break?ctrl + break键,然后敲回车,会出现帮助。后面调用命令时:按下ctrl + break 松开,再按对应的命令码比如l,就会打印堆栈信息。2)另外可以使用proc文件系统接口来触发对应的功能,比如echo t > /proc/sysrq-trigge
2014-03-20 10:36:20 939
原创 使用内核中更新mtd分区表方法以及查看和修改环境变量(fw_setenv)
这个工具是uboot中提供的,需要把它交叉编译一下放到文件系统中,交叉编译方法: make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- HOSTCC=arm-linux-gnueabihf-gcc HOSTSTRIP=arm-linux-gnueabihf-strip env 然后把内核里的mtd分区表信息改成自己想要的,在新
2014-03-06 15:51:18 7544
原创 uboot中ramdisk启动linux的两种方法
第1种:setenv ramdiskimage 'ramdisk.gz.uboot'setenv ramdiskaddr '0x2000000'setenv ramload 'tftp ${loadaddr} ${bootimage};tftp ${ramdiskaddr} ${ramdiskimage}; tftp ${fdtaddr} ${fdtimage}'setenv ra
2014-03-06 15:03:34 7160
原创 uboot如何设置nfs的启动参数
在uboot中设置环境变量:setenv nfsroot "/dev/nfs"setenv nfsip "192.192.192.201"setenv nfsdir "/home/xuewt/share/yocto/build/tmp/work/socfpga_cyclone5-poky-linux-gnueabi/altera-image-1.0-r0/rootfs"sete
2014-03-06 14:59:56 3356
原创 查找一个字符串中最大重复子串(C语言版)
#include #include /* 找出一个字符串最大相同子串,如果有多个重复子串,则要求返回最后一个位置的子串*/void print_sub(char *p, int len){ int save_len = len; while(len && len--) { printf("%c ", *p++); } printf("(%d bytes
2014-01-14 17:38:48 6531
翻译 求一个数的临近的较大的2的整数次幂
偶然看到云风的http://blog.codingnow.com/2011/12/buddy_memory_allocation.html 代码,发现了一个比较巧妙的实现。 static inline intis_pow_of_2(uint32_t x) { return !(x & (x-1));}static inline uint32_tnext_pow_of_2
2013-12-31 15:50:57 1573
原创 结合2012.10版本的u-boot分析SD卡驱动(笔记)
xxx_mmc_init流程:|power up sd_card|给卡上电 | \|/|reset controller/fifo/dma|执行控制器复位/fifo复位 | \|/|清除所有状态寄存器|实际是复位硬件的状态机 | \|/|屏蔽中断寄存器| 比如设置中断掩码及使能寄存
2013-12-25 11:38:35 2315
原创 arm的2级页表在Linux内核创建过程解析
系统DDR的基地址为0x0,内存为1GB,所以TTB的基地址为0x4000。下面要创建虚拟地址0xfe700000到物理地址0xffff0000之间的映射,映射大小为64KB,即16页。由于物理地址不是1MB字节对齐,所以必须创建两级映射。 用户空间/内核空间划分为2G/2G。 create_mapping:pgd = 0x80007f98, addr = 0xfe700000,
2013-11-14 15:32:30 1291
原创 3.10内核中使用dtb的ramdisk启动方法
内核配置如下: 1) General setup-->[*] Initial RAM filesystem and RAM disk (initramfs/initrd) support [*] Support initial ramdisks compressed using gzip
2013-10-09 17:21:00 925
原创 C语言引用汇编代码里的全局标号或变量
在内核的include/linux/linkage.h中定义了:#ifndef ENTRY#define ENTRY(name) \ .globl name; \ ALIGN; \ name:#endif#endif /* LINKER_SCRIPT */ 在arch/arm/mach-socfpga/headsmp.S 中定义了一下两个全局变量:
2013-10-09 16:02:53 3459
原创 嵌入式系统如何安装内核模块
在内核源码目录下输入make help,这里就有帮助:当我们把SD卡的ext3分区通过读卡器挂载到主机下面,比如/media/xxxxx。make ARCH=arm CROSS_COMPILE=arm-linux- modulesmake ARCH=arm CROSS_COMPILE=arm-linux- modules_install INSTALL_MOD_PATH=/me
2013-07-29 20:47:55 871
原创 wpa_supplicant和openssl移植
在ubuntu10.04下移植,下面记录过程。版本:wpa_supplicant-2.0.tar.gz openssl-1.0.1e编译器:linaro - arm-linux-gcc-4.7.3备注:经过测试发现openssl-0.9.8e + wpa_supplicant-0.7.3 or wpa_supplicant-2.0 连接时会出错:>
2013-07-29 20:39:38 2947
原创 最新的linux内核启动时保留一段连续物理内存方法
MACHINE_START.reserve = xxx_reserve,MACHINE_ENDstatic void __init xxx_reserve(void){memblock_free(phy_address_base, size);memblock_remove(phy_address_base, size);}
2013-07-29 20:21:43 1460
原创 u-boot常用编译选项
-isystem path 指定系统的头文件,U-boot指定的是编译器的头文件在host主机运行 arm-linux-gnueabihf-gcc --print-file-name=include 命令会打印出当前交叉编译器的头文件路径/opt/altera-linux/linaro/gcc-linaro-arm-linux-gnueabihf-4.7-2012.11-20121123
2013-07-29 20:17:32 1701
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人