【分享】iTOP4412开发板-Bluetooth移植文档

最近须要把Bluetooth移植到iTOP-4412 开发平台。查阅了相关资料,经过一段时间的研究、调试,最终成功的将蓝牙功能移植到了开发板上面。这里笔者记录移植过程及注意事项,方便以后工作须要。

iTOP-4412开发板的Bletooth模块与板卡之间的连接採用UART接口。Bletooth硬件模块使用的是MTK的MT6620芯片,MTK提供了Android4.0及Android4.4的driver, Porting Guid,有了这些就为我们的移植工作做了整体性的指导。

可是唯独MTK提供的文档还是远远不够的,毕竟硬件接口定义不同,kernel版本号也不同,Android层与MTK提供的代码也有差异。这就须要我们在MTK文档的指导下, Step  by Step 进行 Porting 工作.

移植环境:

1  iTOP-4412 精英版 +  MT6620 Bletooth模块

2  kernel  3.0.15  version

3  Android4.4.

4  Ubuntu12.04  64BIt 开发环境

文件夹

文件夹 1

1.1  概述 1

1.2  硬件相关部分 2

1.3  Kernel 4

1.3.1 概述 4

1.3.2 代码改动 5

1.4  用户态空间 8

1.5  HAL层移植 9

1.5.1  Bluedroid 10

1.5.2  init.connectivity.rc 文件 12

1.5 总结 12

1.2  硬件相关部分

因为MT6620 芯片集成了Bluetooth。WiFi, FM,GPS功能。所以Bluetooth的原理图可查看 MT6620 WiFi原理图部分,下图为Bletooth模块与开发板连接的引脚定义。通过该接口能够知道Bluetooth模块与CPU的交互接口.

▆  UART 串口: Bluetooth与CPU之间的通信接口,命令和数据的传输都是经过串口交换的。

另外MT6620固件补丁的下载也是通过串口进行的,所以说串口是不可缺少的硬件接口。上图中 Pin8,Pin10 为串口部分,与CPU的串口0连接.

▆ MT6620 芯片使能引脚:  Pin16  PMU_EN 。使能引脚,默认低电平状态,高电平有效, 启用蓝牙功能之前须要先使能该引脚,这样MT6620才開始工作。

▆ 中断引脚:Pin 14  BGF_INT , Blutooh, GPS,FM共用的中断引脚,用于告知CPU有数据来了,或者说有请求到了.

▆  复位引脚: Pin15 WiFi_RESET 。该引脚与MT6620的SYSRST_B连接,用于芯片的复位操作.

▆ 芯片工作电压:Pin12提供1.8V的电压输入。Pin19提供3.3V,Pin20提供5V电压输入.

下图为MT6620模块原理图部分:

MT6620的引脚定义例如以下:

以上是进行Porting前的准备工作,当然须要万用表。示波器工具进行辅助的检測。查看Bluetooth模块的工作电压是否正常,GPIO的当前状态。串口的数据波形.

另外须要强调的是,MT6620 Bluetootch支持蓝牙4.0规范,蓝牙4.0规范包含常规蓝牙。快速蓝牙,还有非常重要的低功耗蓝牙,即BLE的支持,以下是MT6620蓝牙特性:

▆ 支持Bluetooth V2.1 +EDR

▆ 支持Bluetooth 3.0+HS compliance

▆ 支持Bluetooth V4.0 Low Energy (LE)

▆ 使用UART / PCM 接口

▆ 模組包括PA with 13 dBm (class 1) transmit power

▆ Better WiFi/BT coexistence performance

▆ Low power scan function to reduce the power consumption in scan modes

关于MT6620的很多其它硬件特性,请參考MTK官方公布的MT6620硬件使用指导相关文档.

1.3  Kernel

1.3.1 概述

iTOP4412开发板採用的内核是Linux 3.0.15 版本号,MTK官方给的移植Porting没有说明针对详细的 kernel版本号,因为是Android4.4,所以kernel应该是3.0以后的版本号或者更高支持;

首先依照PoringGuid的指导说明。把New和Modify文件夹以下关于kernel部分的改动放到我们的kernel代码里面。 把MT6620的驱动放在driver/misc/文件夹以下,文件夹名称 mediatek,里面存放的是WMT,既wireless manage tools, 里面提供了与MT6620  download  firmware patch 。enable /disable MT6620芯片,power on, power off操作的相关驱动部分, 及SDIO总线设备接口驱动Host Interface drivers. 蓝牙驱动mtk_stp_bt.ko 的源代码也在这个文件夹以下,我们以驱动库 .ko 的形式编译驱动模块.

driver/misc/mediatek/ 库文件列表例如以下::

mtk_hif_sdio.ko ----mmc总线相关接口。mmc总线发现SDIO设备,分配总线地址后,会与该驱动进行适配.适配成功后该驱动会调用WiFi网络驱动,另外Bluetooth也使用了该驱动库文件提供的对应接口;

mtk_stp_uart.ko-----串口相关驱动,通过串口下载固件补丁,设置芯片參数;

mtk_stp_wmt.ko-----core 部分,提供Bluetooth上电,断电,PSM省电管理操作等

mtk_stp_bt.ko ----字符设备驱动,创建Bluetooth设备节点用于与用户空间交互;

另外这里附一张Blutooth Kernel层驱动层次图:

上图红色部分 BlueZ, Hci_stp.ko为Android4.0 Bluetooth使用的蓝牙协议栈与Kernel库文件。

蓝色部分Bluedroid, mtk_stp.bt.ko 为Android4.4 版本号使用的蓝牙协议栈与kernel库文件。

Android4.0与Android4.4关于Bluetooth部分变化比較大,请大家移植过程中注意这一点,他们之间的详细差异这里不再解说。

从上图能够看到 bluetooth驱动调用关系:

mtk_stp_bt.ko -> mtk_stp_wmt.ko -> mtk_stp_uart.ko -> uart driver

最后最底层的串口驱动负责蓝牙命令,数据的发送与接收.

1.3.2 代码改动

1  依据硬件连接情况配置必要的平台资源

改动文件:  kernel/iTop4412_Kernel_3.0/arch/arm/mach-exynos/mach-itop4412.c

关键函数: 该函数配置MT6620相关的GPIO引脚为初始化输出状态。或者配置为中断状态,Bluetooth驱动会改变这些引脚的状态,这里不过初始化.

static void __init mtk_combo_init(void)

{

//MT66XX PMUEN

if(gpio_request(EXYNOS4_GPC1(0), "GPC1_0"))

{

printk(KERN_ERR "failed to request GPC1_0 for MT6620  PMUEN control\n");

}

//MT66XX SYSRST

if(gpio_request(EXYNOS4_GPC1(1), "GPC1_1"))

{

printk(KERN_ERR "failed to request GPC1_1 for MT6620  SYSRST control\n");

}

s3c_gpio_cfgpin(EXYNOS4_GPC1(0), S3C_GPIO_OUTPUT);

s3c_gpio_cfgpin(EXYNOS4_GPC1(1), S3C_GPIO_OUTPUT);

gpio_direction_output(EXYNOS4_GPC1(0), 0);

gpio_direction_output(EXYNOS4_GPC1(1), 0);

gpio_free(EXYNOS4_GPC1(0));

gpio_free(EXYNOS4_GPC1(1));

mdelay(5);

//need config eint models for Wifi & BGA Interupt

if (gpio_request(EXYNOS4_GPX2(5), "WiFi INT"))

printk(KERN_WARNING "MT6620 WiFi INT(GPX2.5) Port request error!!!\n");

else    {

s3c_gpio_setpull(EXYNOS4_GPX2(5), S3C_GPIO_PULL_NONE);

s3c_gpio_cfgpin(EXYNOS4_GPX2(5), S3C_GPIO_SFN(0xF));

gpio_free(EXYNOS4_GPX2(5));

}

if (gpio_request(EXYNOS4_GPX2(4), "BGF INT"))

printk(KERN_WARNING "MT6620 BGA INT(GPX2.4) Port request error!!!\n");

else    {

s3c_gpio_setpull(EXYNOS4_GPX2(4), S3C_GPIO_PULL_NONE);

s3c_gpio_cfgpin(EXYNOS4_GPX2(4), S3C_GPIO_SFN(0xF));

gpio_free(EXYNOS4_GPX2(4));

}

//normal it is high level

if (gpio_request(EXYNOS4_GPX3(2),  "6260_GPIO2")!=0) {

printk("[mt6620] ERROR:Cannot request 6260_GPIO2\n");

} else {

gpio_direction_output(EXYNOS4_GPX3(2), 1);/* WLAN_CHIP_PWD */

gpio_set_value(EXYNOS4_GPX3(2), 1);

mdelay(100);

gpio_free(EXYNOS4_GPX3(2));

}

return; }

关键结构体: 该结构体告诉MT6620驱动相关部分使用了平台的哪些GPIO资源.

结构体所属文件: kernel/iTop4412_Kernel_3.0/arch/arm/mach-exynos/mach-itop4412.c

static struct mtk_wmt_platform_data mtk_wmt_pdata = {

.pmu =EXYNOS4_GPC1(0), //RK30SDK_WIFI_GPIO_POWER_N,//RK30_PIN0_PB5, //MUST set to pin num in target system

.rst = EXYNOS4_GPC1(1),//RK30SDK_WIFI_GPIO_RESET_N,//RK30_PIN3_PD0, //MUST set to pin num in target system

.bgf_int=EXYNOS4_GPX2(4), //IRQ_EINT(20),//RK30SDK_WIFI_GPIO_BGF_INT_B,//RK30_PIN0_PA5,//MUST set to pin num in target system if use UART interface.

.urt_cts = -EINVAL, // set it to the correct GPIO num if use common SDIO, otherwise set it to -EINVAL.

.rtc = -EINVAL, //Optipnal. refer to HW design.

.gps_sync = -EINVAL, //Optional. refer to HW design.

.gps_lna = -EINVAL, //Optional. refer to HW design.

};

static struct mtk_sdio_eint_platform_data mtk_sdio_eint_pdata = {

.sdio_eint = EXYNOS4_GPX2(5),//IRQ_EINT(21) ,//RK30SDK_WIFI_GPIO_WIFI_INT_B,//53, //MUST set pin num in target system.

};

static struct platform_device mtk_wmt_dev = {

.name = "mtk_wmt",

.id = 1,

.dev = {

.platform_data = &mtk_wmt_pdata,

},

};

static struct platform_device mtk_sdio_eint_dev = {

.name = "mtk_sdio_eint",

.id = 1,

.dev = {

.platform_data = &mtk_sdio_eint_pdata,

},

};

MTK 官方移植文档中会告诉我们须要在原始内核代码里面添加哪些文件,怎样在make menuconfig中配置相关部分。这里就不再具体描写叙述.

注意:蓝牙驱动尽管没有使用到mmc总线,可是mtp_hif_sdio.ko 驱动导出了接口函数。mtk_stp_wmt.ko 核心驱动库会调用导出函数,所以mtp_hif_sdio.ko须要载入到内核空间,假设您的产品中不含有WiFi。 只须要Bluetooth功能,那么全然能够不用配置MMC总线部分,不影响蓝牙的使用,可是务必载入mtp_hif_sdio.ko文件。

另外MT6620 具备功耗控制功能,默认情况下假设MT6620 处于idle空暇状态,空暇时间大于60秒后,会自己主动进入sleep状态。有中断触发时会唤醒,继续工作,您能够使用 "echo 0 0  > /proc/driver/wmt_dbg "命令关闭功耗控制。这样MT6620会始终不会进入sleep状态。另外也能够改动MT6620 mtk_stp_wmt.ko驱动中的參数。更改ide  to  sleep的时间.

MTK 官方提供的驱动代码中芯片默认 idle   5 秒后会进入sleep  状态。使用蓝牙接收文件时,假设用户响应时间超过了5秒(用户没有单击接收或者拒绝button),MT6620会休眠,驱动会导致MT6620会进入RESET状态。从而Bluetooth服务会出现故障。Bluetooth功能不可使用,为了避免这种问题发生。我们把休眠时间由默认的 5秒调整到了60 秒,给用户足够多的响应时间,用户在60秒内 接收或者拒绝蓝牙手机发给板卡的文件。另外文件接收完毕后,须要单击状态栏中的文件接收完毕提示,尽量在Android4.4 状态栏中不含有关于蓝牙消息的提醒。

u

1.4  用户态空间

以下我们描写叙述一下採用Linux系统和Android系统的用户都须要注意的地方:

驱动层移植完毕后, MTK的Porting Guid会告诉你须要在用户态执行wmt_launcher工具。作为后台的一个服务程序执行。该服务会配置串口的工作參数,下载固件补丁到MT6620中,他的源码相对照较简单,仅仅有一个.c文件:

原始文件位于MTK公布包:

APEX_Android_4.4_MP_SW_package_V2.0/APEX_Android_4.4_MP_001_panda_combo_mt66xx_Package_Common/New/hardware/mediatek/wmt/stp_uart_launcher.c

改动后的文件位于iTOP-4412 Android4.4公布包:

iTop4412_KK4.4/hardware/mediatek/wmt/stp_uart_launcher.c

改动点主要在串口參数配置上,因为内核版本号不同,串口设置參数也略有不同.

详细改动能够使用代码比对工具进行比較。

另外须要说明的是执行wmt_launcher的执行參数 跟MTK给的移植文档有点不同,Porting Guid 里面推荐串口波特率使用921600, 而在iTOP-4412的板子上面採用该值会工作不正常,导致固件补丁无法下载,開始怀疑板卡不支持该波特率,后使用串口測试工具专门针对这个串口进行921600測试。也没发现问题,后没有继续查找。而是执行wmt_launcher时採用115200波特率:

wmt_launcher  -b 115200  -d  /dev/ttySAC0  -p  /system/etc/firmware &

注意:  假设您的操作系统使用的是Linux而不是Android。须要改动stp_uart_launcher.c

原始代码里面有Android特有的属性相关部分。Linux系统不具有这个特性,我们提供了改动好的文件:stp_uart_launcher-linux-ok.c 。用户能够作为參考。该文件与原始文件stp_uart_launcher-ori.c。及正常工作的文件 stp_uart_launcher.c 位于同样文件夹以下.

不管是Linux系统还是Android系统,挂载根文件系统以后须要执行 wmt_launcher 服务,该服务在后台执行。打开 /dev/ttySAC0 串口,监控着串口上报的事件。对事件进行响应,比方内核上报 "下载固件补丁" 事件,那么wmt_launcher会打开  /system/etc/firmware以下的固件补丁,然后下载到MT6620模块中,该服务不能够被用户终止执行.

1.5  HAL层移植

Bluetooth的HAL层主要有 Bluedroid 协议栈与MT6620 vendor提供底层库文件组成。

须要我们重点关注的有 bluetooth.default.so  该动态库文件提供了 Framework层调用HAL层的 API 接口,同一时候向下调用 libbt-hci.so 。

bluetooth.default.so包括两个静态库:libbt-brm_stack.a   libbt-brm_bta.a .  libbt-brm_stack.a提供Bluetooth  各种profiles的支持, 比方  a2dp,hid,pan 等等, libbt-brm_bta.a   用于与framdwork层进行通信.

libbt-hci.so 该动态库提供bluetooth.default.so的底层支持,另外他会调用 libbt-vendor.so 接口,

通过串口发送,接收命令,数据的操作也是通过该动态库实现的。他位于bluedroid源代码文件夹

hci 目录下。

libbt-vendor.so 厂商库文件。用于实现厂商提供的蓝牙模块特性支持,库文件位于android4.4/iTop4412_KK4.4/hardware/mediatek/bt/combo_mt66  文件夹下。

1.5.1  Bluedroid

从Android 4.2開始。Bluetooth stack发生了重大改变:从Bluez换成了由Google和Broadcom联合开发的Bluedroid(当然,核心的部分还是Broadcom的。Google主要是做了和上层Framework相关的部分)。

Bluedroid和Bluez相比,有例如以下长处:

■ 层次结构清晰。各个profile对上层接口统一。便于添加新的profile;

■ 添加了HAL层,便于移植。

■ 去掉了DBus。Framework的Java代码直接调用到Bluedroid的Native代码。

可是Android 4.2中的Bluedroid与Android 4.0中的Bluez相比。功能要少,比如不支持AVRCP 1.3, Bug较多。比如某些蓝牙耳机不能重拨最后一个电话。最重要的是4.2的Bluedroid不支持BLE。只是在刚刚公布的Android 4.3中已经有了非常多改进,AVRCP 1.3和BLE都得到了支持。

眼下有一些Android 4.1或4.2的设备是支持BLE的,可是都是採用的Vendor自己的解决方式,比方Bluetooth stack採用Bluez 5.x,再提供Vendor BLE Android SDK. 如今Android 4.4已经公布,从未来发展趋势来看,假设有人要学习Bluetooth in Android,建议不要再研究Bluez,最好转向Bluedroid。

下面是Android 4.4 中Bluetooth相关代码之分布:

android.bluetooth frameworks/base/core/java/android/bluetooth implements public API for the Bluetooth adapter and profiles

Bluetooth system service packages/apps/Bluetooth/src implements service and profiles at the Android fraework layer

Bluetooth JNI packages/apps/Bluetooth/jni defines Bluetooth adapter and profiles service JNI: calls into HAL and receives callback from HAL

Bluetooth HAL hardware/libhardware/include/hardware/bt_*.h files defines the standard interface that the android.bluetooth adapter and  profiles APIs

Bluetooth stack external/bluetooth/bluedroid implement bluetooth stack: core and profiles

笔者在进行Bluetooth的调试过程中。使用Logcat 命令输出Android的调试信息,在Android的Setting界面开启蓝牙功能,依据信息打印的输出,发现Enable Bluetooth的过程中出现了问题,最后查找原因是由于MT6620芯片工作前须要须要下载固件补丁,这个过程须要花费一定的时间,然后bluetooth.default.so 库文件代码中对开启Bluetooth有一定的时间限制,默认情况下是3000毫秒的超时时间,超时后会disable 蓝牙,后经笔者改动为20 000 毫秒,这样就可以enable蓝牙芯片。从而进入工作状态.

改动文件:  iTop4412_KK4.4/external/bluetooth/bluedroid/Android.mk

1.5.2  init.connectivity.rc 文件

init.connectivity.rc 文件路径:

iTop4412_KK4.4/hardware/mediatek/config/combo_mt66xx/ init.combo_mt66xx.rc

原始文件名为 init.combo_mt66xx.rc,复制到ramdisk的root文件夹以下名称变更为init.connectivity.rc文件 。

我们在该文件添加了载入驱动模块库操作,执行wmt_lanucher服务操作。另外须要注意文件原有的创建bluetooth相关文件夹操作,及改动权限,变更拥有者,这些command很的重要。比方:

# Load Blue module

insmod /system/lib/modules/mtk_stp_bt.ko

chmod 0660 /dev/stpbt

chown bluetooth system /dev/stpbt

mkdir /data/bluetooth 0711 bluetooth bluetooth

mkdir /data/misc/bluedroid 0771 bluetooth bluetooth

1.5 总结

用户在移植HAL层之前能够先使用MTK提供的蓝牙測试工具autobt进行測试。该測试工具脱落复杂的HAL层,直接调用libbt-vendor.so 也就是厂商自己的库文件。在Android的命令行中运行就可以,能够使用该命令查询其它的蓝牙设备,发送。接收文件等等。

是推断蓝牙硬件是否正常工作的有力工具。使用autobt測试通过后,再调试Android HAL及上层部分。

autobt工具的源代码位于:

iTop4412_KK4.4/hardware/mediatek/utility/hw_test_tool/bluetooth/src/tool

另外MTK官方提供了Bluetooth的多个补丁,路径:

APEX_Android_4.4_MP_SW_package_V2.0/Document/BT_patch_description(must read)

这些补丁是比較重要的,有关于蓝牙基础连接方面的,也有关于蓝牙文件发送接收。蓝牙鼠标,蓝牙耳机方面的。须要依据您的产品需求打相应的补丁,我们公布的Android4.4代码中已经打上了蓝牙基础连接,和文件发送接收方面的补丁,其它的补丁未处理.

HAL层改动完毕后在Android4.4的Setting里面打开Bluetooth,就能够扫描到其它蓝牙设备,然后进行配对,配对完毕后就能够进行文件的传输操作了。笔者仅測试了蓝牙的文件发送与接收功能,其它的蓝牙功能比方蓝牙耳机。蓝牙鼠标的使用均未进行測试。只是有了文件发送接收的測试基本说明了蓝牙的Porting是OK的,假设您有兴趣或者需求,能够移植蓝牙其它更丰富的功能与应用。

【分享】iTOP4412开发板-Bluetooth移植文档的更多相关文章

  1. [资料分享]迅为iTOP4412开发板-SDIO WiFi移植文档

    本文转自迅为:http://www.topeetboard.com 概述 近期需要把WiFi无线网络功能移植到iTOP-4412 开发平台,查阅了相关资料,经过一段时间的研究.调试,终于成功的将WiF ...

  2. iTOP-4412开发板-串口转接小板的使用文档

    本文档介绍如何使用 迅为iTOP-4412 精英版如何使用串口转接板,串口小板如下所示.和串口转接板模块相关的资料如下:“iTOP-4412-Android-串口测试文档(升级版)_V2.X.zip” ...

  3. 移植opencv2.4.9到itop4412开发板

    OpenCV是眼下开源项目中最著名的基于机器视觉方向的图像处理的开发包,眼下已经有被移植到嵌入式Linux环境上. 本文介绍了OpenCV交叉编译的基本步骤. 在opencv交叉编译之前要先进行依赖库 ...

  4. iTOP-4412开发板qt4文件的移植和修改

    在 7.4 小节介绍配置文件的时候,提到迅为制作的触摸库文件“/usr/local/tslib”,迅为 已经将触摸功能编译到 Qt/E4.7.1 的库文件中,开发板可以支持触摸和鼠标功能. 用户在前面 ...

  5. 学习itop4412开发板有哪些资料可学习?能否学会

    1.光盘资料 下面简单的做一下了解,在需要使用这些资料的时候,会针对性的做详细介绍. 将文件以及文件夹按照“名称+递增”的方式排列,如下: 01_PCB_SCH_DATASHEET-- -----开发 ...

  6. 嵌入式开发 迅为4418开发板Qt移植移动4G模块第一部分

    本文转自迅为论坛:http://topeetboard.com 了解更多:https://item.taobao.com/item.htm?spm=a1z10.1-c.w4004-7744162139 ...

  7. iTOP-4412开发板-LinuxC-继电器模块的测试例程

    平台:iTOP-4412开发板 实现:继电器模块测试例程 继电器的 C 的测试程序,C 测试程序可以在 Android系统,Qt 系统以及最小 linux 系统上运行,文档以 Android 系统上测 ...

  8. 物联网初学者智能家居必备迅为iTOP-4412开发板

    更情点击了解:http://www.topeetboard.com 1.  手把手全视频教程: 第一部分:迅为电子开发板入门视频 第二部分:Linux系统编程 第三部分:Itop-4412开发板硬件设 ...

  9. iTOP-4412开发板网盘资料介绍

    iTOP-4412开发板网盘视频资料内容如下: 01-烧写.编译以及基础知识视频 02-嵌入式Linux 视频 03-iTOP-4412 开发板硬件设计指导视频 04-Android 应用程序视频 0 ...

随机推荐

  1. 引入servlet概念

    Servlet简介 Java Servlet是和平台无关的服务器端组件,它运行在Servlet容器中.Servlet容器负责Servlet和客户的通信以及调用Servlet的方法,Servlet和客户 ...

  2. ldap数据库--ODSEE--卸载

    针对ldap实例的卸载,即删除,可以通过管理界面进行操作也可以通过命令行进行操作.卸载顺序为ldap实例--agent--ads.这里主要介绍命令操作步骤 1,ldap实例卸载 从ads注销,即不在需 ...

  3. Java 内存区域划分 备忘录

    最近看了<深入理解虚拟机>的内存分配与管理这部分的内容,这里做一个的总结,以加深我对知识点的理解,如有错误的地方,还望大神们指出,我及时更正:  内存区域划分 首先是下面这幅图: 图 1. ...

  4. HTML知识速递

    1.html的定义 超文本标记语言(Hypertext Markup Language,HTML)通过标签语言来标记要显示的网页中的各个部分.一套规则,浏览器认识的规则 浏览器按顺序渲染网页文件,然后 ...

  5. VS2015如何连接mySQL数据库

    mySQL数据库           如题,今天给大家简单演示一下VS2015如何连接mySQL数据库.       首先呢,大家需要安装vs2015和mySQL这两个软件,我还安装了一个辅助软件SQ ...

  6. Science发表的超赞聚类算法

    作者(Alex Rodriguez, Alessandro Laio)提出了一种很简洁优美的聚类算法, 可以识别各种形状的类簇, 并且其超参数很容易确定. 算法思想 该算法的假设是类簇的中心由一些局部 ...

  7. css实现左侧固定宽,右侧自适应的7中方法

    一个面试会问的问题,如何实现两个盒子,左侧固定宽度,右侧自适应. 1.利用 calc 计算宽度的方法 css代码如下: .box{overflow: hidden;height: 100px;marg ...

  8. webpack 3.X学习之CSS处理

    Loaders Loaders是Webpack最重要的功能之一,他也是Webpack如此盛行的原因.通过使用不同的Loader,Webpack可以的脚本和工具,从而对不同的文件格式进行特定处理. Lo ...

  9. 使用ztree展示树形菜单结构

    官网:http://www.treejs.cn/v3/main.php#_zTreeInfo 一.功能简介 在权限系统中,实现给角色指定菜单权限的功能.主要包括以下几点: 读取全部菜单项,并以树形结构 ...

  10. excel vlookup

    今天在百度知道的时候,看到旁边有人问excel中条件查找vlookup的问题,有几位高手都知道使用vlookup作答,可惜都是没有经过测试,直接复制别人的答案,让所有的读者都无法实施,一头雾水.今天我 ...