小编Dav*_*ter的帖子

Raspberry Pi 3上的常见时钟框架驱动程序Hello World

我正在尝试为我通过I2C连接到Raspberry PI 3的时钟编写一个通用时钟框架驱动程序.注意:我对Linux和内核编程都很陌生.

更新:成功!

下面的代码适用于Hello World驱动程序,我必须对设备树进行的唯一更改才能让我的驱动程序加载是添加i2c1节点的子节点(在arch/arm/boot/dts/bcm2708_common.dts中) ):

i2c1: i2c@7e804000 {
        compatible = "brcm,bcm2708-i2c";
        reg = <0x7e804000 0x1000>;
        interrupts = <2 21>;
        clocks = <&clk_core>;
        #address-cells = <1>;
        #size-cells = <0>;
        status = "disabled";
        myclock: clock-generator@6a {
                #clock-cells = <0>;
                compatible = "dbc,myclock";
                reg = <0x6a>;
                clock-frequency = <75000000>;
        };
};
Run Code Online (Sandbox Code Playgroud)

有了这个,我现在看到我希望在dmesg中看到的printk消息.

什么工作

  • 带时钟的评估板通过串行总线连接到PI.已通过i2cdetect/i2cdump验证.I2C器件是@从地址0x6a.
  • 我从Ubuntu(在VirtualBox上运行)交叉编译了我自己的Raspberry PI 3内核版本(4.4.16-v7)并成功将其部署到PI.用uname -a验证(检查我添加到Makefile的EXTRAVERSION信息).
  • 我创建了一个Hello World设备驱动程序,我可以使用insmod加载.
  • 我创建了一个Hello World设备驱动程序,我可以将其添加到设备树中(在bcm2708_common.dtsi和bcm2710-rpi-3-b.dts中).我可以将新设备树部署到PI.已验证设备驱动程序正在使用printk语句加载(在PI引导后使用dmesg查看)以及在引导后检查lsmod.
  • 我在drivers/clk(clk-myclock.c)中创建了一个Hello World公共时钟框架驱动程序的初始尝试.此驱动程序最终将用于更改时钟速率,因此我在clk_ops结构中实现recalc_rate,round_rate和set_rate.我将此驱动程序添加到drivers/clk/Makefile,并为drivers/clk/Kconfig添加了一个配置选项.我使用menuconfig来启用该选项,并且我已经验证了正在构建模块(clk-myconfig.o是由构建创建的).

什么不起作用

我现在正在尝试将我的Hello World ccf驱动程序添加到Raspberry Pi上的设备树中.我不太了解设备树,无法知道添加它的位置(甚至PI是否实际支持ccf).

我尝试过的两件主要事情是:

  • 将设备作为子项添加到bcm2708_common.dtsi中的i2c0和i2c1下.

  • 在bcm2708_common.dtsi的clocks {}部分添加设备,然后从i2c0和i2c1的clocks属性引用我的新时钟.

据我所知,我的驱动程序永远不会被加载或使用.这是因为我没有看到我的调试消息(来自我的*_probe函数顶部的printk调用),并且在启动后我没有看到我的模块在lsmod中加载.

看看arch/arm/boot/dts/zynq-zc702.dts文件,看来电路板有一个i2cswitch(compatible ="nxp,pca9548")作为i2c0设备的子节点,以及一个i2c0子节点,并且然后是一个常见的时钟框架驱动程序("silabs,si570").我不知道Raspberry PI上相应的hw架构可能是什么(或者在哪里可以看出来)以支持I2C链中的任意新I2C设备.

问题

  1. PI上是否支持通用时钟框架?

  2. 如何将任意新的I2C设备添加到Raspberry PI设备树? …

c linux linux-kernel device-tree

11
推荐指数
1
解决办法
679
查看次数

如果使用局部变量,则RelayCommand执行委托不起作用

我试图RelayCommand在一个方法中创建一个MVVM Light :

protected RelayCommand NavigateToViewCommand(string viewName) {
#if false
    return new RelayCommand(() => {
        Debug.WriteLine("It fired.");
        Navigation.Navigate(ServiceLocator.Current.GetInstance<IViewLocator>().GetViewForNavigation("StudentPage2"));
    });
#else
    return new RelayCommand(() => {
        Debug.WriteLine("It fired.");
        Navigation.Navigate(ServiceLocator.Current.GetInstance<IViewLocator>().GetViewForNavigation(viewName));
    });
#endif
}
Run Code Online (Sandbox Code Playgroud)

如果我将viewName参数用于执行委托中的方法RelayCommand,则不会触发.我将此命令绑定到一个按钮.当我单击按钮时,甚至Debug.WriteLine命令都不会触发(并且放置在它上面的断点不会中断).

但是,如果我viewName用一个与值中的相同的硬编码字符串替换参数viewName,则RelayCommand工作正常.

请注意,此代码(其中未在按钮中使用该命令)执行时没有问题:

void Test() {
    Command1.Execute(null);
    Command2("David").Execute(null);
}
RelayCommand Command1 { get { return new RelayCommand(() => Debug.WriteLine("cmd1 executed.")); } }
RelayCommand Command2(string msg) { return new RelayCommand(() => Debug.WriteLine("cmd2 executed: " + msg)); …
Run Code Online (Sandbox Code Playgroud)

c# mvvm-light

5
推荐指数
1
解决办法
419
查看次数

MVVM IoC挑战:为此ViewModel工厂接口实现具体类

我正在开发一个Windows Store应用程序,我想使用MVVM,Unity和IoC.我正在努力创建包装Model对象的ViewModel.其他各种帖子都提出了类似的问题,但我认为这是一个略有不同的看法.

我正在尝试创建一个ViewModel工厂服务,我可以将其注入到我的ViewModel中.该工厂的界面可能如下所示:

public interface IViewModelFactoryService {
    TViewModel Create<TViewModel, TModel>(TModel domainObject) 
        where TViewModel : ViewModelBase 
        where TModel : DomainObject;
}
Run Code Online (Sandbox Code Playgroud)

问题是我试图将模型对象传递给ViewModel构造函数并将服务作为附加参数注入.我也试图遵循工厂不应该引用IoC容器的原则,因此在工厂内使用container.Resolve不是一种选择.

使问题复杂化的是,不同的ViewModel当然可以要求不同的服务.我相信解决方案可能涉及使用InjectionFactory(一个Unity对象,它允许您为注册类型配置工厂),但我似乎无法让所有部分都适合.

以下是此工厂需要创建的一些ViewModel构造函数的外观:

FooViewModel(Foo model)
BarViewModel(Bar model, IViewModelFactoryService factory)
BazViewModel(Baz model, IViewModelFactoryService factory, IRepository repository)
Run Code Online (Sandbox Code Playgroud)

下面是使用Unity的InjectionFactory为其中两个ViewModel类创建工厂的示例:

container.RegisterType<Func<Bar, BarViewModel>>(new InjectionFactory(
    c => new Func<Bar, BarViewModel>(
        bar => new BarViewModel(bar, 
            c.Resolve<IViewModelFactoryService>()))))

container.RegisterType<Func<Baz, BazViewModel>>(new InjectionFactory(
    c => new Func<Baz, BazViewModel>(
        baz => new BazViewModel(baz, 
            c.Resolve<IViewModelFactoryService>(), 
            c.Resolve<IRepository>()))))
Run Code Online (Sandbox Code Playgroud)

一旦这些工厂注册了容器,就可以使用以下代码:

barFactory = container.Resolve<Func<Bar, BarViewModel>>();
barViewModel = barFactory(myBar);

bazFactory = container.Resolve<Func<Baz, BazViewModel>>();
bazViewModel = bazFactory(myBaz);
Run Code Online (Sandbox Code Playgroud)

当然,我的最终目标是做到以下几点:

viewModelFactory …
Run Code Online (Sandbox Code Playgroud)

dependency-injection inversion-of-control unity-container mvvm

5
推荐指数
1
解决办法
893
查看次数